首页 新闻 会员 周边 捐助

C# SerialPort 串口 Read 数据不正确,可能溢出 可能丢失 可能更改

0
悬赏园豆:50 [已解决问题] 解决于 2022-01-12 20:49

1.sPort.Read(byts,0,2048),这个需要考虑ReadBufferSize这个属性的大小吗,比如采用默认值4096,但我上位机处理 (每次读了之后,加了10ms延迟),没有下位机发送快,输入缓冲区满了,下位机还是一直发送,这个时候,下位机能发送得了数据吗,如果能,那是不是我上位机这边就没位置接受了,然后会不会上位机出现丢失数据的可能?
1.2这个Read是异步的吗还是同步的?
1.3 这个Read是填满了 byts,之后,才会继续往下执行对吧,然后是Read读取不及时的数据,才会存入输入缓冲区,还是说下位机发送的数据首先就存入输入缓冲区,而Read是直接去输入缓冲区读的?
2.本来每次2048都是一帧的数据,应该每次开头第0个字节和第1个字节是相同的协议头信息,但是Read读出来,就读的其他的值。并且一开始循环读前几百帧的数据,头信息都是对的,但是读一会儿,头信息就发生错乱了,后面读的帧就跟着错了。错乱开始的位置是随机的。
3.只会在个别电脑上出现,有的电脑又不会出现这种情况。

请园友帮忙分析分析。

HelloLLLLL的主页 HelloLLLLL | 菜鸟二级 | 园豆:437
提问于:2021-12-29 11:07
< >
分享
最佳答案
0

串口是有延迟的,延迟时间并不是固定的,你的10ms时间未必能读到数据,延迟的长度取决于下位机处理的速度,你可以延迟100ms甚至500ms来做测试
最好是和下位机开发人员定义好协议,比如信息头如何定义,信息尾部如何定义,这样你通过while循环读取的时候就会知道数据从哪里开始从哪里结束(这样就可以解决延迟的问题了,因为你一致在循环等待)
至于数据缓冲是系统来操作的,你只管读写就好了,串口通信通常数据不会很多,不用担心溢出问题,如果真的很多很多,那你就要考虑你的代码设计了,至于一次读取的大小根据实际情况定义,没有固定个大小,也不必一定要2048的倍数之类的
数据读出来之后还要做校验的,校验成功才行
或者你把代码贴出来,感觉因该是代码的问题

收获园豆:28
jqw2009 | 老鸟四级 |园豆:2341 | 2021-12-29 11:31
其他回答(3)
0

会不会是干扰?
你描述的是下位机主动发数据给上位机的模式,一般不是上位机读写下位机么?如果是上位机主动读下位机,那就不会有下位机一直发送的问题。

收获园豆:22
中华鲟3670 | 园豆:922 (小虾三级) | 2021-12-29 11:44
0

我改为2ms 10ms 20ms 都得行,下位机800微秒下发一次数据,也就是0.8毫秒发一次,计算机的处理速度2ms足够处理下位机发送的数据了。
我实验了下,发现并不是设备缓存相关的问题。
c#操作上位机操作下位机读取的数据会先存入设备缓存的。
C# Read方法 是同步的。
测试发现 和usb屏蔽线 电池电压 环境都试过,都没找到原因。以前测试都得行,可能是我改了什么代码了吧。

HelloLLLLL | 园豆:437 (菜鸟二级) | 2022-01-12 20:48
0

请问您的问题解决了嘛,我刚刚看到您的帖子,因为我也遇到了些问题,想请教一下您走过来人的经验。
我的问题:就是串口发来的数据放进缓冲区,但是有些时候数据帧是不连续的(设置了帧序号去查看是否连续)。这时候是接收的缓冲区把一些数据丢了嘛,因为中间从0x92(146)下一帧跳到了0x0a(10)。是不是我对缓冲区理解不到位,要是不到位的话也请老师说一下,来个链接啥的,嘿嘿?

Anathoy | 园豆:202 (菜鸟二级) | 2023-02-10 11:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册