搜索
bottom↓
回复: 41

开源串口图形界面工具 CDBUS GUI 支持读写数据表、串口打印、IAP、波形显示…

  [复制链接]

出615入1076汤圆

发表于 2021-2-3 19:52:11 | 显示全部楼层 |阅读模式
本帖最后由 dukelec 于 2021-2-4 12:46 编辑

先列举这个工具的一个特点:
某个主控板正在控制从机的时候,可以把 PC 电脑挂到同一条 RS485 总线上,PC 可以读写从机、查看从机打印消息、查看数据波形,完全不干扰现有主板对从机的控制。


项目地址:https://github.com/dukelec/cdbus_gui  (Readme 还在编写中)
mcu 代码参考:https://github.com/dukelec/stepper_motor_controller  (Readme 还没更新,硬件也改板了,過幾天再移植和更新)

代码架构是 python + web,python 和每个 web 页面通过单个 websocket 管道通讯。
web 端是裸 javascript (vanilla, es6), 不需要瞭解特定的前端框架,就可以参与代码修改。也方便拿此 app 当模板做一些产品的专用上位机软件。

mcu 和 python 之间是 cdnet 协议,目前只用到 level 1 格式的最简版本。
python 和 web 之间的协议也是类似 cdnet,地址和端口用任意字符串代替。

cdnet 可以大概参考一下我的老帖子:
The Art of Protocol | 通讯框架,含 IAP、曲线绘制等,步进电机示范工程
https://www.amobbs.com/thread-5741754-1-1.html


运行 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 寄存器。





这是设备页面的 Log 调试,同样可以随便改变大小:
再下面是波形窗口,也支持选择大小。



波形窗口:
每个窗口下面会提示当前选中数据的值,方便且准确。
可以随便打开、关闭某一条曲线,曲线多的时候不容易乱,图中 tc_speed 是关闭状态,但依然会显示数值。
鼠标滚轮可以配合 shift 或者 ctrl 分别对 x 和 y 轴进行缩放,默认是两个轴一起缩放。
支持触摸屏缩放,同样支持 x 和 y 轴不同比例的缩放。
双击恢复默认示图(最大化显示所有数据)。鼠标中键可拖拽平移(触摸板也可以)。
可以设置数据深度,老数据自动删除。方便动态显示数据(示波器效果)。
波形窗口的个数不限。


下面是 IAP 和 寄存器 数据导出和导入:
IAP 支持整体回读验证、设备端计算并返回 crc 进行验证、不验证。
寄存器格式改变后,可以通过导出和导入进行迁移。
日后会一并导出波形数据,譬如你是做电机控制的,可以让客户把他采集到的波形发给你分析,以此远程协助客户调 PID 等参数。


最后是 json 配置,最上面的 reg 是设备上电打印出来的(mcu 端也是自动生成,不用自己填地址、大小和数据类型,不容易出错):
为了方便阅读,有 16 进制数和注释,所以使用的是 json5 格式。
fmt 字符带 [] 的是数组,在一个编辑框显示所有数据。
带 {} 的也是数组,每组占用一个编辑框,每个框内支持多个数据,方便用于结构体数组。


reg_r 和 reg_w 是默认的寄存器分组读写,写不写无所谓,可以在 UI 上编辑。
plot 的数据的 fmt 比较关键,对应两种数据包格式,x1 a1 b1 a2 b2 ... 和 x1 a1 b1 x2 a2 b2 ...
前者是每个包的多组数据之间共享一个 x 轴数据,fmt 首个字符 I 是 x 的格式,表示 uint32_t, 一般是 mcu 里面一个 cnt, 每个 loop 加 1,loop 周期固定,I 后面的数代表 x1 和 x2 之间的差值,从而恢复出 x2 x3 ...
I 后面没有数字的是后者,一个包里面的每一组数据都有一个 x 值,适合 loop 周期变化的场景。


硬件层面普通串口也支持的。
沒有硬件也可以打开上面的所有界面预览,没数据而已。
写这个工具只花了几天,日后会慢慢完善。
json 最後的 jpg 是我接下來搞的 RS485 摄象头,模板占位用,估计也会开源,到时候此 gui 工具会支持画面显示。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2021-2-3 20:00:02 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2021-2-3 20:03:11 | 显示全部楼层
感谢楼主分享

出0入13汤圆

发表于 2021-2-3 20:13:05 | 显示全部楼层
感谢楼主分享

出5入0汤圆

发表于 2021-2-3 21:55:26 来自手机 | 显示全部楼层
感谢开原

出0入0汤圆

发表于 2021-2-3 21:56:18 来自手机 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2021-2-3 22:28:56 | 显示全部楼层
感谢楼主分享

出0入102汤圆

发表于 2021-2-3 22:46:26 来自手机 | 显示全部楼层
感谢开源分享

出0入42汤圆

发表于 2021-2-3 23:17:32 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2021-2-4 00:24:03 | 显示全部楼层

感谢楼主分享

出100入101汤圆

发表于 2021-2-4 00:55:03 来自手机 | 显示全部楼层
厉害,大牛

出0入8汤圆

发表于 2021-2-4 09:04:04 | 显示全部楼层
厉害                 

出125入16汤圆

发表于 2021-2-4 09:52:50 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2021-2-4 09:56:51 | 显示全部楼层
膜拜大神

出0入0汤圆

发表于 2021-2-4 10:25:12 | 显示全部楼层
牛人,没有安装python3后相关的依赖包么?好久没搞python了,今天安装python3.9后发现少一堆玩意儿

出0入4汤圆

发表于 2021-2-4 10:26:59 | 显示全部楼层
大神,又出新东西了,帮顶

出615入1076汤圆

 楼主| 发表于 2021-2-4 10:35:03 | 显示全部楼层
本帖最后由 dukelec 于 2021-2-5 04:28 编辑
alding123 发表于 2021-2-4 10:25
牛人,没有安装python3后相关的依赖包么?好久没搞python了,今天安装python3.9后发现少一堆玩意儿 ...


pip3 install pythoncrc json5 websockets pyserial u-msgpack-python

pycdnet 目錄是 https://github.com/dukelec/pycdnet 手動下載替換一下

提交 Readme.md 的時候會完善 .gitmodules 和 python 依賴,暫時要麻煩你手動操作一下
(python 需要 python3.8 及以上。)

更新:已添加最基本的 readme,用命令 git clone --recurse-submodules https://github.com/dukelec/cdbus_gui.git 可以自動下載,包含 pycdnet

出0入90汤圆

发表于 2021-2-4 10:50:46 | 显示全部楼层
兄弟出品,必属精品,为你点赞。

出0入0汤圆

发表于 2021-2-4 13:41:27 来自手机 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2021-2-4 14:02:45 | 显示全部楼层
用 python + web 来实现,顶一个。
学海无涯

出0入168汤圆

发表于 2021-2-4 14:08:13 来自手机 | 显示全部楼层
感谢分享

出0入8汤圆

发表于 2021-2-4 14:10:39 | 显示全部楼层
点赞,厉害
最后是 json 配置,最上面的 reg 是设备上电打印出来的(mcu 端也是自动生成,不用自己填地址、大小和数据类型,不容易出错):

请教REG信息是如何自动生成的。

出615入1076汤圆

 楼主| 发表于 2021-2-4 15:27:23 | 显示全部楼层
了无 发表于 2021-2-4 14:10
点赞,厉害

请教REG信息是如何自动生成的。


類型字符是通過 _Generic 識別,大小是 sizeof,偏移地址是 offsetof 生成,都是 c 標準自帶的,具體用法參考這個 c 文件最下面的宏和函數:
https://github.com/dukelec/stepp ... w_mdrv/usr/config.c

出0入4汤圆

发表于 2021-2-4 22:43:06 | 显示全部楼层
dukelec 发表于 2021-2-4 10:35
pip3 install pythoncrc json5 websockets pyserial u-msgpack-python

pycdnet 目錄是 https://github.c ...

这种动态实时画图速度较慢吧,能满足1M波行特率,画图的效率能跟得上吗?

出615入1076汤圆

 楼主| 发表于 2021-2-5 00:39:14 | 显示全部楼层
本帖最后由 dukelec 于 2021-2-5 19:13 编辑
kyq_linux 发表于 2021-2-4 22:43
这种动态实时画图速度较慢吧,能满足1M波行特率,画图的效率能跟得上吗?

...


我試了電機 FOC 驅動的電流環波形,20KHz 的 loop,每個 loop 記錄一組數據,每組數據 4 個 float 和 2 個 uint16_t, 可以跟的上。
(因爲目前設置的是 1Mbps,沒上 10Mbps,所以波形是連續 1/3 左右的時間有數據,然後連續 2/3 時間沒數據。)
如果卡的話,還可以把數據深度調小一點。

被你這麼一說,我想到一個問題,現在是每收到一個包更新一次波形,應該限制更新頻率,譬如一秒最多更新幾十次。改了之後深度很大估計也不卡,速率 ≥ 10Mbps 也不怕頂不住。

圖形庫用的是 uPlot: https://github.com/leeoniya/uPlot
主打就是小和快,這是它的示波 demo: https://leeoniya.github.io/uPlot/demos/stream-data.html

出0入0汤圆

发表于 2021-2-5 09:12:06 | 显示全部楼层
感谢楼主分享

出0入85汤圆

发表于 2021-2-5 09:35:30 | 显示全部楼层
好工具,感谢楼主分享

出16370入6733汤圆

发表于 2021-2-5 09:50:20 来自手机 | 显示全部楼层
精华,打赏!

出615入1076汤圆

 楼主| 发表于 2021-2-5 11:39:01 | 显示全部楼层
本帖最后由 dukelec 于 2021-2-5 12:51 编辑
kyq_linux 发表于 2021-2-4 22:43
这种动态实时画图速度较慢吧,能满足1M波行特率,画图的效率能跟得上吗?

...


已经改好提交了,暂时限制在一秒十帧的刷新速度,之前深度开大会卡出错的问题没有了。(我曾经用的其它的 plot 库 (konva) 的内部会控制最大刷新帧率,所以我大意了。)

顺便升级了数据导入和导出功能,现在导出的数据已经包含了波形数据和 log 打印。

另外,昨晚通宵解决了 cdbus bridge 的一个 bug,usb cdc 向电脑发送的最后一个包是 64 字节的时候不能及时送出,需要另外 tx 一个 0 字节的包 flush 一下才行。代码也已经提交。
用 cdbus gui 配置 cdbus bridge 的时候,打开串口那里反而不要选择 cdbus bridge,才能把 bridge 当时普通设备进行配置。同时 local mac 要设置成 0xaa,目标 bridge 的 cdnet ip 则要设置为 80:00:aa

再顺便补充一下,cdnet ip 是参考 ipv6 的概念,方便通过字符串来代表不同的地址(为了效率,mcu 用 3 字节 uint8_t 数组),其定义如下:

  1. /* CDNET address format:
  2. *
  3. *              local link     unique local    multicast
  4. * level0:       00:NN:MM
  5. * level1:       80:NN:MM        a0:NN:MM       f0:MH:ML
  6. *  `-with seq:  88:NN:MM        a8:NN:MM       f8:MH:ML
  7. * level2:       c0:NN:MM
  8. *  `-with seq:  c8:NN:MM
  9. *
  10. * Notes:
  11. *   NN: net_id, MM: mac_addr, MH+ML: multicast_id
  12. */
复制代码


广播和組播也可以用 local link 格式,一般没有必要用 multicast 格式。
一般用 80 开头的就够了,00 开头的主要是为了人肉敲命令裸数据调试的时候可以少一两个字符而已,机器就不建议用了。
unique local 是跨网段的时候才用,譬如有多个网段,每个子网有多个设备。
level2 是用来传输框架外的任意数据,一般用来多台电脑之间传输真正的 tcp/ip 协议,组电脑网络。

cdnet ip 地址可直接映射为标准的 ipv6 地址,这样电脑上可以通过标准 udp 编程和 mcu 互动,mcu 代码不用变,开销非常小,不用跑 ipv6 协议栈。

出615入1076汤圆

 楼主| 发表于 2021-2-5 12:05:26 | 显示全部楼层

谢谢各位的认同,以及阿莫打赏。
顺便提一个小建议,希望论坛可以不注册就可以查看技术区图片,附件可以要求登录下载,
这样,一些文章就方便转发给其他人(一般是商业夥办,而不是其它论坛),
对方可能有帐号,也可能没有,有的时候不太方便问(感觉就像别人发消息给你,不给你说事,先问你在吗),
默认需要截图或者打印 pdf 给对方,不方便。如果可以开放图片浏览,我想引流效果会更好。至少我也愿意提升 vip 等级。
当然,我明白有很多需要顾虑的地方,具体还是坛主决定就好。

出0入0汤圆

发表于 2021-2-5 14:57:07 | 显示全部楼层
好工具,感谢楼主分享,  楼主对485的执著让人敬佩!

出615入1076汤圆

 楼主| 发表于 2021-2-25 18:12:37 | 显示全部楼层
本帖最后由 dukelec 于 2021-2-25 20:04 编辑

最近解了不少 bug,优化了不少细节,加了一些功能。。。

譬如可以编辑两个版本的 Regs R/W 设置,通过 Less 选择框快速切换。
好处是,当寄存器有很多的时候,譬如伺服电机,默认可以读写几乎所有寄存器,但是始能运行后,我们一般只需要改位置、速度等各别信息,选中 Less 后,只有我们关心的寄存器高亮显示,找起来方便,也不容易误操作。
同时,周期读通常也只需要读一直在变的信息,切换到 Less 后,可以提升读的效率。

现在,读写都有颜色指示,正在读写的编辑框颜色比较深,结束之后会有一个浅色尾吧,防止读写太快肉眼看不到。
如果读写出错,会显示红色,直到下一次成功读写。

下面截图,编辑框绿色是周期读,由上到下快速移动,蓝色是我手动点 Write All 触发的写操作,同样是由开头移动到结尾。
这里还有一个小细节,不同的操作(譬如寄存器读、写、IAP 等)可以同时运行,不会相互干扰。



以下是具体的改动描述,中间选中的提交是上一次更新帖子的时间。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出615入1076汤圆

 楼主| 发表于 2021-3-6 21:14:50 | 显示全部楼层
本帖最后由 dukelec 于 2021-3-6 21:26 编辑

CDCAM 已經 OK,開源地址: https://github.com/dukelec/cdcam
實物飛了幾根線,等 v1.1 回來再拍電路板。

受限 STM32G071CBT6 的性能(爲了便宜),800x600 大小的圖片目前是 10 fps,可以發指令觸發拍照。

一條 RS485 可以掛多個攝像頭、電機,非常方便。
又譬如:傳統需要變焦的場合,直接用 2 個不同焦距的定焦攝像頭就好了,反正成本便宜。也不增加接線。





順便提一下,CDBUS_GUI 的 IAP 功能已經改用 hex 文件燒錄,這樣可以一次燒錄多個分段。
也免去了指定地址的麻煩。反過來在 APP 中更新 Bootloader 也不用改配置文件的地址了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2021-3-6 22:19:45 | 显示全部楼层
这个非常酷而且实用。我用vue+js+can工具实现了类似的。现代语言确实很爽!

出0入0汤圆

发表于 2021-3-7 07:37:14 | 显示全部楼层
Python 快速作带图形的系统接口,还是蛮方便的啊

出20入0汤圆

发表于 2021-3-7 17:13:44 | 显示全部楼层
好工具,学习了

出0入0汤圆

发表于 2021-3-7 20:58:40 | 显示全部楼层
谢谢分享

出100入101汤圆

发表于 2021-3-7 21:15:26 来自手机 | 显示全部楼层
牛,全栈大神

出10入18汤圆

发表于 2022-3-31 18:38:24 来自手机 | 显示全部楼层
CD BUS 可以移植到RP2040上面吗?直接我PIO实现CDBUS的仲裁协议

出0入0汤圆

发表于 2022-3-31 18:40:38 来自手机 | 显示全部楼层
不错,牛逼大神

出100入312汤圆

发表于 2022-3-31 19:02:06 来自手机 | 显示全部楼层
学习,收藏

出0入70汤圆

发表于 2022-3-31 19:26:32 | 显示全部楼层
看着很有意思的项目
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-6 14:16

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表