我正在实现从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;
}
答案 0 :(得分:1)
我在所有数据到达之前读取缓冲区,因此我读取的数据少于21个字节,我认为已经到达。我假设在InputStream
中in.read(array[], offset, size)
在返回之前读取所有size
个字节,但显然它并不是。 - Dimme
答案 1 :(得分:-2)
消息是字符串,因此您必须将字符转换为数字。你很幸运,你有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!
}
{