通过监听串口得到串口数据
//1.这是串口接收完数据传递到此方法中,传来的值是 AA-FF-01-00-71-F1-86-52
private void SerialTest_ScanerEvent(string codes)
{
string data = codes;
textBox1.Text= ConvertCardNo(data);
}
而我期望的值是一个正常的卡号,应为0007467398
//HexStr=AA-FF-01-00-71-F1-86-52
private string ConvertCardNo(string HexStr)
{
HexStr = HexStr.Replace("-", "").Replace(" ",""); //AAFF010071F18652
string tempCardNo = HexStr.Substring(8, 6); //71F186
int result = int.Parse(tempCardNo, System.Globalization.NumberStyles.AllowHexSpecifier);//7467398
string resultCardNo = result.ToString().PadLeft(10, '0'); //0007467398
return resultCardNo;//最终返回了正确的0007467398
}
以上代码能够返回0007467398是我不断尝试,不断尝试 不断尝试得到的结果,
我不明白AA FF 01 00 以及最后的52都是些什么意思,万一另一张卡返回的16进制数据并不是我
想的这种长度格式时我就无法得到正确数据了,我想知道接到串口的数据后,如何对串口返回的数据
进行解析,串口通信是否有具体的规范,我目前看下来,就是把前8位AAFF0100 扔掉,把最后2位52也扔掉,
取他俩之间的71F186就是正确的值了,因为手中只有一张IC卡片,无法验证我的想法是否正确,但感觉上是
不靠谱,所以请讲讲如何正确的理解串口数据以及解析串口数据
这种串口数据一般都是有前导码和CRC的
AA 一定是前导码之一
FF 可能是前导码, 或是命令/回返状态
01 “一个” 数据, ID? 或是 命令
00 71 F1 86 数据 < 10位长度的卡号, DEC2HEX 转换后要 32bits 长度>
52 CRC 验证码 <- 串流CRC 验算 ( 前7个数据XOR后的值 )
你可以用最后的 CRC, 确定你收到的是 OK的数据。
大胆一些猜:
AA FF 前导
01 资料数
00 71 F1 86数据
52 串流CRC 验算 ( 前7个数据XOR后的值 )
数据长度如果是8, 12, 16…, 那从CRC那往回推 4个字节, 4个字节一组, 再前面那个字节应该等于”数据组数”。
先理清楚两个东西
1.串口----------这个是物理传输介质。表达的是用什么传输手段传输数据,比如串口,网口,蓝牙,无线电,所以我们通常叫传输层(transfer)
2.应用协议---这个加载在物理传输介质上的编码数据,我们可以用无线电传输SOS这样的国际协议规范,也可以用无线电传输密文。当然这些数据涉及到的问题是“编码/解码”,所以我们通常叫编解码层(coder/decoder)
现在回答你的问题,你已经拿到AA-FF-01-00-71-F1-86-52,这是编码后的数据,所以我们需要解码。那么你的问题
串口通信是否有具体的规范
我们说没有,应用层协议是双方约定的,没有具体规范。就像上面说的你可以用“SOS”这样的国际标准做规范,也可以是你们自己商量的“Helper”做规范。
所以做这类对接,我们需要看协议文档,一切以双方协议文档为准,这个硬件文档规定你如何解析就如何解析
总结:虽然我们可以如楼上那样去猜测编码器/解码器协议规则,但是这只是猜测,我们实际编码应该已对方的对接文档开发文档为准
另外实际开发中串口数据是stream流式数据会存在粘包现象,所以我们其实也很难只单单通过一句“AA-FF-01-00-71-F1-86-52”去猜测,至少有10-20条通讯应答数据后,我们才可能去猜他的规则(就像楼上说的,大部分编码规则都是遵循一些约定俗成的标准,所以如果有多条连续应答,我们大概可以猜猜他的编码规则)