SerialPort串口通讯收到多余的数据

我有一C#编写的上位机软件与下位机通讯,下位机是C语言的程序,上位机的串口接收类是SerialPort,偶尔会有问题是会收到一些下位机程序中没有的数据,如00E4C8EBB5C4D0D4B1F03D300D0ACAE4C8EBB5C4D1AABAECB5B0B0D,请问这是什么原因?硬件中如串口或数据线或单片机会导致这样吗?还是说serialport这个类本身就不完善。

3个回答

太古老了,不懂,可能是有干扰

串口通信很容易受到干扰的(比如有的设备抖两下就有干扰)

在受到干扰时,可能会产生多余的无效数据,或影响正常传输的数据

因此,串口通信需要做传输数据的校验,例如按这样的格式传输

1字节固定值|2字节数据长度|真正有效数据|2字节crc16校验

(你碰到的问题不一定是干扰导致的,但做好传输校验后,就能解决这个问题)

第一检确定你就接了一个串口设备。排除其他设备的干扰,
第二 用串口助手一类的工具接收一下。看看有没有多余数据,排除你代码有没有问题。
第三 你在确定下是不是粘包了,如果采用串口接收触发事件读取,就要在该事件内做好切包 和缝包的工作,或者根据你的波特率和将要接收的包的长度算好一个大概的时间去读取会好一点。

qq_37290697
狂奔De鸵鸟 回复: 说了这么多希望能帮助你。望采纳!
大约 2 个月之前 回复
qq_37290697
狂奔De鸵鸟 你可以在读取事件 里先thread.sleep(26) 在读取数据,判断下长度是不是你要的数据 这里需要一个队列 如果数据少了你就扔队列里等后面的补足,如果多了你就切你要的数据,剩下的扔队列里。在队列里上下对应合并数据。这样就不会丢数据了
大约 2 个月之前 回复
qq_37290697
狂奔De鸵鸟 回复: 推荐你个思路吧,9600 大概一毫秒1个字节 如果你的通讯协议大概都是24个字节
大约 2 个月之前 回复
qq_37290697
狂奔De鸵鸟 回复waq127520: 如果你用串口助手一类的工具接收没有乱码就说明是你对数据处理出了问题。
大约 2 个月之前 回复
qq_37290697
狂奔De鸵鸟 回复waq127520: 打个比方 9600的波特率是一秒9600个位 也就是9600/8 = 1200个字节 当然还要扣除你的校验位,停止位一类的设置后约等于1100个字节吧。然后你算下你要读多少个长度的包,你就在读取事件函数内等你算的事件后再去读
大约 2 个月之前 回复
waq127520
waq127520 一和二可以排除,切包和缝包是指数据中的首字节和验证和等等吗,还有波特率要怎么算呢,因为这个问题大概只有1%不到的几率,所以很难试出来哪个波特率稳定无错
大约 2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问