通用上位机 串口曲线显示工具 udp控制软件
嵌入式设备开发调试过程中,需要使用上位机查看设备状态,下达指令。使用曲线实现状态可视化,记录数据事后分析等功能能够大大提高开发调试效率。
而不同的嵌入式设备,不同的项目,需要上位机控制的量完全不同,导致基本上每块电路都需要自己的上位机,这个工作量是难以承担的。实际项目中经常使用串口助手、串口数据曲线显示等通用工具,实现调试。但功能和通用性略差
所以需要一款通用上位机,能够尽可能广泛的适应各种项目,各种设备的调试工作。
1. 通过文本行方式对设备进行测控,包括状态上报和指令下达。协议易于描述
2. 上传状态和下发指令的界面都通过配置文件描述,所以上位机可以在各项目间通用。
3. 不仅实现曲线显示、变量显示、指令下达,还显示是否有数据刷新、指令是否有回复,回复是否正确
4. 曲线显示不仅是图形,还通过游标实现特定位置的值显示、两点测距功能、区域缩放功能
5. 具有数据记录/回放、曲线导出/导入功能
例如如下几个项目中的上位机:
![](https://img2020.cnblogs.com/blog/847279/202112/847279-20211212171359587-1753618598.jpg)
![](https://img2020.cnblogs.com/blog/847279/202112/847279-20211212171434664-1333342640.jpg)
![](https://img2020.cnblogs.com/blog/847279/202112/847279-20211212171445084-386351358.jpg)
均由本通用上位机软件的不同配置而成
项目地址:
测控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列:
![](https://img2020.cnblogs.com/blog/847279/202112/847279-20211212172030502-1275669864.png)
其中状态字为二进制,按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,输入值查表得到字符,用于显示模式、错误等。
配置结果:
![](https://img2020.cnblogs.com/blog/847279/202112/847279-20211212172539115-1297827092.png)
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、打开上位机,打开数据源,查看传感数据
![](https://img2020.cnblogs.com/blog/847279/202112/847279-20211212173946698-747636368.jpg)
传感变量有数据刷新时变绿,控制控件有数据刷新时会变亮。
6、保存数据、曲线
保存曲线指保存曲线控件中的数据,保存为csv文件。加载曲线时,加载csv文件
![](https://img2020.cnblogs.com/blog/847279/202112/847279-20211212174919987-1904022499.png)
文件头部第一行为列描述,加载csv文件时,提取文件头的列名,与软件中配置的变量对比,若都能够匹配,则显示。
软件可记录原始数据,勾选记录原始数据后,原始数据记录在data目录下,以时间为文件名,按小时切分文件。
原始数据文件的每一行行首,添加时间戳,格式为:分、秒、毫秒
![](https://img2020.cnblogs.com/blog/847279/202112/847279-20211212175233380-531279579.png)
回放数据时,软件通过时间戳进行回放
7、回放数据
在软件数据源选择时,选择回放数据源,通过文件选择对话框选择要回放的数据
软件回放过程与其他数据源完全一致,变量与控制控件收到数据刷新后变绿
回放对话框实现:
至首/上一行/暂停恢复/下一行/至尾 等功能
回放时可选择不同的倍速