2

我正在实现一个串行协议,用于从 Arduino 到 Java 的通信(一种方式)。

我从 Arduino 发送的每一帧都是这样的:

"G FF FF FFFF FFFF FFFF FFFF T" (The spaces are not part of the frame)
  • G表示帧开始,唯一可能的值是G.
  • Fs 是编码为 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;
}
4

2 回答 2

1

我在所有数据到达之前读取缓冲区,因此我读取的数据少于我假设已经到达的 21 个字节。我假设InputStream在它返回之前in.read(array[], offset, size)读取所有size字节,但显然它没有。– 暗淡

于 2016-08-30T13:15:35.213 回答
-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!
   }
{
于 2013-03-02T14:13:46.373 回答