Arduino和Java之间的校验和功能

时间:2013-03-02 14:03:16

标签: java c serial-port arduino checksum

我正在实现从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;
}

2 个答案:

答案 0 :(得分:1)

我在所有数据到达之前读取缓冲区,因此我读取的数据少于21个字节,我认为已经到达。我假设在InputStreamin.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!
   }
{