[英]Checksum function between Arduino and Java
我正在实现一个串行协议,用于从Arduino到Java的通信(一种方式)。
我从Arduino发送的每一帧都像这样:
"G FF FF FFFF FFFF FFFF FFFF T" (The spaces are not part of the frame)
G
表示帧开始,并且唯一可能的值是G
F
是编码为十六进制值的有效载荷。 可能的值: [0-F]
T
是校验和。 可能的值: [HZ]
为了计算校验和,我为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;
}
我在所有数据到达之前先读取缓冲区,因此我读取的数据少于我认为已到达的21个字节。 我假设在InputStream
, in.read(array[], offset, size)
在返回之前会读取所有size
字节,但显然不会。 –调光
该消息是字符串,因此您必须从字符转换为数字。 您很幸运,您的正确校验和为50%。
int charFromHex(char x)
{
if ((x >= '0') && (x <= '9'))
{
return x - '0';
}
else if ((x >= 'A') && (x <= 'F'))
{
return x - 'A' + 10;
}
else
{
return 0;
//somehow handle error!
}
{
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.