先列举这个工具的一个特点:
某个主控板正在控制从机的时候,可以把 PC 电脑挂到同一条 RS485 总线上,PC 可以读写从机、查看从机打印消息、查看数据波形,完全不干扰现有主板对从机的控制。
项目地址:https://github.com/dukelec/cdbus_gui
跨平臺,支持 Linux、Windows、MacOS、樹莓派 ……
mcu 代码及协议参考这个开源步进电机驱动器:https://github.com/dukelec/stepper_motor_controller
此工具代码架构是 python + web,python 和每个 web 页面通过单个 websocket 管道通讯。
web 端是裸 javascript (vanilla, es6), 不需要瞭解特定的前端框架,就可以参与代码修改。也方便拿此 app 当模板做一些产品的专用上位机软件。
mcu 和 python 之间是 cdnet 协议,目前只用到 level 1 格式的最简版本。
python 和 web 之间的协议也是类似 cdnet,地址和端口用任意字符串代替。
运行 python 程序后,首先打开主页:
Available 列出电脑所有串口,只要粘贴其中任意一小段字符串,填到 Serial 第一个输入框就可以了,这样的好处是,如果端口变化,依然可以打开正确的串口。或者是选择插在指定 USB 口的串口。
使用过程中,串口掉线会自动重连接,右边是 python 后台打印:插拔之后又成功重接。
Devices 主要是选择调试哪一个从机,支持同时调试多个设备,数量不限。
Logs 是所有设备的打印汇总,每个设备各自的页面只打印各自的调试信息。
打印支持彩色 (ANSI), 和 Linux 下的终端一样,方便在很多 log 中快速定位错误。
Logs 窗口可以随意调整大小。
编辑的数据都会自动保存。
下面是具体打开一个设备的调试窗口,首先是数据列表读写(俗称寄存器):
鼠标放到寄存器名称和数据上,会分别提示寄存器说明,和默认数据(默认数据也是从设备中读取)。
寄存器的读写是按组进行,可以保证一组数据的原子性。
组可以随便编辑。
点某一组的 R 会读该组所有数据,W 则是写一组数据。点最上面的 Read All 和 Write All 则是依次读写每一组。
列表是由不同设备的 json 文件配置,其中寄存器列表是设备上电自动打印出来的,拷贝粘贴到 json 模板中即可。
支持数组和多种数据格式,可以设置是否以 16 进制显示(数据框带 H 标记),或者是 uint8_t 数组(带 B 标记)。
同一个组内部,有一些带一个小凹槽,表示两个寄存器之间有空洞。首次写入前会回读该组数据,避免修改空洞中的数据,空洞可能是空的,也可能是厂商 reserved 寄存器。
再顺便补充一下,cdnet ip 是参考 ipv6 的概念,方便通过字符串来代表不同的地址(为了效率,mcu 用 3 字节 uint8_t 数组),其定义如下:
/* CDNET address format:
*
* local link unique local multicast
* level0: 00:NN:MM
* level1: 80:NN:MM a0:NN:MM f0:MH:ML
* `-with seq: 88:NN:MM a8:NN:MM f8:MH:ML
* level2: c0:NN:MM
* `-with seq: c8:NN:MM
*
* Notes:
* NN: net_id, MM: mac_addr, MH+ML: multicast_id
*/
广播和組播也可以用 local link 格式,一般没有必要用 multicast 格式。
一般用 80 开头的就够了,00 开头的主要是为了人肉敲命令裸数据调试的时候可以少一两个字符而已,机器就不建议用了。
unique local 是跨网段的时候才用,譬如有多个网段,每个子网有多个设备。
level2 是用来传输框架外的任意数据,一般用来多台电脑之间传输真正的 tcp/ip 协议,组电脑网络。
cdnet ip 地址可直接映射为标准的 ipv6 地址,这样电脑上可以通过标准 udp 编程和 mcu 互动,mcu 代码不用变,开销非常小,不用跑 ipv6 协议栈。
---------------------
作者:dukedz
链接:https://bbs.21ic.com/icview-3113306-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。