2 kykiske22 KyKiske22 于 2015.06.01 11:20 提问

控制器给C#上位机窗口程序发送数据的字节接收问题

现在的问题是:设置断点后,发现接收的字节长度不稳定,最少是4个,最多会达到上千个。
代码原先是这么写的:
int lenth = serialPort1.BytesToRead;
if (lenth != 0)
{
Byte[] receiveByte = new Byte[length];
serialPort1.Read(receiveByte, 0, length)
………………………………………………………
…………接收的字节转换流程………………
………………………………………………………
}
我想问一下:如果要是固定的每次接收5个字节(包括了报头),是不是需要把receiveByte的字节长度和串口控件的Read方法的第三个参数改成5就行了?

现在控制器被人借走暂时无法尝试,如果有其他方法欢迎推荐

2个回答

liangquewei
liangquewei   2015.06.01 12:00

我记得,serialPort接收到的数据本来就是长度不固定的,有时是N,有时是M,本来就是这样的,和TCP接收数据段是一样的呀,你得自己收集到足够的长度后再解析的

gamefinity
gamefinity   Rxr 2015.06.01 21:08
  • 你的说法是对的,如果只要5个字节,就把长度设置成5,那么它会至多只给你5个字节,
  • 但是你的想法是不对的。你每次要5个字节的话。我以为是你觉得5个字节正好是你的一个数据块,可以分析出一点东西来。
  • 但是万一通讯过程中掉了1个字节数据,你的数据就永远偏了一个字节。所以永远也不会有正确数据了,除非重启通讯。
  • 比较好的做法是设定一个协议,在看到协议开始标识前的所有字符都丢弃。(那可能是前一个包的丢了部分数据的剩余部分)
gamefinity
gamefinity 回复KyKiske22: 对,有相应的协议判断,我结社你的协议是5个字节。那么第一次读的五个字节,假设说判断出来是失败的,实际情况是一个字节掉了。你其实读到第一个包和第二个包的第一字节。失败了以后你又去读下一个5字节,读到第二个包的2-5字节与第三个包的第一字节(如果第三个包来了的话)。。。那样永远也不对了啊。根据你的说发,很可能N个包一起来,那这些包都解析不到了。
2 年多之前 回复
KyKiske22
KyKiske22 在转换方法里设定了相应的协议和对首位的判断了,这里没有列出
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片