通讯接口采用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。跟我发的不相符...

解决方案 »

  1.   

    这就不是ascii的协议了。二进制分析。
    C# 串口操作系列(3) -- 协议篇,二进制协议数据解析 
      

  2.   

    1.二进制协议最好包含校验和数据长度,避免长时间搜索,无法区分错误数据。
    数据头标识+长度+数据+校验
    2.分析的时候,使用Read方法,读取到byte[]中,多次DataReceived事件中缓存,每次缓存后查找有效数据
    3.对找到的有效数据分析,使用
      

  3.   

    如果按我上面描述的协议,从串口接收到的全是ASCII码。那么满足得了状态字A的所有情况吗?
      

  4.   

    没有ASCII。计算机里都是0和1.串口处理的是字节流,8个0和1的序列而已。你什么时候看到ReadAllASCII方法了?你acsiiStr不知道哪里来的,ReadExisting?这本身就是得到byte[]然后用你设置的Encoding转换的字符串,然后你得到这个字符串再转换回去,你不觉得很多余么?你直接Read。我说了多次,你明白么?你的问题我也说多次了。
    2个方面
    1.协议本身你没描述完整,只说了个头,如果只有头,没有判断数据尾的办法,就是不好的协议。
    2.你分析的方法也错了。本来就是二进制数据,你非要文本方式读,然后再转成字节,多此一举。你提问要有针对性。不要混为一谈,协议合理不合理你贴出完整的协议定义,如果是问这样分析是否正确就问分析。不同的东西混在一起只能让提问和回答的人都陷入一团乱麻。
      

  5.   

    每帧数据有9个字节组成.第一个字节为起始位,第二个字节为状态字A。我只猜到你的协议为:
    XX 41 DD DD DD DD DD DD DD这些DD就是你的数据,41是第二个关键字,如果翻译成ASCII,表示'A',第一个你略过的那个字节很重要,是数据头的判断标志。如果数据就只有这样,很不严谨,因为数据中也可能重叠出现 XX 41 的组合。