MQTT 回调处理

MQTT callback handling

我正在尝试将传递给 mqtt 回调函数的 byte* 参数转换为 int 以进行比较,但我似乎无法让它工作。欢迎任何帮助。

int fsrReading;
void callback(char* topic, byte* payload, unsigned int length) {

  for (int i=0;i<length;i++) {

    Serial.print((char)payload[i]); // This works well

    fsrReading = int((char)payload[i]); 

    if (fsrReading < 0){
       ...

编辑:解释前的原始答案部分:

取决于编译器、编译器选项等 char 可以是 signedunsigned,通过 (char) 进行转换可能与您预期的不同。

示例:

有效载荷[i] 为 0x81

unsigned char -> 129,然后 >0

signed char -> -127,然后 <0

你通过 (char) 进行的转换是多余的(而且像我说的那样不稳定)

我不给出示例代码,因为我不明白你的目标。代码有矛盾。

免责声明:您的 byte 似乎不是标准类型。我 相信 那是 unsigned char 这样的类型永远不会 <0 .

这个变量的主要意义是什么?在深处,它是签名的还是未签名的?您可以施放 (unigned char) 但永远不会 <0 或 (signed char) - 取决于您

编辑: 在提问者的评论和从 knolleary hot 到解释长度的解释(重要:循环意义的改变,也许你理解作者正确)我给出纯 C 转换

 int val = 0;
  for (int i=0; i<length; i++) {
      val = val*10 + payload[i]-'0';
  }
// If someone know end of number is marked in different way, need implement break of `for`
  fsrReading =val;

我相信我的很少CPUcycles/RAM更好

EDIT2: 我读过一些来自 Arduino 社区的资料,循环连接成字符串的问题就像在许多语言中一样:很多很多小分配(虽然完全不需要连接这里)。许多优秀的 Arduino 程序员对 String 的过度使用至关重要。它不是 "secret knowledge",它是编程中的一般规则。

http://forum.arduino.cc/index.php?topic=185469.0

http://www.gammon.com.au/concat

执行此操作的正确方法取决于所使用的数字表示形式。

我怀疑该消息是数字的字符串表示形式:“1234”,它是作为 ascii 字节值数组接收的。

如果是这样,您可以重建一个 String 对象并将其转换为 int:

int fsrReading;
void callback(char* topic, byte* payload, unsigned int length) {
  String value = "";
  for (int i=0;i<length;i++) {
      value += (char)payload[i];
  }
  fsrReading = value.toInt();
  ...

A​​rduino 教程中有一个将 String 转换为 Int 的示例:https://www.arduino.cc/en/Tutorial/StringToIntExample