嵌入式設備開發調試過程中,需要使用上位機查看設備狀態,下達指令。使用曲線實現狀態可視化,記錄數據事后分析等功能能夠大大提高開發調試效率。
而不同的嵌入式設備,不同的項目,需要上位機控制的量完全不同,導致基本上每塊電路都需要自己的上位機,這個工作量是難以承擔的。實際項目中經常使用串口助手、串口數據曲線顯示等通用工具,實現調試。但功能和通用性略差
所以需要一款通用上位機,能夠盡可能廣泛的適應各種項目,各種設備的調試工作。
1. 通過文本行方式對設備進行測控,包括狀態上報和指令下達。協議易於描述
2. 上傳狀態和下發指令的界面都通過配置文件描述,所以上位機可以在各項目間通用。
3. 不僅實現曲線顯示、變量顯示、指令下達,還顯示是否有數據刷新、指令是否有回復,回復是否正確
4. 曲線顯示不僅是圖形,還通過游標實現特定位置的值顯示、兩點測距功能、區域縮放功能
5. 具有數據記錄/回放、曲線導出/導入功能
例如如下幾個項目中的上位機:



均由本通用上位機軟件的不同配置而成
項目地址:
測控UI功能
界面曲線顯示區、傳感值顯示區、基礎控制區和配置控制區,對參數的顯示包括:
1. 傳感數值型:顯示名稱、數值、最近是否收到過數據、選擇是否顯示曲線
2. 控制數值型:顯示名稱、期望值、結果是否成功
3. 控制指令:顯示名稱、結果是否成功
4. 開關型:顯示名稱、狀態、最近是否收到過數據,無論當前狀態是開還是關,都可以下達開和關的指令(即使在開的狀態也可以下達開的指令)
5. 參數型:顯示名稱、期望、當前值、最近是否收到過數據
曲線功能
1. 上位機為多個傳感值顯示曲線,每個曲線可實時選擇顯示、隱藏
2. 曲線具有統一的縱坐標,橫坐標可以使用次數和時間兩種
3. 曲線可按一定長度循環顯示,可長期實時顯示
4. 曲線可保存、加載歷史曲線
5. 曲線顯示界面可使用鼠標左鍵拖動框選一定的區域放大顯示
6. 曲線顯示界面可使用鼠標滾輪實現縮放
7. 曲線顯示界面可使用鼠標右鍵拖動平移
數據源
上位機的數據源可以是串口、網絡、日志回放等方式,以相同的方法實現數據輸入、輸出。
上位機選擇數據源,實現“打開”“關閉”操作,以方便的實現對端口的占用和釋放
數據源端口的配置在配置文件中,以免對UI造成不必要的需求
通用數據協議
使用類nmea協議的形式,作為上位機的標准協議,其他協議使用適配器來適配。例如,下位機使用二進制協議時,上位機通過C語言dll外擴適配器,將文本協議轉換為二進制協議與下位機交互。所以,上位機只需實現通用文本協議即可實現所有測控協議需求。
協議規定:
- 數據由文本組成,文本分行,行分列。
- 每一行數據可以是不同的數據包類型,通過列數量或第一列文本決定數據包類型
- 使用行(\n)作為數據包的分割,對於指令,使用空格或tab作為參數的分割符。對於測量變量,使用空格、逗號、tab作為分隔符
- 行首第一列可以作為普通數據,也可作為協議標志,以$開頭,接接協議名稱。
例如:
1 2 3 4 5 6 7 是一個7列數據,若系統中沒有其他數據包是7列,則可以通過列數唯一確定這個數據包類型
$r,OK 是一個2列數據,第一列以$開頭,則“r”為協議名稱,通過“r”確定這個數據包的類型
規定:
指令配置時,可通過寫入\n來做多個指令
$開頭的是與插件或下位機約定的文本協議
^開頭的是軟件自身控制協議:
^clear 清除當前數據
^x_axis 總電壓 x軸的索引,只有收到此變量后才增加曲線x軸坐標,若為空,則使用時間ms數作為x軸
例如,要配置一個udp傳輸的數據控制鏈路:
設備發送的上行數據,為一行文本,共9列:

其中狀態字為二進制,按bit定義,例如:bit0表示增益切換,bit1表示蜂鳴,bit2表示指示激光開關等
1、通過配置文件配置udp端口:
1 { 2 "type":"udp", //數據源類型:udp 3 "name":"udp1", 4 "ip" : "127.0.0.1", "port" : 12345, 5 "rmt_ip" : "127.0.0.1", "rmt_port" : 12346 6 },
可以看到界面上數據源中有剛配置的udp數據源:udp1
2、通過配置文件配置傳感變量
需要描述要傳感的變量名稱、協議,以及變量在協議中的位置。另外,可配置此變量是否默認繪制曲線、顯示小數點位數等
1 "dset": 2 [ 3 { "name":"濃度","prot_l":9,"prot_off":0, "is_cv":"true"}, 4 { "name":"信噪比","prot_l":9,"prot_off":2}, 5 { "name":"信號強度","prot_l":9,"prot_off":3}, 6 { "name":"期望溫度","prot_l":9,"prot_off":4}, 7 { "name":"溫度","prot_l":9,"prot_off":5, "is_cv":"true"}, 8 { "name":"板溫","prot_l":9,"prot_off":6}, 9 { "name":"采樣值","prot_l":1,"prot_off":0, "is_cv":"true"}, 10 { "name":"模式","dtype":"str","prot_l":9,"prot_off":8, 11 "stype":"hex","pro_method":"pro_bit","pro_bit":9,"end_bit":10, 12 "str_tab":["控溫","找峰","測量","調試"]}, 13 { "name":"溫控","dtype":"str","prot_l":9,"prot_off":8,"is_dis":"false", 14 "stype":"hex","pro_method":"pro_bit","pro_bit":15}, 15 { "name":"調制輸出","dtype":"str","prot_l":9,"prot_off":8,"is_dis":"false", 16 "stype":"hex","pro_method":"pro_bit","pro_bit":6}, 17 { "name":"指令結果","dtype":"str","prot_name":"$r","prot_l":2,"prot_off":1, 18 "stype":"str","str_tab":["err","OK"]}, 19 {"name":"i_off","prot_l":2,"prot_name":"$@:3:1:0:16","prot_off":1,"pro_k":0.1,"is_dis":"false"}, 20 //參數 21 {"name":"uid","prot_l":2,"prot_name":"$@:3:2:0:0","prot_off":1,"is_dis":"false"}, 22 {"name":"tpid_p","prot_l":2,"prot_name":"$@:3:2:6:0","prot_off":1,"is_dis":"false"} 23 ],
傳感變量的name是唯一的,傳感變量在協議中的位置,例如,"prot_l":9表示此變量在有9個列的行數據中提取,"prot_off":2表示此變量是其中的第3列。
傳感變量的類型包括:浮點,字符,hex,整數
處理方法包括:線性處理(pro_val),按位處理(pro_bit)
傳感量可按數值顯示,也可按字符顯示,通過配置str_tab,輸入值查表得到字符,用於顯示模式、錯誤等。
配置結果:

3、通過配置文件配置指令
指令通過按鈕等控件在界面上顯示,可配置控件的類型和位置,以及點擊按鈕后發送的指令。
支持的指令控件包括:
1 public enum CmdType //指令類型 2 { 3 bt, //按鍵 4 text, //文本框 5 sw, //開關 6 rpl_bool, //帶回復的指令 7 label, //文本控件 8 para, //參數型 9 }
配置案例:
1 "cmds": 2 [ 3 {"name":"開數據","cmd":"s 1\n^x_axis","type":"bt"}, 4 {"name":"關數據","cmd":"s 0","type":"bt"}, 5 {"name":"顯示原始","cmd":"oa 1\ns 0\n^clear\n^x_axis 采樣值","type":"bt"}, 6 {"name":"溫度期望","cmd":"st","type":"bt","suffixname":"tb_exp_T","repeat_T":5}, 7 {"name":"tb_exp_T","type":"text","dft":"25"}, 8 {"name":"0~35℃","type":"label"}, 9 {"name":"直流電流","cmd":"si","type":"bt","suffixname":"tb_i"}, 10 {"name":"tb_i","type":"para","dft":"80","cmd":"@ 0,1,0,16,0","refdname":"i_off"}, 11 {"name":"直流偏移","cmd":"i_off","type":"bt","suffixname":"tb_i"}, 12 {"name":"標0","refdname":"指令結果","cmd":"cali 0","type":"rpl_bool"}, 13 {"name":"","type":"label"}, 14 {"name":"","type":"label"}, 15 {"name":"溫控","refdname":"溫控","dft":"開", 16 "cmd":"outc 1","cmdoff":"outc 0","type":"sw","c_span":2}, 17 {"name":"調制輸出","refdname":"調制輸出","dft":"開", 18 "cmd":"isw 1","cmdoff":"isw 0","type":"sw","c_span":2} 19 ],
顯示效果:
此圖為無數據刷新的狀態。點擊按鈕后,發送此按鈕配置對應的指令,指令中可引用文本框控件的內容,作為指令的參數。
參數控件支持查詢設備中的變量
4、通過配置文件配置參數
同指令配置,在菜單欄也有一個區域能夠配置下行指令,一般用於放置設備可保存的參數
1 "menu_cmd": 2 [ 3 {"name":"tpid_p","cmd":"@ 1,2,0,0,","type":"bt","suffixname":"tb_uid"}, 4 {"name":"tb_tpid_p","type":"para","dft":"80","cmd":"@ 0,2,0,6,0","refdname":"tpid_p"} 5 ], 6 "menu_name":"參數"
效果:
5、打開上位機,打開數據源,查看傳感數據

傳感變量有數據刷新時變綠,控制控件有數據刷新時會變亮。
6、保存數據、曲線
保存曲線指保存曲線控件中的數據,保存為csv文件。加載曲線時,加載csv文件

文件頭部第一行為列描述,加載csv文件時,提取文件頭的列名,與軟件中配置的變量對比,若都能夠匹配,則顯示。
軟件可記錄原始數據,勾選記錄原始數據后,原始數據記錄在data目錄下,以時間為文件名,按小時切分文件。
原始數據文件的每一行行首,添加時間戳,格式為:分、秒、毫秒

回放數據時,軟件通過時間戳進行回放
7、回放數據
在軟件數據源選擇時,選擇回放數據源,通過文件選擇對話框選擇要回放的數據
軟件回放過程與其他數據源完全一致,變量與控制控件收到數據刷新后變綠
回放對話框實現:
至首/上一行/暫停恢復/下一行/至尾 等功能
回放時可選擇不同的倍速