计算句子的校验和(XOR)(由不同变量/类型的组合形成)

时间:2018-01-22 01:48:43

标签: c++ arduino checksum

如何计算句子的校验和?

// Calculate checksum of characters between $ and *, not including & and *
$HMTV,13534,-58,50:65,00,0F,40,*

校验和,我知道是所有字符的XOR的两个十六进制字符的表示(但不包括$和*字符)。上面的句子由下面显示的片段生成。我想添加校验和(在*之后),以便我可以验证接收它的另一侧的句子。这些数据是由Serial.printf发出的(除非有更好的方法吗?)

以下是生成上述句子的代码

void setup() 
{
  char devid[6];
  char bledata[9];
  char scantimestamp[16]; // ( the source is int32_t )
  char rssilevel[11]; // (the source is int8_t )

      snprintf(devid, 6, "%02X:%02X",  
          records[i].addr[1],
          records[i].addr[0]
      );
      snprintf(bledata, 9, "%02X,%02X,%02X",  
          records[i].advData[2],
          records[i].advData[1],
          records[i].advData[0]
      );
      sprintf(scantimestamp,"%lu", records[i].timestamp);
      sprintf(rssilevel, "%d", records[i].rssi);          
      Serial.printf("%s,%u,%i,%s,%s\n", "$HMTV", records[i].timestamp, records[i].rssi, devid, bledata);
}

上述句子的校验和(通过异或)应该是75.所以我想把它添加到句子的末尾,使它像这样

$HMTV,13534,-58,50:65,00,0F,40,*75

并将其发送出去,以便我可以验证另一方的校验和。我只有大约2天的Arduino(c ++)编程经验,所以我不确定什么是最佳方式,因为我需要它才能有效(因为很多句子在很短的时间间隔内得到处理)。对我来说,使问题复杂化的事情是,句子是由不同数据类型的组合形成的,而我在这个场合并没有接近专业人士。非常感谢。爱你,你们这些人真的很酷! :)

1 个答案:

答案 0 :(得分:1)

我建议在尝试使用Arduino之前尽可能在PC上调试Arduino程序。

那就是说,

1)将文本读入std::string变量:

std::string text;
std::getline(cin, text);

2)循环遍历字符串,处理每个字符:

uint8_t checksum = 0;
unsigned int index = 1; // Skip $ character at beginning
const unsigned int length = text.length();
for (; (index < length); ++index)
{
  const char c = text[index];
  if (c == '*')
    break;
  checksum = checksum ^ c;
}

剩下的部分是输出数据和checksum,这是留给读者的练习。