使用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
5
sp.Open(); 之后,不要马上发送数据,而是先等待一下,然后清空串口缓冲区,再发送,试试.
你真正要用的话,open和write也是必然要分开的,不可能每发一次数据,就开关一次串口吧
你真正要用的话,open和write也是必然要分开的,不可能每发一次数据,就开关一次串口吧
5
serialport会有串码的问题,需要本人验证返回数据格式,建议还是用c++或直接调用windows api比较好。
5
Thread.Sleep(500) 时间设置长一点看看
5
根据经验,一但看到很多3F,或7F(不同的厂家芯片可能不一样),就表示,和设备的通信协议有问题,出现了数据乱码。
你可以到网上下载一个串口监视工具,看一下串口调试助手是用什么参数,打开,收发数据的的,然后和你的程序对比一下就知道了。
你可以到网上下载一个串口监视工具,看一下串口调试助手是用什么参数,打开,收发数据的的,然后和你的程序对比一下就知道了。
5
本人打开之前做的工程看了一下,当时设置的是2400,7,E,1
SerialPort对于奇偶校验设置,是没有BUG的.
其他代码也没看出有什么问题.
按本人说的,设置一下sp.ReadTimeout=-1试试.咱俩代码只有这里不一样了.
SerialPort对于奇偶校验设置,是没有BUG的.
其他代码也没看出有什么问题.
按本人说的,设置一下sp.ReadTimeout=-1试试.咱俩代码只有这里不一样了.
5
还有,本人看你是先发送,再清空缓冲区.试试打开串口后不要直接发送,先清空发送缓冲区,避免里面已经存在数据.
还有,你的程序现在是一运行就发送一次,
试试做成输入1,打开串口,输入2,关闭串口,输入3,发送并接收数据.
这样可以试试打开串口之后,再多次发送,看到底什么结果.
本人总觉的还是打开串口后直接发送造成的影响.
还有,你的程序现在是一运行就发送一次,
试试做成输入1,打开串口,输入2,关闭串口,输入3,发送并接收数据.
这样可以试试打开串口之后,再多次发送,看到底什么结果.
本人总觉的还是打开串口后直接发送造成的影响.
5
又仔细看了一下,你确定你发的是完整代码??
同样用BitConverter.ToString()
为毛发送字节中间是空格隔开,而接收字节是 – 隔开?
怀疑你中间转换的过程有问题.建议断点测试,看读到的到底是个什么,不要仅仅从转换出来的字符串看结果
同样用BitConverter.ToString()
为毛发送字节中间是空格隔开,而接收字节是 – 隔开?
怀疑你中间转换的过程有问题.建议断点测试,看读到的到底是个什么,不要仅仅从转换出来的字符串看结果