C# serialport 串口 接收数据不全

adsadsadsadsadsa 2014-08-05 12:37:45
使用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 错误在哪里
...全文
6788 52 打赏 收藏 转发到动态 举报
写回复
用AI写文章
52 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2017-03-29
  • 打赏
  • 举报
回复
引用 50 楼 qq_16030215 的回复:
[quote=引用 49 楼 inrg_csdn 的回复:] 我今天也碰到了,程序改来改去,不管怎么改,数据都不全,长一点就少一部分,经过一整晚上各种查 DTR设置为真,正常了。 serialport.DtrEnable = true; 希望可以帮到其他朋友
请问这个函数在什么地方调用[/quote] 我去,还真是这个问题啊,有没有大佬来解释下这是什么原因啊!
Sam Uncle 2016-07-22
  • 打赏
  • 举报
回复
引用 49 楼 inrg_csdn 的回复:
我今天也碰到了,程序改来改去,不管怎么改,数据都不全,长一点就少一部分,经过一整晚上各种查 DTR设置为真,正常了。 serialport.DtrEnable = true; 希望可以帮到其他朋友
万分感谢!!!!
qq_16030215 2016-06-07
  • 打赏
  • 举报
回复
引用 49 楼 inrg_csdn 的回复:
我今天也碰到了,程序改来改去,不管怎么改,数据都不全,长一点就少一部分,经过一整晚上各种查 DTR设置为真,正常了。 serialport.DtrEnable = true; 希望可以帮到其他朋友
请问这个函数在什么地方调用
made.beer 2016-05-16
  • 打赏
  • 举报
回复
我今天也碰到了,程序改来改去,不管怎么改,数据都不全,长一点就少一部分,经过一整晚上各种查 DTR设置为真,正常了。 serialport.DtrEnable = true; 希望可以帮到其他朋友
千手海神 2015-10-02
  • 打赏
  • 举报
回复
楼主,能否说明解决之道,小弟碰巧遇到这个问题,实在困惑,望解疑难。
wm4618 2015-09-11
  • 打赏
  • 举报
回复
引用 42 楼 u012545519 的回复:
问题原因 已经找到 感谢各位的回复
到底什么原因啊?我正好也遇到了这个问题
jimycool 2015-07-06
  • 打赏
  • 举报
回复
楼主不厚道,这么多人出谋划策半天,结果不分享下啊?
langshengdianzi 2015-05-19
  • 打赏
  • 举报
回复
楼主就不分享了?
craigtao 2015-01-05
  • 打赏
  • 举报
回复
分享一下解决方法,谢谢,
卧_槽 2014-08-07
  • 打赏
  • 举报
回复
引用 42 楼 u012545519 的回复:
问题原因 已经找到 感谢各位的回复
到底神马原因?
adsadsadsadsadsa 2014-08-07
  • 打赏
  • 举报
回复
问题原因 已经找到 感谢各位的回复
adsadsadsadsadsa 2014-08-07
  • 打赏
  • 举报
回复
引用 40 楼 Z65443344 的回复:
又仔细看了一下,你确定你发的是完整代码?? 同样用BitConverter.ToString() 为毛发送字节中间是空格隔开,而接收字节是 - 隔开? 怀疑你中间转换的过程有问题.建议断点测试,看读到的到底是个什么,不要仅仅从转换出来的字符串看结果
BitConverter.ToString()只是为了 把接收的数据 显示在 控制台 看看接收的是什么 没实际意义
於黾 2014-08-07
  • 打赏
  • 举报
回复
又仔细看了一下,你确定你发的是完整代码?? 同样用BitConverter.ToString() 为毛发送字节中间是空格隔开,而接收字节是 - 隔开? 怀疑你中间转换的过程有问题.建议断点测试,看读到的到底是个什么,不要仅仅从转换出来的字符串看结果
adsadsadsadsadsa 2014-08-06
  • 打赏
  • 举报
回复
引用 32 楼 libinguest 的回复:
串口只是负责数据传送的,至少得到的数据是否是有效数据,还得依赖你的数据包协议和自己的过滤算法才可以确定有效的信息
用 串口调试工具 接收的数据 根据协议计算 是正确的数据 但是 我使用SerialPort接收道德数据 根据协议计算 确定 是错误数据
adsadsadsadsadsa 2014-08-06
  • 打赏
  • 举报
回复
引用 29 楼 zhuyingmofeng 的回复:
顺便多事一句:楼主收到数据是否首尾不全或者多余?例如(理论收到:00 01 02 03),收到的却是:01 02 03 00,或者03 00 01 02,或者00 01,或者03 01 02,并且一直变动? 倘若这般,添加标志也可解决!
接收的数据 会多很多3F 并且 接收数据的值也会不对 18楼 接收的都是错误数据 17楼才是正确数据
风之影子 2014-08-06
  • 打赏
  • 举报
回复
串口只是负责数据传送的,至少得到的数据是否是有效数据,还得依赖你的数据包协议和自己的过滤算法才可以确定有效的信息
於黾 2014-08-06
  • 打赏
  • 举报
回复
串口API,和鼠标API,键盘API一样,都是系统自带的DLL 你需要知道的只是如何调用
於黾 2014-08-06
  • 打赏
  • 举报
回复
引用 28 楼 u012545519 的回复:
[quote=引用 23 楼 Z65443344 的回复:] 如果还是实在没办法,只能换串口API了. SerialPort确实有些BUG,比如我在WINPE上调试时,某些PCI插槽的串口无法识别
API 类 去哪里下载[/quote] API类,电脑里就有,直接调用就行了. 你只需要查找:串口API,网上有现成代码可以COPY.
zhuyingmofeng 2014-08-06
  • 打赏
  • 举报
回复
顺便多事一句:楼主收到数据是否首尾不全或者多余?例如(理论收到:00 01 02 03),收到的却是:01 02 03 00,或者03 00 01 02,或者00 01,或者03 01 02,并且一直变动? 倘若这般,添加标志也可解决!
adsadsadsadsadsa 2014-08-06
  • 打赏
  • 举报
回复
引用 23 楼 Z65443344 的回复:
如果还是实在没办法,只能换串口API了. SerialPort确实有些BUG,比如我在WINPE上调试时,某些PCI插槽的串口无法识别
API 类 去哪里下载
加载更多回复(32)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧