繁体   English   中英

Arduino和Java之间的校验和功能

[英]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个字节。 我假设在InputStreamin.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM