我的消息协议如下:
DLE:0x10(在0x2,0x3或0x10前面使用的分隔符是数据字节而不是STX,ETX或DLE)。
DATA:任何值为0x02,0x03或0x10的值都是分隔的,以避免与STX,ETX和DLE混淆
LRC:计算为'XOR'并排除任何DLE和STX,但包括ETX。此外,即使LRC值为0x2,0x3或0x10,LRC值也不会分隔。
以下是我正在测试的数据测试消息:
byte[] testMessage1 = {
0x02, // STX
0x10,0x2,0xA,0x10,0x10,0x7,0x8, // Data 02, A, 10, 7, 8
0x03, // ETX
0x2^0xA^0x10^0x7^0x8^0x03 // LRC calculated from the data (with the DLE removed) plus the ETX
};
以下是我的LRC计算:
public static byte calculateLRC(byte[] bytes) {
byte LRC = 0;
for (int i = 1; i < bytes.length; i++) {
LRC ^= bytes[i];
}
return LRC;
}
如何根据协议进行LRC计算测试字节消息,以检查它是否是有效消息,并且之前的数据没有损坏?
答案 0 :(得分:1)
从广义上讲,解析适用于 state 变量,并且根据读取的下一个符号,状态会发生变化(错误是可能的状态)。
在您的协议中,为了验证消息,如果您从一开始就逻辑地考虑它,就可以计算出状态。
第一个字节显然必须是STX,否则它将不是有效消息。在那之后,你想要计算LRC同时也在寻找ETX。找到ETX后,下一个字节必须是LRC。条件状态,如通过DLE转义,也可以表示为不同的状态:
State 0:
If Symbol STX -> State 1
else -> Error
State 1:
If Symbol = ETX -> State 3
else if Symbol = DLE -> State 2
else update LRC
State 2:
update LRC -> State 1
State 3:
if Symbol == LRC -> Ok
else Error
一旦你有了这个状态转换表,把它放入代码应该不是非常困难。