C#串口怎样接收一个完整数据包的解析

maclao 2015-03-14 03:17:40
用到了serialPort控件 已经能接受到串口的数据
数据格式为 帧头+数据长度+数据++帧尾 如何把帧头帧尾和数据长度去掉 直接把数据写到文本中
...全文
1747 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
本拉灯 2015-03-17
  • 打赏
  • 举报
回复
引用 28 楼 maclao 的回复:
[quote=引用 27 楼 wyd1520 的回复:] 上面的那个ByteQueue要改一下还不能直接用。因为你里面有两个协议内容所以要做判断 你还要参考这个http://blog.csdn.net/wyd1520/article/details/23822313 里面那个GetLength根据命令号来判断长度。。
亲 你这个提取数据相当于只是把校验过的一个包提取出来 并没有去包头包尾还有数据长度这些字节是吧 这些到提取出来后再去除是吧[/quote] 去包头尾,那也容易呀,写个去包头尾的类就可以了呀。
maclao 2015-03-17
  • 打赏
  • 举报
回复
引用 27 楼 wyd1520 的回复:
上面的那个ByteQueue要改一下还不能直接用。因为你里面有两个协议内容所以要做判断 你还要参考这个http://blog.csdn.net/wyd1520/article/details/23822313 里面那个GetLength根据命令号来判断长度。。
亲 你这个提取数据相当于只是把校验过的一个包提取出来 并没有去包头包尾还有数据长度这些字节是吧 这些到提取出来后再去除是吧
maclao 2015-03-16
  • 打赏
  • 举报
回复
引用 8 楼 wyd1520 的回复:
[quote=引用 5 楼 maclao 的回复:]
[quote=引用 2 楼 wyd1520 的回复:]
http://blog.csdn.net/wyd1520/article/details/23822313
看这里

看着好像能用 请问你的数据格式是什么[/quote]

你把你的格式放出来。改一下就可以了[/quote]
我的数据格式是如图
本拉灯 2015-03-16
  • 打赏
  • 举报
回复
引用 5 楼 maclao 的回复:
[quote=引用 2 楼 wyd1520 的回复:] http://blog.csdn.net/wyd1520/article/details/23822313 看这里
看着好像能用 请问你的数据格式是什么[/quote] 你把你的格式放出来。改一下就可以了
阿布Guu 2015-03-16
  • 打赏
  • 举报
回复
按数据的格式规则来对接收的数据进行处理, 桢头,帧尾,数据长度及其在接收命令中所在位置,数据长度值等等做为判断数据完整性的标准,都通过验证了就可以取得数据。
於黾 2015-03-16
  • 打赏
  • 举报
回复
首先,串口不存在数据包的概念,所以回调函数执行的时候,可能并不是完整的数据 你需要先把数据缓存起来(比如先放List<byte>里),等接收到的数据长度足够了,再开始解析 然后就是按你前面给出的规则,循环找到哪里是头,哪里是尾,用数据里的数据长度跟接收到的数据长度对比一下,没问题了再取出数据部分显示呗
maclao 2015-03-16
  • 打赏
  • 举报
回复
引用 2 楼 wyd1520 的回复:
http://blog.csdn.net/wyd1520/article/details/23822313 看这里
看着好像能用 请问你的数据格式是什么
本拉灯 2015-03-16
  • 打赏
  • 举报
回复
上面的那个ByteQueue要改一下还不能直接用。因为你里面有两个协议内容所以要做判断 你还要参考这个http://blog.csdn.net/wyd1520/article/details/23822313 里面那个GetLength根据命令号来判断长度。。
maclao 2015-03-16
  • 打赏
  • 举报
回复
引用 24 楼 maclao 的回复:
[quote=引用 23 楼 wyd1520 的回复:] 哥们数据包不是这么玩地。。要这么玩那其他包都不能用了。不是这里移。是在while(xxx.Find) 这里不做处理就可以了
有点懂了 那就是我在while(xxx.find)里面做判断命令码是0x00就不要了 是0x05就提取数据对吧[/quote] 还有一点不确定的是 /// 提取数据 /// </summary> public byte[] Dequeue() { int size = 1 + 2 + 1 + GetLength() + 1; byte[] buffer = m_buffer.Take(size).ToArray(); m_buffer.RemoveRange(0, size); return buffer; } 这里你是把数据前的起始码、命令码等都移除了 只剩下真正的数据了对吧
本拉灯 2015-03-16
  • 打赏
  • 举报
回复
引用 24 楼 maclao 的回复:
[quote=引用 23 楼 wyd1520 的回复:] 哥们数据包不是这么玩地。。要这么玩那其他包都不能用了。不是这里移。是在while(xxx.Find) 这里不做处理就可以了
有点懂了 那就是我在while(xxx.find)里面做判断命令码是0x00就不要了 是0x05就提取数据对吧[/quote] 对头,就这样。。。你终于理解了。
maclao 2015-03-16
  • 打赏
  • 举报
回复
引用 23 楼 wyd1520 的回复:
哥们数据包不是这么玩地。。要这么玩那其他包都不能用了。不是这里移。是在while(xxx.Find) 这里不做处理就可以了
有点懂了 那就是我在while(xxx.find)里面做判断命令码是0x00就不要了 是0x05就提取数据对吧
本拉灯 2015-03-16
  • 打赏
  • 举报
回复
引用 22 楼 maclao 的回复:
[quote=引用 21 楼 wyd1520 的回复:] 所以我设个断点在判断数据长度时那个TailIndex +1始终等于8 他这人返回的是0x55的下标位置,没错是8呀 又不是流的长度 你收到命令码 为0x00时这个包可以不用吧直接跳过去呀。
在数据长度下我把这9个字节移除好像不行咯?[/quote] 哥们数据包不是这么玩地。。要这么玩那其他包都不能用了。不是这里移。是在while(xxx.Find) 这里不做处理就可以了
maclao 2015-03-16
  • 打赏
  • 举报
回复
引用 21 楼 wyd1520 的回复:
所以我设个断点在判断数据长度时那个TailIndex +1始终等于8 他这人返回的是0x55的下标位置,没错是8呀 又不是流的长度
你收到命令码 为0x00时这个包可以不用吧直接跳过去呀。

在数据长度下我把这9个字节移除好像不行咯?
本拉灯 2015-03-16
  • 打赏
  • 举报
回复
所以我设个断点在判断数据长度时那个TailIndex +1始终等于8 他这人返回的是0x55的下标位置,没错是8呀 又不是流的长度 你收到命令码 为0x00时这个包可以不用吧直接跳过去呀。
本拉灯 2015-03-16
  • 打赏
  • 举报
回复
看你截的两个协义格式不同呀,一个是有数据长度且不固定,另一个是固定长度,这个区分就是从命令码里区分的。先判断命令码。才能知道他是什么样的一个格式。。
maclao 2015-03-16
  • 打赏
  • 举报
回复
引用 18 楼 wyd1520 的回复:
[quote=引用 17 楼 maclao 的回复:] [quote=引用 16 楼 wyd1520 的回复:] 。。。那个改成下面的代码 /// <summary> /// 提取数据 /// </summary> public byte[] Dequeue() { int size = 1 + 2 + 1 + GetLength() + 1; byte[] buffer = m_buffer.Take(size).ToArray(); m_buffer.RemoveRange(0, size); return buffer; }
首先感谢你的耐心解答 你的程序没问题 是我收到的数据前还有9个字节是对我发送开始采集命令的回应 格式如下 所以我设个断点在判断数据长度时那个TailIndex +1始终等于8 返回码的九个字节该怎么处理 无条件直接移除吗? 菜鸟问题多望见谅[/quote] 那你这种协议与我博客上的那个差不多了一样的了。就要要判断命令码来进行实别他的长度[/quote] 啊 什么意思 我前面对开始命令的返回码跟后面的数据长度没关系呀 只是对我开始命令的返回 能判别是否开始采集 方便加个Q请教下吗 527746225
本拉灯 2015-03-16
  • 打赏
  • 举报
回复
引用 17 楼 maclao 的回复:
[quote=引用 16 楼 wyd1520 的回复:] 。。。那个改成下面的代码 /// <summary> /// 提取数据 /// </summary> public byte[] Dequeue() { int size = 1 + 2 + 1 + GetLength() + 1; byte[] buffer = m_buffer.Take(size).ToArray(); m_buffer.RemoveRange(0, size); return buffer; }
首先感谢你的耐心解答 你的程序没问题 是我收到的数据前还有9个字节是对我发送开始采集命令的回应 格式如下 所以我设个断点在判断数据长度时那个TailIndex +1始终等于8 返回码的九个字节该怎么处理 无条件直接移除吗? 菜鸟问题多望见谅[/quote] 那你这种协议与我博客上的那个差不多了一样的了。就要要判断命令码来进行实别他的长度
maclao 2015-03-16
  • 打赏
  • 举报
回复
引用 16 楼 wyd1520 的回复:
。。。那个改成下面的代码

/// <summary>
/// 提取数据
/// </summary>
public byte[] Dequeue()
{
int size = 1 + 2 + 1 + GetLength() + 1;
byte[] buffer = m_buffer.Take(size).ToArray();
m_buffer.RemoveRange(0, size);
return buffer;
}

首先感谢你的耐心解答 你的程序没问题 是我收到的数据前还有9个字节是对我发送开始采集命令的回应 格式如下
所以我设个断点在判断数据长度时那个TailIndex +1始终等于8 返回码的九个字节该怎么处理 无条件直接移除吗? 菜鸟问题多望见谅
本拉灯 2015-03-16
  • 打赏
  • 举报
回复
。。。那个改成下面的代码 /// <summary> /// 提取数据 /// </summary> public byte[] Dequeue() { int size = 1 + 2 + 1 + GetLength() + 1; byte[] buffer = m_buffer.Take(size).ToArray(); m_buffer.RemoveRange(0, size); return buffer; }
maclao 2015-03-16
  • 打赏
  • 举报
回复
引用 14 楼 wyd1520 的回复:
是的
但是我主机调用queue.Dequeue() 提示错误 1 “ByteQuene.Dequeue()”: 并非所有的代码路径都返回值
加载更多回复(9)

111,092

社区成员

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

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

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