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
可以是 signed
或 unsigned
,通过 (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",它是编程中的一般规则。
执行此操作的正确方法取决于所使用的数字表示形式。
我怀疑该消息是数字的字符串表示形式:“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
我正在尝试将传递给 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
可以是 signed
或 unsigned
,通过 (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",它是编程中的一般规则。
执行此操作的正确方法取决于所使用的数字表示形式。
我怀疑该消息是数字的字符串表示形式:“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