如何计算句子的校验和?
// 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 ++)编程经验,所以我不确定什么是最佳方式,因为我需要它才能有效(因为很多句子在很短的时间间隔内得到处理)。对我来说,使问题复杂化的事情是,句子是由不同数据类型的组合形成的,而我在这个场合并没有接近专业人士。非常感谢。爱你,你们这些人真的很酷! :)
答案 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
,这是留给读者的练习。