PubSubClient.publish 尝试将 char 转换为 unsigned int 并抛出错误
PubSubClient.publish tries convert char into unsinged int and throws error
首先,我与经验丰富的程序员相差甚远,如果我在这里问初学者问题,请原谅我。
我在尝试使用 ESP8266 上的 PubSubClient 发布负载时遇到问题。我正在将 VS Code 与 Platformio 结合使用。
在构建过程中,我收到以下错误。看起来 PubSubClient 正在尝试将有效负载从 char 转换为 unsinged int,即使有效负载在 PubSubClient 库的 API 中定义为 const char。
src\main.cpp: In function 'void sendStatusViaMqtt(String)': src\main.cpp:389:39: error: invalid conversion from 'char*' to 'const uint8_t*' {aka 'const unsigned char*'} [-fpermissive] 389 | mqttClient->publish(relay_Status, mqttMessageCharArray, msglength, false); | ^~~~~~~~~~~~~~~~~~~~ | | | char* In file included from src\main.cpp:15: .pio\libdeps\esp12e\PubSubClient\src/PubSubClient.h:154:55: note: initializing argument 2 of 'boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int, boolean)' 154 | boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);
这是我使用的代码片段。实际上,根据 PubSubClient 文档,我特意将字符串转换为所需的字符。
void sendStatusViaMqtt()
{
unsigned long now = millis();
if (now - lastMqttMsg > 100000) //Making sure I only send messages after a certain time has elapsed
{
String mqttMessage = generateStatusString(); //Function generateStatusString()puts putting current values of variables of the running code on the ESP8266 into a String and returns it
unsigned int msglength = mqttMessage.length();
char mqttMessageCharArray[mqttMessage.length()];
mqttMessage.toCharArray(mqttMessageCharArray, mqttMessage.length()); //Generating a CHAR Array out of the String
lastMqttMsg = now;
Serial.print("Publish message: ");
Serial.println(mqttMessage);
mqttClient->publish(relay_Status, mqttMessageCharArray, msglength, false);
}
}
感谢任何提示!
你的 mqttMessageCharArray
是 char[]
类型(decays 到 char*
传递给函数),而你的 mqttClient->publish()
需要 uint8_t*
作为它的第二个参数。
只需将最后一行替换为 :-
即可修复
mqttClient->publish(relay_Status, (uint8_t*)&mqttMessageCharArray, msglength, false);
这里我们使用 &
获取 mqttMessageCharArray
的地址,然后将其转换为 uint8_t*
.
uint8_t
(又名无符号 8 位整数)在几乎每个系统上与 unsigned char
基本相同。根据定义,它们都是 1 字节大小,因此可以安全地在它们之间进行转换而不会丢失任何数据。
首先,我与经验丰富的程序员相差甚远,如果我在这里问初学者问题,请原谅我。
我在尝试使用 ESP8266 上的 PubSubClient 发布负载时遇到问题。我正在将 VS Code 与 Platformio 结合使用。
在构建过程中,我收到以下错误。看起来 PubSubClient 正在尝试将有效负载从 char 转换为 unsinged int,即使有效负载在 PubSubClient 库的 API 中定义为 const char。
src\main.cpp: In function 'void sendStatusViaMqtt(String)': src\main.cpp:389:39: error: invalid conversion from 'char*' to 'const uint8_t*' {aka 'const unsigned char*'} [-fpermissive] 389 | mqttClient->publish(relay_Status, mqttMessageCharArray, msglength, false); | ^~~~~~~~~~~~~~~~~~~~ | | | char* In file included from src\main.cpp:15: .pio\libdeps\esp12e\PubSubClient\src/PubSubClient.h:154:55: note: initializing argument 2 of 'boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int, boolean)' 154 | boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);
这是我使用的代码片段。实际上,根据 PubSubClient 文档,我特意将字符串转换为所需的字符。
void sendStatusViaMqtt()
{
unsigned long now = millis();
if (now - lastMqttMsg > 100000) //Making sure I only send messages after a certain time has elapsed
{
String mqttMessage = generateStatusString(); //Function generateStatusString()puts putting current values of variables of the running code on the ESP8266 into a String and returns it
unsigned int msglength = mqttMessage.length();
char mqttMessageCharArray[mqttMessage.length()];
mqttMessage.toCharArray(mqttMessageCharArray, mqttMessage.length()); //Generating a CHAR Array out of the String
lastMqttMsg = now;
Serial.print("Publish message: ");
Serial.println(mqttMessage);
mqttClient->publish(relay_Status, mqttMessageCharArray, msglength, false);
}
}
感谢任何提示!
你的 mqttMessageCharArray
是 char[]
类型(decays 到 char*
传递给函数),而你的 mqttClient->publish()
需要 uint8_t*
作为它的第二个参数。
只需将最后一行替换为 :-
即可修复mqttClient->publish(relay_Status, (uint8_t*)&mqttMessageCharArray, msglength, false);
这里我们使用 &
获取 mqttMessageCharArray
的地址,然后将其转换为 uint8_t*
.
uint8_t
(又名无符号 8 位整数)在几乎每个系统上与 unsigned char
基本相同。根据定义,它们都是 1 字节大小,因此可以安全地在它们之间进行转换而不会丢失任何数据。