如何让读串口的程序判断出来是一帧数据的开始

yilaozhuang 2016-10-11 12:34:54
[size=16px]各位大神,小弟遇到一个问题:
在读取串口数据的时候,使用DataReceived事件去触发,一帧数据长度为100个字节,设置
com2.ReceivedBytesThreshold = 100;
com2.DataReceived += new SerialDataReceivedEventHandler(DataReceived)
如果先打开软件,等着接硬件,程序跑的都正常。
实际应用的时候,经常硬件接上,通电了,数据开始往电脑传,但是软件没有开,结果软件启动以后,经常出现从一帧数据的一半开始接收,导致后面所有数据全面都错乱了。
=================================
不知道有没有什么好办法解决这个硬件先启动,后启动软件,软件随机时刻去接收串口的问题。
...全文
938 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
圈圈电子 2019-06-11
  • 打赏
  • 举报
回复
要适合任何协议才可以
qq_38240832 2017-11-03
  • 打赏
  • 举报
回复
我也遇到了,请问您怎么解决的呢
liuy_yy 2017-10-12
  • 打赏
  • 举报
回复
请问楼主,您这个问题后来是怎么解决的?我也遇见了同样的问题!
  • 打赏
  • 举报
回复
每当收到 Eof 字符,就会触发 DataReceived 事件。 最简单的做法,就像读取文件一样,按“行”读取,每一行文本作为一个消息,直到读到 Eof 为止。这样你就无需过分纠结什么“起始、长度、标志”等等。
xian_wwq 2016-10-11
  • 打赏
  • 举报
回复
数据分包的方法其实和基于网口的处理tcp粘包是基本类似的 1.通信双方约定好报文格式, 比如,报头标识 +CRC校验+报文长度+数据 2.接收数据时,需要把单次数据放入缓存。 启动单独的分包线程, 解析线程从缓存的头开始查找报头标识 找到头标识后,根据长度读取完整的数据报文, 头标识之前的数据显然是不完整的数据,只能抛弃; 如果缓存中的数据不够报头中携带的长度,则继续接收
飞天凤凰601 2016-10-11
  • 打赏
  • 举报
回复
数据使用包头与包尾,还有就是CRC校验,就好了!
stherix 2016-10-11
  • 打赏
  • 举报
回复
这个你就要封装包格式了 比如包头 包尾 包长 校验码 比如 包头是第一个字符 \xAA 之后2字节是包总长度 倒数2,3字节是crc校验码 最后一个字节是包尾 \xDD 这样才能从字节流中获取正确的完整包 并解析出来

110,534

社区成员

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

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

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