串口转UDP传输数据重复10-15次问题排查与解决咨询
数据重复问题排查与解决建议
问题背景
通过串口读取第三方软件数据,经UDP转发至另一软件后,部分数据重复10-15次,MySQL存储记录中可见大量完全重复的条目(截图显示同一数据连续出现多笔,字段值、时间戳完全一致)。
核心问题排查方向
1. 串口读取缓存未清理
串口接收缓冲区若未及时清空,会残留上次未处理的旧数据,导致下次读取时重复获取相同内容。比如:
- 未在每次读取完成后调用串口库的缓存清空接口(如
serialPort.drain()或serialPort.flush()) - 读取逻辑未区分“新数据包”与“缓冲区残留数据”,直接将所有缓存内容作为新数据转发
2. 发送逻辑被重复触发
UDP本身无传输确认机制,但如果发送动作被多次触发,会导致同一数据重复发送:
- 串口读取事件被重复绑定,同一数据触发多次发送回调
- 发送函数被置于循环逻辑中,未做“已发送”标记判断
- 数据处理函数未正确标记数据状态,导致同一数据被反复送入发送队列
3. 无数据唯一性校验
未给串口数据包添加唯一标识(如递增ID、精确时间戳),无法识别重复数据,导致所有读取到的内容都被直接转发。
针对性解决办法
- 串口读取优化:
- 每次读取完成后立即清空串口接收缓冲区,确保下次读取仅获取新数据
- 定义数据包格式,加入唯一ID或毫秒级时间戳字段,读取时先校验标识,仅处理未见过的新数据
- 发送逻辑控制:
- 检查事件绑定代码,确保串口读取事件仅注册一次
- 给每条待发送数据添加“已发送”标记,发送完成后更新状态,避免重复触发发送
- 全局去重缓存:
维护一个小型缓存集合(如存储最近20条数据的唯一标识),发送前先判断标识是否存在,存在则跳过,不存在则发送并将标识加入集合,定期清理过期记录 - 数据库层面兜底:
在MySQL对应表的唯一标识字段(或组合字段)上创建唯一索引,即使收到重复数据,数据库也会自动拒绝写入,避免脏数据留存
内容的提问来源于stack exchange,提问作者Ege Telli
相关产品推荐
相关产品推荐

