【问题标题】:MQTT callback handlingMQTT 回调处理
【发布时间】:2015-10-12 09:14:30
【问题描述】:

我正在尝试将传递给 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){
       ...

【问题讨论】:

    标签: c arduino mqtt iot


    【解决方案1】:

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

    我怀疑该消息是一个数字的字符串表示形式:“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();
      ...
    

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

    【讨论】:

    • 再来一个“最好的非标准 C++ 字符串实现”?在我看来,这是 C++ 语言失败的原因之一……我不知道 arduino 开发人员做出了这样的发明。抱歉讽刺。
    • 我在我的回答中使用了您对表示的理解(有什么不清楚的问题,作者没有发送完整的解释)。你能原谅我吗? ;) 讽刺不适合你,因为 C++ 库的一般奇怪演变。
    • 感谢您的帮助
    【解决方案2】:

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

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

    例子:

    有效载荷[i] 为 0x81

    无符号字符 -> 129,然后 >0

    有符号字符 -> -127,然后

    您通过 (char) 进行的演员阵容是多余的(并且像我说的那样不稳定)

    我不提供示例代码,因为我不了解您的目标。代码有矛盾。

    免责声明:您的byte 似乎是非标准类型。我 相信 那是 unsigned char 这样的类型绝不是

    这个变量的主要意义是什么?在深层,它是签名的还是未签名的?你可以投 (unigned char) 但永远不会(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;
    

    我相信我的 CPU 周期/RAM 更好。

    EDIT2:我从 Arduino 社区阅读了一些资料,将循环连接到 String 的问题在许多语言中都很相似:很多很多小分配(而这里完全不需要连接)。许多优秀的 Arduino 程序员对于过度使用 String 至关重要。这不是“秘密知识”,而是编程的一般规则。

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

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

    【讨论】:

    • 我的目标是将字节数组转换为int fsrReading。我正在考虑使用 for 循环来捕获每个字节数组元素,然后将其分配给 char 数组。本质上,我正在尝试获取传入字节数组的字符串表示形式,以便可以对 int 值进行比较。
    • 将一个字节转换为一个字符不会给你一个数字字符串
    • 同意 Hardillb。这样的数字序列有多长?由'\0'、分隔符、非数字字符等终止?但是您(user1907509)只打印一个字节/字符。这就是为什么代码很难理解的原因
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多