上位機(jī)開(kāi)發(fā)之單片機(jī)通信實(shí)踐案例
? ? ? 最近有越來(lái)越多做電氣的小伙伴開(kāi)始學(xué)習(xí)C#來(lái)做上位機(jī)開(kāi)發(fā),很多人在學(xué)習(xí)一段時(shí)間后,都有這種感覺(jué),似乎學(xué)到了很多知識(shí),但是不知道怎么應(yīng)用,因此我找了一個(gè)真實(shí)的上位機(jī)小項(xiàng)目,讓大家來(lái)練練手。這篇文章主要對(duì)這個(gè)項(xiàng)目案例及開(kāi)發(fā)過(guò)程做個(gè)整體介紹。
1. 項(xiàng)目案例介紹
????????很多人對(duì)單片機(jī)有一種特殊的情懷,總是感覺(jué)單片機(jī)很神秘或很復(fù)雜。單片機(jī)簡(jiǎn)稱(chēng)MCU,即Micro Control Unit,是將CPU、存儲(chǔ)器(RAM和ROM)、多種IO接口等集成在一塊芯片上,形成一個(gè)芯片級(jí)計(jì)算機(jī),可以這么說(shuō),在我們的生活和工作中,單片機(jī)無(wú)處不在。
????????單片機(jī)MCU的使用分為兩種,一種是單片機(jī)開(kāi)發(fā),就是嵌入式開(kāi)發(fā),一般采用C語(yǔ)言編程,另一種是單片機(jī)應(yīng)用,比如和單片機(jī)進(jìn)行通信控制,而作為上位機(jī)開(kāi)發(fā)人員,我們更多偏向于后者,上位機(jī)按照既定的協(xié)議對(duì)單片機(jī)實(shí)現(xiàn)控制??刂葡到y(tǒng)的使用者是操作人員,他們不可能去直接操作單片機(jī),因此上位機(jī)的職責(zé)是將單片機(jī)和操作人員聯(lián)系起來(lái),通過(guò)UI界面給操作人員提供展示和控制,再將指令傳遞給單片機(jī)來(lái)執(zhí)行動(dòng)作,最終形成一套完整的控制系統(tǒng)。
????????本案例是一個(gè)基于單片機(jī)的串口通信案例,主要是通過(guò)上位機(jī)來(lái)實(shí)現(xiàn)對(duì)電機(jī)的速度控制,并顯示電機(jī)實(shí)時(shí)速度。調(diào)速模式會(huì)有多種,包括電機(jī)正轉(zhuǎn)、電機(jī)反轉(zhuǎn)、電機(jī)正反轉(zhuǎn)、雙向混沌、單向混沌五種模式。
2. MCU協(xié)議分析
針對(duì)五種調(diào)速模式的描述如下所示:
調(diào)速模式調(diào)速說(shuō)明電機(jī)正轉(zhuǎn)發(fā)送一個(gè)大于0的速度給單片機(jī)電機(jī)反轉(zhuǎn)發(fā)送一個(gè)小于0的速度給單片機(jī)電機(jī)正反轉(zhuǎn)發(fā)送一個(gè)速度正負(fù)值及換速時(shí)間給單片機(jī)單向混沌隨機(jī)或手動(dòng)生成N個(gè)的隨機(jī)正數(shù),定時(shí)發(fā)送給單片機(jī)雙向混沌隨機(jī)或手動(dòng)生成N個(gè)隨機(jī)自然數(shù),定時(shí)發(fā)送給單片機(jī)
從上面的描述,我們可以看出,調(diào)速的本質(zhì)都是發(fā)送報(bào)文給單片機(jī),不同的調(diào)速模式影響的是發(fā)送的數(shù)值和發(fā)送的頻率,因此上位機(jī)和單片機(jī)之間必須要約定協(xié)議,協(xié)議如下所示:
功能命令協(xié)議格式備注電機(jī)正轉(zhuǎn)S+速度值+;速度值必須為正數(shù),如S+40;電機(jī)正轉(zhuǎn)S+速度值+;速度值必須為負(fù)數(shù),如S-40;電機(jī)正反轉(zhuǎn)T+時(shí)間+S+速度值+;時(shí)間為換速時(shí)間,如T5+-40;單向混沌S+速度值+;速度值為正數(shù),生成隨機(jī)數(shù),定時(shí)發(fā)送雙向混沌S+速度值+;速度值為自然數(shù),生成隨機(jī)數(shù),定時(shí)發(fā)送速度反饋V+速度值+;返回的速度值,如V+40;速度清零S+速度值+;速度值設(shè)為0,即S+0;或者S-0;
協(xié)議規(guī)定:?jiǎn)纹瑱C(jī)與上位機(jī)之間的通信格式為:波特率9600,數(shù)據(jù)位8,停止位1,校驗(yàn)位無(wú),設(shè)定速度范圍為10-300rpm,反饋速度范圍為0-1000rpm,換算時(shí)間范圍為1-10秒,通信編碼格式為ASCII。
上位機(jī)開(kāi)發(fā)功能要求:
與單片機(jī)之間的連接提示及斷開(kāi)提示
可以自由選擇通訊端口
調(diào)試模式可以隨時(shí)調(diào)整
混沌模式隨機(jī)數(shù)支持自動(dòng)生成和人為輸入/復(fù)制粘貼
支持換速時(shí)間快速設(shè)置
支持實(shí)時(shí)速度顯示并可控
支持實(shí)時(shí)數(shù)據(jù)寫(xiě)入并可控
支持發(fā)送命令可存儲(chǔ)、可追溯
軟件打開(kāi)時(shí)保持上次關(guān)閉時(shí)的狀態(tài)
3. 上位機(jī)界面設(shè)計(jì)
根據(jù)開(kāi)發(fā)功能要求,整體設(shè)計(jì)界面如下圖所示:

當(dāng)選擇雙向混沌或者單向混沌時(shí),會(huì)彈出混沌值設(shè)置界面,支持自動(dòng)生成及手動(dòng)輸入,如下圖所示:

4. 上位機(jī)功能實(shí)現(xiàn)
首先創(chuàng)建一個(gè)Windows窗體應(yīng)用項(xiàng)目,項(xiàng)目名稱(chēng)為thinger.com.MCUPro。
將單片機(jī)的協(xié)議封裝成一個(gè)類(lèi)MCULib,便于后續(xù)直接調(diào)用,該類(lèi)應(yīng)該具備建立連接、斷開(kāi)連接、設(shè)定速度、接收速度的功能。
日志顯示功能:日志顯示采用ListView進(jìn)行顯示,綁定一個(gè)ImageList用來(lái)區(qū)分信息、報(bào)警、錯(cuò)誤,添加日志方法的參數(shù)包含日志等級(jí)及日志內(nèi)容。
建立連接和斷開(kāi)連接:這里通過(guò)單按鈕實(shí)現(xiàn)建立連接和斷開(kāi)連接2個(gè)功能。
設(shè)置目標(biāo)轉(zhuǎn)速:設(shè)置目標(biāo)轉(zhuǎn)速僅對(duì)電機(jī)正轉(zhuǎn)、電機(jī)反轉(zhuǎn)及電機(jī)正反轉(zhuǎn)這三種模式有效。
速度清零:速度清零時(shí)要判斷當(dāng)前模式是否處于混沌模式,如果處于混沌模式,要先將定時(shí)器停止,否則直接發(fā)送速度為0的命令就行了。
混沌模式:當(dāng)調(diào)速方式切換到混沌模式時(shí),將啟用一個(gè)定時(shí)器,該定時(shí)器周期與換速時(shí)間一致,定時(shí)向MCU中發(fā)送速度指令,速度值來(lái)源于一個(gè)集合,該集合將通過(guò)一個(gè)子窗體獲取,因此單向混沌與雙向混沌的區(qū)別在于集合的不同。
混沌速度設(shè)置:混沌值設(shè)置在一個(gè)獨(dú)立的窗體中實(shí)現(xiàn),可以通過(guò)手動(dòng)添加、隨機(jī)添加或手動(dòng)輸入的方式,速度值之間通過(guò)空格分割,如果手動(dòng)輸入時(shí),需要注意速度范圍。
混沌模式定時(shí)發(fā)送:混沌模式下如果定時(shí)器開(kāi)啟,將從集合中逐個(gè)取出數(shù)據(jù)發(fā)送到MCU中,取完之后停止定時(shí)器。
數(shù)據(jù)接收處理:數(shù)據(jù)接收處理方法也是委托的原型方法,將讀取的字節(jié)數(shù)組轉(zhuǎn)換成字符串進(jìn)行解析,解析獲取到實(shí)際轉(zhuǎn)速后,判斷是否進(jìn)行速度顯示,如果需要進(jìn)行速度顯示,則將數(shù)據(jù)添加到Chart控件中,再判斷是否需要寫(xiě)入文件,如果需要寫(xiě)入文件,將實(shí)時(shí)數(shù)據(jù)寫(xiě)入到CSV文件中。
實(shí)時(shí)數(shù)據(jù)寫(xiě)入:本案例的實(shí)時(shí)數(shù)據(jù)存儲(chǔ)采用CSV的方式,第一次寫(xiě)入時(shí),會(huì)自動(dòng)創(chuàng)建時(shí)間及標(biāo)題欄,后面不斷地追加數(shù)據(jù)。軟件會(huì)在每次開(kāi)啟或者重啟寫(xiě)入文件時(shí),自動(dòng)按照當(dāng)前時(shí)間創(chuàng)建一個(gè)新的文件,因此需要編寫(xiě)一個(gè)寫(xiě)入CSV的通用方法。
軟件打開(kāi)時(shí)保持上次關(guān)閉時(shí)的狀態(tài):這個(gè)功能的實(shí)現(xiàn)的思路是通過(guò)配置文件來(lái)實(shí)現(xiàn),在每次軟件關(guān)閉時(shí),將相關(guān)信息以配置文件的形式存儲(chǔ)起來(lái),當(dāng)軟件運(yùn)行時(shí),再次從配置文件中進(jìn)行讀取,由于參數(shù)較多,因此采用實(shí)體類(lèi)的方式,也是便于后續(xù)擴(kuò)展。
5. 寫(xiě)在最后
????????這個(gè)項(xiàng)目整體來(lái)說(shuō)難度不是很大,但是很具有代表性,非常適合上位機(jī)初學(xué)者來(lái)練手。很多初學(xué)者學(xué)習(xí)最大的問(wèn)題就是手頭沒(méi)有實(shí)際項(xiàng)目,大家可以把這個(gè)當(dāng)做一個(gè)實(shí)際項(xiàng)目來(lái)練手。