通用上位机 串口曲线显示工具 udp控制软件

嵌入式设备开发调试过程中,需要使用上位机查看设备状态,下达指令。使用曲线实现状态可视化,记录数据事后分析等功能能够大大提高开发调试效率。  
而不同的嵌入式设备,不同的项目,需要上位机控制的量完全不同,导致基本上每块电路都需要自己的上位机,这个工作量是难以承担的。实际项目中经常使用串口助手、串口数据曲线显示等通用工具,实现调试。但功能和通用性略差  
 
所以需要一款通用上位机,能够尽可能广泛的适应各种项目,各种设备的调试工作。  
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、回放数据

 在软件数据源选择时,选择回放数据源,通过文件选择对话框选择要回放的数据

软件回放过程与其他数据源完全一致,变量与控制控件收到数据刷新后变绿

 

 

 回放对话框实现:

  至首/上一行/暂停恢复/下一行/至尾 等功能

回放时可选择不同的倍速

 

 

 

 

 

 

 

 

 

posted on 2021-12-12 18:04  yangzifb  阅读(2383)  评论(0编辑  收藏  举报