使用Arduino PubSubClient库发送两个字符串时遇无效操作数错误
问题解决方法
错误原因分析
- 直接传Arduino String报错,是因为这个移植版pubsub库的
publish函数不支持直接接收String类型,只接受const char*格式的字符串,且该库的publish函数签名可能需要3个参数(比如包含消息保留参数retain),和你熟悉的arduino-mqtt库逻辑不同。 - 用
c_str()转换后拼接报错,是因为const char*是指针类型,"confidence="是字符数组,C++里不能用+直接拼接指针和字符数组——这不是字符串拼接操作,而是地址偏移计算,所以编译器报错。
解决方案
方法一:用Arduino String先拼接再转const char*
先把所有内容拼接成完整的String对象,再通过c_str()转换成const char*,同时根据库的函数签名补充必要参数(比如retain通常传false):
// 拼接完整消息内容 String payload = String1 + "confidence=" + String2; // 调用publish,若库要求3个参数则补充retain参数 client.publish("telemetry", payload.c_str(), false); // 如果库允许2个参数(retain有默认值),直接写: // client.publish("telemetry", payload.c_str());
方法二:用snprintf拼接字符数组(更省内存)
如果担心String的内存开销,可用C标准库的snprintf直接拼接字符数组,注意提前定义足够大的数组空间:
// 定义足够大的字符数组,根据实际内容调整长度 char payload[128]; // 拼接内容到数组中 snprintf(payload, sizeof(payload), "%sconfidence=%s", String1.c_str(), String2.c_str()); // 调用publish函数 client.publish("telemetry", payload, false);
额外提示
你可以查看该移植版库的头文件(比如PubSubClient.h),确认publish函数的准确签名,常见的签名格式有两种:
// 带默认retain参数的版本 bool publish(const char* topic, const char* payload, bool retained = false); // 包含QoS参数的版本 bool publish(const char* topic, const char* payload, uint8_t qos, bool retained);
根据签名调整参数数量即可。
内容的提问来源于stack exchange,提问作者daneee
相关产品推荐
相关产品推荐

