我正在实现一个串行协议,用于从 Arduino 到 Java 的通信(一种方式)。
我从 Arduino 发送的每一帧都是这样的:
"G FF FF FFFF FFFF FFFF FFFF T" (The spaces are not part of the frame)
G
表示帧开始,唯一可能的值是G
.F
s 是编码为 HEX 值的有效负载。可能的值:[0-F]
T
是校验和。可能的值:[H-Z]
为了计算校验和,我为 Arduino 和 Java 编写了一个函数。然而,使用这些函数,当我在 Java 端收到它们时,我得到了大约 50% 的损坏帧。
我认为这个问题与 Java 变量不能无符号这一事实有关。你能发现错误吗?或者一个简单的串行连接是否有可能破坏我发送的 50% 的帧?FRAME_LENGTH_WITHOUT_CRC
是 21。
Java代码:
char checksum(byte[] frame) {
short sum = 0;
for (short i = 0; i < Config.FRAME_LENGTH_WITHOUT_CRC; i++) {
sum += (char)frame[i];
}
return (char) ('H' + sum % 16);
}
Arduino C 代码:
char checksum(const char * str)
{
uint8_t sum = 0;
for (uint8_t i = 0; i < FRAME_LENGTH_WITHOUT_CRC; i++) {
sum += (uint8_t)str[i];
}
return 'H' + sum % 16;
}