02 00 00 00 31 00 00 00 00 00 00 00 80 5B 77 09 00 00 00 00 00 00 00 00 80 5B 77 09 00 00 01 00 02 00 12 C5 0D 0A
00 01 00 02 00 E9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 82 F8 70 F8 83 08 00 64 E2 FF 1E 01 64 00 02 00 00 00 31 00 00 00 00 00 00 00 80 5B 77 09 00 00 00 00 00 00 00 00 80 5B 77 09 00 00 01 00 02 00 BB 24 0D 0A
40 40 40 40 40 7A 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 35 3F 18 81 08 00 64 E2 FF 1E 01 64 00 02 00 00 00 31 00 00 00 00 00 00 00 80 5B 77 09 00 00 00 00 00 00 00 00 80 5B 77 09 00 00 01 00 02 00 62 36 0D 0A
0A 02 12 02 4A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7D F8 5B F8 82 08 00 64 E2 FF 1E 01 64 00 02 00 00 00 31 00 00 00 00 00 00 00 80 5B 77 09 00 00 00 00 00 00 00 00 80 5B 77 09 00 00 01 00 02 00 70 E7 0D 0A
这样一组数值用read函数读取,因为这组值传入时间相差有点大导致read函数读取时只读取了一组后面的没有读进去,请问有什么方法可以将这组值读完整呢?
如果你是采用socket接入,那么就需要一直监听端口,持续读取,然后拼接起来。不知道是否符合你的实际情况。
设置一个接收长度,每次接收之后判断是否达到接收长度,未达到则继续读取,第一次之后读取到的内容进行拼接,就可以读取完全了,这在通讯上是常用的拼接数据帧。
先把问题描述清楚,你“读”到底是读套接字还是读串口还是读其他什么的,只写了一个“read”函数,别人怎么给你分析,代码也没有
这是我的代码,读的是串口!
老兄啊,你不要纠结于语言和读取的接口,掌握了思想,无论是串口还是网络,或者读取文件,都是可以达到预期目的的,你看问答区大神都赞我答案了,你不好好看看参考一下。
SerialPort类有读写超时属性ReadTimeout和WriteTimeout,按你的描述可能是读取超时导致的,首先2楼提供给你个思路,按长度循环去读,直到读到设置的长度,然后把每次读到的字节数组拼接出来作为一个完整的报文处理,但是按固定长度其实是不好判断的,楼主说“后面一段丢了”,这其实是不严谨的,因为你这句代码 Byte[] receivedData = new Byte[sp1.BytesToRead]初始化了你的接收缓冲数组,这个数组一旦被初始化里面其实每个字节都是0x00,所以楼主可能是读到了一段数据,然后后面一段全变成0x00。但是你并不知道真实串口返回给你的数据是从哪个位置结束的,也就是说按2楼说的方法你并不知道用什么条件去判断当前读到的数据的真实长度,你如果按第一个0x00判断的话也是不正确的,因为串口可能真的返回给你的数据就是0x00。所以只有从串口的协议去解决这个问题,你们定义好报文的开始序列和结束序列,最好再报文末尾加上一个校验位,然后按2楼的思路循环去读,从读到“开始序列”开始到读到“结束序列”为止,把中间读到的数据拼接成一个完整的报文进行处理,这样才安全可靠的解决这个问题