C# 解析串口协议

xianglanyue_net 2013-10-15 12:58:47
开始“{” + 数据长度 + 数据内容 + 回应命令(1未通过,0为不通过) +校验位+结尾”}“

请问如何解析这条命令,要将回应命令取出来

拜托各位了!急求!!!!!!!
...全文
433 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
asia217 2013-10-22
  • 打赏
  • 举报
回复
恩,我的那段代码就是13楼表达的意思,我不怎么会理论
xianglanyue_net 2013-10-17
  • 打赏
  • 举报
回复
引用 13 楼 lovetsfuer 的回复:
1、你接收过来的数据长度是不是固定长度?如果是固定的,那你就把不是的舍弃 2、固定长度,开始“{”(一个字节) + 数据长度(两个个字节) + 数据内容(每次发送600个字节,最后后不满按实际发送)----这部分的长度是不是一定的? 3、如果上面长度是固定的,那是不是可以取回来的数据截取你想要的部分? 就是回应命令,我们做串口的数据采集,基本上返回命令长度是固定的,开头+结尾是固定的,你串口返回的数据,先判断头尾截取到正确的数据区域,再在正确的数据区域,截取你要的固定位置的数据就行了,比如是10-13位数,你明白了?
bytes.Skip(bytes.Length - 2 - 2 - 1).Take(1);
这样判断合适吗?
谢谢!
xianglanyue_net 2013-10-16
  • 打赏
  • 举报
回复
引用 9 楼 Saleayas 的回复:
既然使用这个协议,为什么不使用 JSON 呢 ?
因为不会用
xianglanyue_net 2013-10-16
  • 打赏
  • 举报
回复
var ret = bytes.Skip(bytes.Length - 2 - 2 - 1).Take(1); 不太明白这语句的意思。
Saleayas 2013-10-16
  • 打赏
  • 举报
回复
既然使用这个协议,为什么不使用 JSON 呢 ?
lovetsfuer 2013-10-16
  • 打赏
  • 举报
回复
1、你接收过来的数据长度是不是固定长度?如果是固定的,那你就把不是的舍弃 2、固定长度,开始“{”(一个字节) + 数据长度(两个个字节) + 数据内容(每次发送600个字节,最后后不满按实际发送)----这部分的长度是不是一定的? 3、如果上面长度是固定的,那是不是可以取回来的数据截取你想要的部分? 就是回应命令,我们做串口的数据采集,基本上返回命令长度是固定的,开头+结尾是固定的,你串口返回的数据,先判断头尾截取到正确的数据区域,再在正确的数据区域,截取你要的固定位置的数据就行了,比如是10-13位数,你明白了?
bytes.Skip(bytes.Length - 2 - 2 - 1).Take(1);
这样判断合适吗?
xianglanyue_net 2013-10-16
  • 打赏
  • 举报
回复
请问XOR校验位都是一个字节吗?
老张一笑 2013-10-15
  • 打赏
  • 举报
回复
串口命令里还包含 "}" ??? 神一样的协议.
asia217 2013-10-15
  • 打赏
  • 举报
回复
不好意写错了 应该是 /// <summary> /// /// </summary> /// <param name="bytes">整个协议的字节</param> /// <returns></returns> byte getBackCmd(byte[] bytes) { //假如‘}’占2个字节 var endlnlen = 2; //假如结束检验位占2个字节 var checkendlen = 2; //回应命令假如占1个字节 var backcmdlen = 1; var ret = bytes.Skip(bytes.Length - 2 - 2 - 1).Take(1); return ret.FirstOrDefault(); } 调用: var ret = getBackCmd(); if (ret == 1) { } else { }
asia217 2013-10-15
  • 打赏
  • 举报
回复
/// <summary> /// /// </summary> /// <param name="bytes">整个协议的字节</param> /// <returns></returns> byte getBackCmd(byte[] bytes) { //假如‘}’占2个字节 var endlnlen = 2; //假如结束检验位占2个字节 var checkendlen = 2; //回应命令假如占1个字节 var backcmdlen = 1; var ret = bytes.Skip(bytes.Length - 2 - 2 - 1).Take(1); if (ret.FirstOrDefault() == 1) { } else { } }
xianglanyue_net 2013-10-15
  • 打赏
  • 举报
回复
解析协议需要用到位移吗
引用 1 楼 NCScan 的回复:
能详细点么?
解析协议需要用到位移吗
xianglanyue_net 2013-10-15
  • 打赏
  • 举报
回复
引用 2 楼 mqdsg 的回复:
一步一步的拆包,先拆{},再根据 数据长度,找到 回应命令(1未通过,0为不通过) 在字符串内的位置,如果需要校验的,先比对校验值。
拆包时,用int recByteNum = sp.BytesToRead; string recData = sp.ReadLine(); 两个类型不同
xianglanyue_net 2013-10-15
  • 打赏
  • 举报
回复
接收协议:开始“{”(一个字节) + 数据长度(两个个字节) + 数据内容(每次发送600个字节,最后后不满按实际发送) + 回应命令(1未通过,0为不通过) +校验位(XOR)+结尾”}“(一个字节) 接收这条协议,解析出回应命令是否是1,这边将内容取出,并发送收到命令
在飞的特拉斯 2013-10-15
  • 打赏
  • 举报
回复
一步一步的拆包,先拆{},再根据 数据长度,找到 回应命令(1未通过,0为不通过) 在字符串内的位置,如果需要校验的,先比对校验值。
NCScan 2013-10-15
  • 打赏
  • 举报
回复
能详细点么?

110,533

社区成员

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

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

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