C#.NET串口发数据问题

m0_48163597 2021-03-24 02:44:22
1.发送数据:byte[] arrSendData = new byte[]
{0x10,0x02,0x12,0x00,0xF8,0x00,0x00,0xFF,0xFF,0x03,0x00,0x00,0x01,0x04,0x00,0x00,0x40,0x1F,0x00,0xA8,0x02,0x00,0x10,0x03,0x31,0x39};
2.用串口调试接收到的数据

所以两者的数据完全不一致,请问这是什么原因导致的??????????

3.我用串口调试发送数据:byte[] arrSendData = new byte[]
{0x10,0x02,0x12,0x00,0xF8,0x00,0x00,0xFF,0xFF,0x03,0x00,0x00,0x01,0x04,0x00,0x00,0x40,0x1F,0x00,0xA8,0x02,0x00,0x10,0x03,0x31,0x39};
4.用串口调试接收到的数据与发送相同。
所以麻烦大神支招
...全文
366 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wanghui0380 2021-03-25
  • 打赏
  • 举报
回复
引用 5 楼 m0_48163597 的回复:
[quote=引用 1 楼 wanghui0380 的回复:]1.请确认你的参数配置一致(波特率,校验位,数据位,停止位) 2.请把你发送代码贴出来
再请教一个问题,怎么判断数据发送完,以及接受完。不然后接收时就回出错,延时的话至少要1秒以上,有快点的方式吗?[/quote] 无法确定,实际上对于串口这种东西,如果你们自己双方没有协议保证的话,谁也保证不了。如果你有一个真实的串口你可以试试看,串口上什么都不连,你一样可以打开这个串口,以及对该串口写数据 也就是说,哪怕没有接收方其实他也一样运作。 ps:串口也好,tcp也罢,蓝牙也罢,都是这类东西,底层只是负责字节传输以及数据传输正确性,但不保证你们双方到底传滴的是什么。所以这类东西你都会看到“通讯协议包,通讯协议解析,粘包,分包”这类讨论。你现在可以找个modbus从端模拟器,模拟一下真实工业协议的设计。 你就知道我们怎么根据通信协议去(功能码,数据长度,校验码)去验证我收到的数据是完整的,无误的
wanghui0380 2021-03-25
  • 打赏
  • 举报
回复
这里在顺带提一下未来的方向 IDuplexPipe 接口 早年间各种轮子虽然出的很多,但是各不兼容,比如modubsnet,dotnetty,sunpersocket。他们各自实现了各自的传输控制和编解码层。 但是你从我6楼的回复其实就可以看出,其实有个问题,虽然底层传输控制可以接串口,接蓝牙,接tcp --接各种的client,但实际编协议解码其实原本可以互通 比如你的对接方,非要用串口传递http协议,可以不。当然可以。问题来了dotnetty有http协议解析解码器,但是他自己给tcp设计的,你复用不了解码器(你要看dotnetty的源码发现,他整个基础设计用的是ipaddress,所以Java的人就有人自己继承IPAddress但实现波特率等东西,偷偷绕过去) 同样加入你的对接方,非要让你用蓝牙对接modbus rtu,你又头痛。modubsnet对接串口(也兼容tcp)但是蓝牙他没有 --------------------------- 其实,协议编码解析是通用设计,可以复用,他不应该专属某个传输client。 所以这里的建议,那些喜欢造轮子的人们,以后在造轮子的时候请用IDuplexPipe 做核心,这样俺们可以任意更换 传输层client和编解码器
ba_wang_mao 2021-03-25
  • 打赏
  • 举报
回复
一、关于发送完成 如果是单片机的话,有发送完成中断,你可以知道这帧报文已经发送完成。 如果是PC机的话,如果你可以直接控制硬件(假如:MSDOS操作系统),就可以通过读取中断控制寄存器知道。 如果是WINDOWS操作系统的话,如果系统不提供相应的API的话,就没有办法知道是否已经发送完成。 二、关于接收完成 一般工业协议采用如下【超时定时器】的方法判断是否接收完成 第一步:当接收到一个字节后,开启定时器(例如:定时器的时长=3毫秒), 定时器计数器初始值为0,定时器开始计时(总之,只要收到字节,就将计数器初始化为0) 第二步:继续接收 下一个字节 , 开启定时器(例如:定时器的时长=3毫秒), 定时器计数器初始值为0,定时器开始计时(总之,只要收到字节,就将计数器初始化为0) 第三步:当没有收到字节时,定时器计数器自动开始增加,当计数器加到超过3毫秒计数值时,定时器溢出 第四步:当定时器溢出,则表示接收报文完成
m0_48163597 2021-03-24
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380 的回复:
1.请确认你的参数配置一致(波特率,校验位,数据位,停止位) 2.请把你发送代码贴出来
再请教一个问题,怎么判断数据发送完,以及接受完。不然后接收时就回出错,延时的话至少要1秒以上,有快点的方式吗?
m0_48163597 2021-03-24
  • 打赏
  • 举报
回复
找到原因了,谢谢各位
青岛小帅锅 2021-03-24
  • 打赏
  • 举报
回复
第一次看到用ODD校验的,我见过None和even。。。
兔子-顾问 2021-03-24
  • 打赏
  • 举报
回复
你波特率没设置对吧,应该是这个原因,两边要一样的波特率。
wanghui0380 2021-03-24
  • 打赏
  • 举报
回复
1.请确认你的参数配置一致(波特率,校验位,数据位,停止位) 2.请把你发送代码贴出来

111,094

社区成员

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

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

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