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

當選擇雙向混沌或者單向混沌時,會彈出混沌值設置界面,支持自動生成及手動輸入,如下圖所示:

4. 上位機功能實現
-
首先創建一個Windows窗體應用項目,項目名稱為thinger.com.MCUPro。
-
將單片機的協議封裝成一個類MCULib,便於后續直接調用,該類應該具備建立連接、斷開連接、設定速度、接收速度的功能。
-
日志顯示功能:日志顯示采用ListView進行顯示,綁定一個ImageList用來區分信息、報警、錯誤,添加日志方法的參數包含日志等級及日志內容。
-
建立連接和斷開連接:這里通過單按鈕實現建立連接和斷開連接2個功能。
-
設置目標轉速:設置目標轉速僅對電機正轉、電機反轉及電機正反轉這三種模式有效。
-
速度清零:速度清零時要判斷當前模式是否處於混沌模式,如果處於混沌模式,要先將定時器停止,否則直接發送速度為0的命令就行了。
-
混沌模式:當調速方式切換到混沌模式時,將啟用一個定時器,該定時器周期與換速時間一致,定時向MCU中發送速度指令,速度值來源於一個集合,該集合將通過一個子窗體獲取,因此單向混沌與雙向混沌的區別在於集合的不同。
-
混沌速度設置:混沌值設置在一個獨立的窗體中實現,可以通過手動添加、隨機添加或手動輸入的方式,速度值之間通過空格分割,如果手動輸入時,需要注意速度范圍。
-
混沌模式定時發送:混沌模式下如果定時器開啟,將從集合中逐個取出數據發送到MCU中,取完之后停止定時器。
-
數據接收處理:數據接收處理方法也是委托的原型方法,將讀取的字節數組轉換成字符串進行解析,解析獲取到實際轉速后,判斷是否進行速度顯示,如果需要進行速度顯示,則將數據添加到Chart控件中,再判斷是否需要寫入文件,如果需要寫入文件,將實時數據寫入到CSV文件中。
-
實時數據寫入:本案例的實時數據存儲采用CSV的方式,第一次寫入時,會自動創建時間及標題欄,后面不斷地追加數據。軟件會在每次開啟或者重啟寫入文件時,自動按照當前時間創建一個新的文件,因此需要編寫一個寫入CSV的通用方法。
-
軟件打開時保持上次關閉時的狀態:這個功能的實現的思路是通過配置文件來實現,在每次軟件關閉時,將相關信息以配置文件的形式存儲起來,當軟件運行時,再次從配置文件中進行讀取,由於參數較多,因此采用實體類的方式,也是便於后續擴展。
5. 寫在最后
這個項目整體來說難度不是很大,但是很具有代表性,非常適合上位機初學者來練手。很多初學者學習最大的問題就是手頭沒有實際項目,大家可以把這個當做一個實際項目來練手。
【新閣在線教育 服務號:thinger_as,回復 抽獎,獲取精美】

