MQTT回调处理

时间:2015-10-12 09:14:31

标签: c arduino mqtt iot

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

取决于编译器,编译器选项等char可以是signedunsigned,通过(char)投射可能与您期望的不同。

示例:

payload [i]是0x81

unsigned char - &gt; 129,然后> 0

signed char - &gt; -127,然后&lt; 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;

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

EDIT2:我从Arduino社区读过很少的资料,循环连接到字符串的问题就像许多语言一样:很多很小的分配(虽然这里完全不需要连接)。许多优秀的Arduino程序员对过度使用String至关重要。它不是秘密知识&#34;,它是编程的一般规则。

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

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