天天看點

[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言

上一節我們已經基本上把超音波硬體的發射和接收子產品全部做好了,接下來我們着手開發一個軟硬結合的基于C#的平面定位軟體!

目錄

一、整體思路

二、效果提前展示

       2-1、軟體部分展示

       2-2、硬體部分展示

三、基于C#的用戶端軟體說明

  3-1、整體架構介紹:

  3-2、部分技術細節介紹

   3-2-1、序列槽操作

   3-2-2、JiSuan函數說明及核心算法介紹

四、階段小結

五、相關連結 

>_<" 如下圖,利用我們上三節開發的超音波發射與接收裝置構成一個:2固定接收頭+1可移動超音波發射頭的平面定位硬體裝置。由上一節我們知道:在一個采樣周期内硬體定位裝置完成2次測距,即圖中的x和y的長度。又因為我們雙接收子產品部分兩個接收頭的距離是固定的L,是以我們可以根據數學公式求出移動頭的具體坐标,然後在PC上進行仿真。

[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言

2-1、軟體部分展示:

>_<" 模式一:用來動态擷取下位機測得x和y資料經過幾何運算将硬體結構映射到FORM視窗中,實作動态仿真。這裡:COM3處表示接收子產品所連接配接的序列槽為COM3;右邊的四個資料分别表示所測實時的x,y的長度,以及序列槽緩沖區的有效資料剩餘q(用棧來實作),和所有采集到的有效點轉換為FORM中坐标點的隊列大小(用隊列來實作)。

[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言

>_<" 模式二:每次獲得新的有效點時連接配接上一次的點和這一次的點形成活動端的移動路徑展示效果。(這裡由于從原始資料到FORM上坐标轉換時放大了7倍,是以波動比較大,其實精度是在1cm左右波動的。

[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言

2-2、硬體部分展示:

>_<" 1個發送頭(即可移動頭)+2個接收頭[在這節中要把兩個接收頭并排固定間距為14cm,即L的長度]

[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言
[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言

>_<" 超音波發送子產品內建電路+超音波接收子產品內建電路

[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言
[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言

>_<" 硬體整體圖(注意這裡再次強調接收頭要并排固定相距14cm!嘿嘿,由于晚上寫的,俺的手機又太渣,30萬像素Java機,也稱“學霸機”,就不能把最新的固定好的圖發給大家看了!)

[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言

3-1、整體架構介紹:

>_<" 如下圖:上位機程式構成很簡單,初始化函數DrawHS()進行獲得目前可用序列槽、執行個體化并挂起用于資料處理的線程、啟動定時器用于周期性重新整理螢幕。①當使用者選中超音波接收子產品所對應的序列槽并成功連接配接後,原始資料的到來會觸發序列槽資料接收函數執行來接收資料,這裡接收來的資料儲存在Q的棧裡;②然後JiSuan線程會提取棧内的最新資料進行處理,并把得出的有效轉化為FORM平面的點放入P的點集隊列裡;③定時器的定時重新整理周期到來會根據上面的計算來重繪目前界面。這裡模式一和模式二按鈕決定采用Draw1()函數還是Draw2()函數進行繪圖。

[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言

3-2、部分技術細節介紹

3-2-1、序列槽操作

>_<" 首先,你得在FORM中加入一個ComboBox,命名為PortList,即:下拉COM口選擇框。

>_<" 其次,你得有個SerialPort控件,命名為serialPort1,即:C#提供的序列槽對象。

>_<" 那麼,在初始化函數中寫入如下代碼獲得目前可用序列槽并加入ComboBox中,注意最後一句:表示如果有可用序列槽,預設選擇第一個。

<a></a>

&gt;_&lt;" 接下來,對于序列槽的連接配接就比較簡單了。如本工程,當你從ComboBox中選擇一個序列槽時,然後點選連接配接按鈕進行連接配接,那麼連接配接按鈕就是負責序列槽連接配接功能:這裡根據連接配接按鈕的狀态判斷目前連接配接情況,當有連接配接時,點選連接配接按鈕表示斷開連接配接;當沒有連接配接時,點選連接配接按鈕,則會連接配接從ComboBox中選中的序列槽。這裡要注意(20行):由于序列槽資料接收屬于觸發事件,有資料到緩沖區才會觸發并接收資料,這裡執行個體化一個序列槽資料接收句柄就是負責響應觸發接收資料的函數,即:PortDataReceived~

&gt;_&lt;" 如上面介紹,每當序列槽有資料傳來就會觸發該函數執行來接收序列槽緩沖區資料。這裡的第6行即是從序列槽緩沖區讀取length長的資料放入data數組中,0表示放入data[0]開始。下面8、9兩行即把原始資料壓入棧給JiSuan線程處理。

3-2-2、JiSuan函數說明及核心算法介紹

&gt;_&lt;" 如下圖,原始資料轉換為FORM坐标系下移動端的坐标(x,y)的求法:首先利用三角函數根據原始資料計算出a,b的值,然後根據一定比例放大a,b值再根據坐标關系求出FORM坐标系下的移動點(x,y)的坐标。

[自娛自樂] 4、超音波測距子產品DIY筆記(四)——終結篇·基于C#上位機軟體開發前言

&gt;_&lt;" 當了解上述計算轉換過程,下面的代碼便不難了解。這個JiSuan的函數其實是個資料處理的線程,一直處于while循環下,當棧Q中存在待處理原始資料時,則取出原始資料,判斷原始資料是否正确合理,如果合理則分别找出data_x和data_y的值,即原始值(這裡,由于下位機發送過來data_x和data_y的順序先後不定,于是在下位機中将data_y的資料取相反數發送過來,是以在這裡能夠巧妙地區分)。接下來就是采用上述所述方法進行計算移動點的FORM坐标系下的坐标了。這裡的Show字元串是為了儲存最初您看到的顯示的x:23 y:21 q:0 p:123資訊。

&gt;_&lt;" 經過這四小節的學習,從最初的想法到如今的實作,收獲頗豐!對于模拟電路有了更深刻的認識,對于51單片機的應用有個進一步的提高,對于PC上位機的開發也有了新的了解和體會。可以說,硬體的難在于其變化性,即使是絕美的方案也會出現真實世界莫名因素的影響,讓你頭大;軟體的難在于邏輯之難,本項目雖小,但是用了多線程的思維,裡面隐隐涉及到線程同步和死鎖的問題,隻是有些錯誤在調試階段已經被淘汰,大家在這個最終的方案下也就無法想象原初的各種死鎖、運作時中斷、遲緩等問題了。此外,可能是前三篇過于偏向于硬體,是以大家可能不會理睬,但是如果您真的對該篇文章感興趣的話,還是建議您仔細閱讀下前三篇的介紹,畢竟這個過程中硬體幾乎占了大半個江山呢~其實,本來的想法是:第一階段把這個做成個平面定位的類似于電子白闆的觸控子產品,第二階段把這個做成三接收頭的空間三維定位裝置,結合目前體感遊戲、手勢識别等開發出更有意義的産品,但是在研究的過程中發現超音波定位其本身存在不可忽視的缺點,容易反射互相幹擾等,接下來的想法造成了本質性的阻礙。由于最近學業較忙,是以這個超音波的研究就暫且為止!最後,感謝大家的支援!

本文轉自beautifulzzzz部落格園部落格,原文連結:http://www.cnblogs.com/zjutlitao/p/4086237.html,如需轉載請自行聯系原作者