【问题标题】:Checksum function between Arduino and JavaArduino和Java之间的校验和功能
【发布时间】:2013-03-02 14:03:15
【问题描述】:

我正在实现一个串行协议,用于从 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;
}

【问题讨论】:

  • 普通串行连接的可靠性取决于许多工厂,如波特率(速度)、电缆、连接器、电磁杂散场等外部影响......
  • 使用 Arduino 上的 FTDI 芯片通过 USB 连接。速度:38400 波特
  • 尝试以最低速度测试连接,使用尽可能短的电缆而不使用任何奇怪的适配器。还要检查芯片组是否允许开启某种握手以避免缓冲区溢出。
  • 好的,现在我想我知道它可能是什么了。我认为我在所有数据到达之前读取了缓冲区,因此我读取的数据少于我假设已经到达的 21 个字节。我假设在InputStream 中,in.read(array[], offset, size) 在返回之前读取了所有size 字节,但显然它没有。
  • 总是检查系统调用的结果。

标签: java c serial-port arduino checksum


【解决方案1】:

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

【讨论】:

    【解决方案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!
       }
    {
    

    【讨论】:

    • 问题是校验和函数是否返回相同的字符。
    • 在这种情况下,FFFF 序列应该是你的线索,出了什么问题
    • 问题已解决。您可以在问题下方的 cmets 中阅读我与 alk 的对话。没有理由继续这个对话。
    猜你喜欢
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2014-04-17
    • 2012-03-24
    • 2021-08-16
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    相关资源
    最近更新 更多