Code Bye

C# serialport 串口 接收数据不全

使用serialport 向设备发送请求并获得响应数据
SerialPort sp = new SerialPort(); 
sp.PortName = "COM2";
 sp.BaudRate = 2400;
 sp.StopBits = StopBits.One;
sp.Parity = Parity.Even;
sp.DataBits = 8;
sp.WriteTimeout = 1000;
// 使用的是Modbus协议通信  1 4  是固定的 0 0 是高位 低位 歧视地址  0 2 是高位 低位 请求数量   113 203 是校验码
byte[] request = { 1, 4, 0, 0, 0, 2, 113, 203 }; 
sp.Open();
sp.Write(request, 0, request.Length);
 System.Threading.Thread.Sleep(1000);
 byte[] buffer = new byte[sp.BytesToRead];
int len = sp.Read(buffer, 0, sp.BytesToRead);
//  使用串口调试助手 接收到的数据 是正确的 01 04 04 00 4F 00 4E 4A 67      01 04 分别对应 1 4    04是请求数量*2 转换成16进制   00 4F 00 4E 是请求数量返回的具体值    4A 67 返回的校验码

本人用sp.Read(buffer, 0, sp.BytesToRead)  读取到的数据 不正确 不是9位 长度  并且返回的 好多数据 都是63  转换16进制是3F  错误在哪里

解决方案

5

先用串口调试助手,确定数据能否正常,再谈软件问题.
假如数据本身就是63,你读到63不就对了?
造成数据异常可能有很多种原因,例如线接错了,波特率设置错了,校验设置错了.

5

sp.Open(); 之后,不要马上发送数据,而是先等待一下,然后清空串口缓冲区,再发送,试试.
你真正要用的话,open和write也是必然要分开的,不可能每发一次数据,就开关一次串口吧

5

serialport会有串码的问题,需要本人验证返回数据格式,建议还是用c++或直接调用windows api比较好。

5

引用 4 楼 u012545519 的回复:

open后 本人是Thread.Sleep(500) 然后才开始write
open和write  也是分开的  不会 发送一次 打开一次

Thread.Sleep(500) 时间设置长一点看看

5

根据经验,一但看到很多3F,或7F(不同的厂家芯片可能不一样),就表示,和设备的通信协议有问题,出现了数据乱码。
你可以到网上下载一个串口监视工具,看一下串口调试助手是用什么参数,打开,收发数据的的,然后和你的程序对比一下就知道了。

5

本人打开之前做的工程看了一下,当时设置的是2400,7,E,1
SerialPort对于奇偶校验设置,是没有BUG的.
其他代码也没看出有什么问题.
按本人说的,设置一下sp.ReadTimeout=-1试试.咱俩代码只有这里不一样了.

5

还有,本人看你是先发送,再清空缓冲区.试试打开串口后不要直接发送,先清空发送缓冲区,避免里面已经存在数据.
还有,你的程序现在是一运行就发送一次,
试试做成输入1,打开串口,输入2,关闭串口,输入3,发送并接收数据.
这样可以试试打开串口之后,再多次发送,看到底什么结果.
本人总觉的还是打开串口后直接发送造成的影响.

5

又仔细看了一下,你确定你发的是完整代码??
同样用BitConverter.ToString()
为毛发送字节中间是空格隔开,而接收字节是 – 隔开?
怀疑你中间转换的过程有问题.建议断点测试,看读到的到底是个什么,不要仅仅从转换出来的字符串看结果

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C# serialport 串口 接收数据不全