在调试串口通信的时候最怕的就是出现“断包”、“粘包”。
数据一多,帧头还没有拼完,下一帧又挤进来,界面卡死、数据丢一半。
Modbus RTU、自定义协议等每一种封装规则都要单独处理。
ATE 设备上行数据速率一般为 10kHz 以上,传统的界面一运行高频,波形图就变成一条直线。
要查看实时数据就必须停止采集,导出数据还要另存为CSV格式之后再进行绘图。
最近在 GitHub 上看到了一个用 C# 写的串口波形上位机,正好把这几个坑都补上了。
Serial-Waveform-Terminal 是为半导体测试和自动化生产线设计的串口波形监视器。
使用纯MVVM架构和ScottPlot渲染引擎来解决高频数据采集下出现的UI卡顿、数据丢包等问题。
买一个二次开发太贵不划算,自己写又得踩一遍断包粘包的坑。
该开源项目把滑动窗口解包、异步IO、实时渲染都做了一遍,一条龙。
做半导体测试和自动化产线的工程师,可以好好看看。
用 C# / WPF 技术栈的上位机开发者,代码架构也能直接参考。
下面来介绍它的特殊功能。
底层用滑动窗口 + 帧头校验,断包粘包不用自己再写一遍。
传统的上位机在高频通信的时候,常常会出现帧头没有拼完,下一次又来了的情况。
自己编写解包逻辑的时候,首先要设计好缓冲区,然后进行帧头匹配,最后还要考虑边界条件。
一行代码没写好,数据就丢一半。
这个项目在 Model 层维护了一个缓冲桶(Buffer),只有拼出完整协议帧才向上抛出。
// Model 层抛出完整的协议帧public event Action<byte[]> OnFrameReceived;使用List<byte>的滑动窗口机制,帧头校验、断包拼接等都在底层自动完成。
严格的HEX数据转换体系也防止了用户非法输入造成程序崩溃。
数据丢包的概率已经降到最低了,在调试的时候就不用花很长时间去折腾了。
使用ScottPlot引擎来渲染波形,即使有上千万个数据点的界面也依然流畅。
传统的WPF绑定绘图,数据多了之后界面就会变慢。
绑定的数据量大了之后,UI 线程就被拖垮了,日志列表也就跟着变慢了。
该项目使用了ScottPlot引擎,并且采用了数据缓存和30FPS定时器重绘的方法。
渲染引擎与UI线程是分开的,数据采集和波形显示不会互相影响。
使用数据缓存和33ms(30FPS)定时器重绘的工业级渲染方法。
千万级的数据点刷起来也很流畅,在高频数据采集场景下这一点就显得尤为重要。
串口发送和日志持久化全异步化,多线程高并发不冲突。
await File.AppendAllTextAsync( _logPath, $"{timestamp} | {direction} | {rawPacket}\n");串口发送使用WriteAsync,文件日志使用File.AppendAllTextAsync。
还加入了SemaphoreSlim异步锁来避免多个线程同时抢夺文件流。
传统的轮询模式下,串口读写以及日志落盘都发生在主线程上,一旦被阻塞就会导致界面卡顿。
在异步架构中,发送、接收、落盘这三个过程是互相不阻塞的。
在多线程高并发的情况下,也不会出现文件占用冲突的问题。
在做自动化产线调试的时候,异步架构比传统的轮询要稳定得多。
内存双轨制、一键导出CSV,数据追溯不需要手工整理。
UI列表限制为1000条以防止卡顿,底层业务缓存全部数据以防丢失。
想要查看最新的数据的话,UI列表已经足够用了。
要做故障分析的话,底层全量缓存可以随时导出。
导出CSV文件包含TX/RX方向、原始报文、时间戳、解析值。
支持UTF-8 BOM,Excel打开不会出现乱码。
做故障追溯的时候,不需要再手工从日志中提取数据了。
内建仿真引擎,没有硬件也可以跑全链路测试。
后台线程自动生成50Hz采样率的正弦波封包数据。
从解包、渲染到落盘,整个链条都可以验证。
没有设备的时候,调试串口通信逻辑不需要等待。
点击“开始波形仿真”就可以看到实时波形刷出来了。
封包、解包、渲染、落盘等一整套流程都进行了验证。
要做压力测试,也不需要自己搭建环境。
该仿真引擎对调试通信逻辑非常有用。
看到这你想装上试试?
git clone https://github.com/agentthink/SeriWaveScope.git用 Visual Studio 2022 打开项目,确保安装了 .NET 6.0。
NuGet 会自动下载 CommunityToolkit.Mvvm 和 ScottPlot.WPF。
直接点击“开始波形仿真”,就可以看到实时波形刷出来了。
感兴趣的朋友可以抓紧时间试一试。
开源地址:https://github.com/agentthink/SeriWaveScope </byte></byte[]>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!