帮我看下这串口协议有没有问题

yinrongg 2010-07-27 11:20:53
通讯接口采用RS232C,所有数据均为ASCII码,每帧数据有9个字节组成.第一个字节为起始位,第二个字节为状态字A。
其中A状态字具体Bit位使用如下:
0:0...1...(省略)
1: 0...1...
2: 0...1...
3: 0...1...
4: 0...1...
5: 0...1...
6: 0正1负
7: 0动态1非动态
假如状态字A第7位为1,其他Bit位都为0。那么A状态字就是1000 0000 转成16进制为80。我在ASCII码对照表没找到相应的字符。这协议有问题吗?
我测试时往串口发的状态字A为byte(128)时(16进制80)。通过

System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
int intAsciiCode = (int)asciiEncoding.GetBytes(acsiiStr)[0];
其中acsiiStr
是从串口读取的状态字A的ASCII字符。将其转成16进制为3F。跟我发的不相符...
...全文
72 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yinrongg 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wuyazhe 的回复:]
没有ASCII。计算机里都是0和1.串口处理的是字节流,8个0和1的序列而已。你什么时候看到ReadAllASCII方法了?你acsiiStr不知道哪里来的,ReadExisting?这本身就是得到byte[]然后用你设置的Encoding转换的字符串,然后你得到这个字符串再转换回去,你不觉得很多余么?你直接Read。我说了多次,你明白么?

你的问题我也说多次了。
2个方面
1.协议本身……
[/Quote]
谢谢。接触不久正在摸索中呢,呵呵
兔子-顾问 2010-07-27
  • 打赏
  • 举报
回复
每帧数据有9个字节组成.第一个字节为起始位,第二个字节为状态字A。

我只猜到你的协议为:
XX 41 DD DD DD DD DD DD DD

这些DD就是你的数据,41是第二个关键字,如果翻译成ASCII,表示'A',第一个你略过的那个字节很重要,是数据头的判断标志。如果数据就只有这样,很不严谨,因为数据中也可能重叠出现 XX 41 的组合。
兔子-顾问 2010-07-27
  • 打赏
  • 举报
回复
没有ASCII。计算机里都是0和1.串口处理的是字节流,8个0和1的序列而已。你什么时候看到ReadAllASCII方法了?你acsiiStr不知道哪里来的,ReadExisting?这本身就是得到byte[]然后用你设置的Encoding转换的字符串,然后你得到这个字符串再转换回去,你不觉得很多余么?你直接Read。我说了多次,你明白么?

你的问题我也说多次了。
2个方面
1.协议本身你没描述完整,只说了个头,如果只有头,没有判断数据尾的办法,就是不好的协议。
2.你分析的方法也错了。本来就是二进制数据,你非要文本方式读,然后再转成字节,多此一举。

你提问要有针对性。不要混为一谈,协议合理不合理你贴出完整的协议定义,如果是问这样分析是否正确就问分析。不同的东西混在一起只能让提问和回答的人都陷入一团乱麻。
yinrongg 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyazhe 的回复:]
你也没吧协议说完整。不知道有没有问题,如果只有协议头,没有判断结束的方法,是会有隐患的。
[/Quote]
如果按我上面描述的协议,从串口接收到的全是ASCII码。那么满足得了状态字A的所有情况吗?
兔子-顾问 2010-07-27
  • 打赏
  • 举报
回复
你也没吧协议说完整。不知道有没有问题,如果只有协议头,没有判断结束的方法,是会有隐患的。
兔子-顾问 2010-07-27
  • 打赏
  • 举报
回复
1.二进制协议最好包含校验和数据长度,避免长时间搜索,无法区分错误数据。
数据头标识+长度+数据+校验
2.分析的时候,使用Read方法,读取到byte[]中,多次DataReceived事件中缓存,每次缓存后查找有效数据
3.对找到的有效数据分析,使用
yinrongg 2010-07-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyazhe 的回复:]
这就不是ascii的协议了。二进制分析。
C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
[/Quote]
也就是说这个协议定的有问题?
一切为了你 2010-07-27
  • 打赏
  • 举报
回复
你开始发的是字符串 要转换成字节发送,在通过接收到的字节在去解码 !! 本人也刚看这个东西
兔子-顾问 2010-07-27
  • 打赏
  • 举报
回复
这就不是ascii的协议了。二进制分析。
C# 串口操作系列(3) -- 协议篇,二进制协议数据解析

110,533

社区成员

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

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

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