C++ 如何将字符串转换为C++;(Arduino/C+;+;)?

C++ 如何将字符串转换为C++;(Arduino/C+;+;)?,c++,arduino,atmega,C++,Arduino,Atmega,我有一个字符串:string outputValue=”“,然后我将其附加到该字符串中,以构建一个类似JSON的结构来发送到远程设备。此代码使用Arduino引导加载程序在ATMEGA328P上运行。我通过执行outputValue+=“hello”来追加值 我用来发送值的库需要一个uint8\u t*作为它的有效负载,并与该有效负载的相关长度相关联。是否有任何方法将此字符串强制转换/转换为uint8_t数组,或者是否有一种首选的方法来执行生成器而不是使用字符串?我愿意接受任何建议 我用来测试库

我有一个字符串:
string outputValue=”“
,然后我将其附加到该字符串中,以构建一个类似JSON的结构来发送到远程设备。此代码使用Arduino引导加载程序在ATMEGA328P上运行。我通过执行
outputValue+=“hello”
来追加值

我用来发送值的库需要一个
uint8\u t*
作为它的有效负载,并与该有效负载的相关长度相关联。是否有任何方法将此字符串强制转换/转换为uint8_t数组,或者是否有一种首选的方法来执行生成器而不是使用字符串?我愿意接受任何建议

我用来测试库的工作代码如下所示。注意,这只是我将原始outputValue复制到记事本的结果,将每个字符用单引号括起来,然后硬编码这个新数组以测试:

uint8_t testCmd[] = { '{', '"', 'T', '"', ':', '"', 'A', '1', '"', ',', '"', 'E', '"', ':', '-', '1', ',', '"', 'I', '"', ':', '[', '[', '1', ',', '[', '[', '[', '[', '2', '5', '0', ',', '2', ']', ',', '[', '0', ',', '4', ']', ']', ']', ']', ']', ']', '}' };

ZBTxRequest txReq = ZBTxRequest(coordinatorAddr64, testCmd, sizeof(testCmd));   
ZBTxStatusResponse txResp = ZBTxStatusResponse();

xbee.send(txReq);

这样做:

String testString = "Test String";
uint8_t* pointer = (uint8_t*)testString.c_str();
int length = testString.length();
uint8_t testCmd[] = R"({"T":"A1","E":-1,"I":[[1,[[[[250,2],[0,4]]]]]]})";
编辑:

您应将其应用于您的问题,如下所示:

String testString = "Test String";
uint8_t* pointer = (uint8_t*)testString.c_str();
int length = testString.length();

ZBTxRequest txReq = ZBTxRequest(coordinatorAddr64, pointer, length);   
ZBTxStatusResponse txResp = ZBTxStatusResponse();

xbee.send(txReq);

您可以这样编写数组:

String testString = "Test String";
uint8_t* pointer = (uint8_t*)testString.c_str();
int length = testString.length();
uint8_t testCmd[] = R"({"T":"A1","E":-1,"I":[[1,[[[[250,2],[0,4]]]]]]})";
不同之处在于它将有48个元素,而不是像原来的47个元素,因为终止为0。由于您提供的是数据包的长度,您可以-1它:

ZBTxRequest txReq = ZBTxRequest(coordinatorAddr64, testCmd, sizeof(testCmd) - 1);   
ZBTxStatusResponse txResp = ZBTxStatusResponse();

xbee.send(txReq);
查看Arduino参考资料<代码>字符串对象具有方法以及。因此,您可以简单地尝试:

String testCmd R"({"T":"A1","E":-1,"I":[[1,[[[[250,2],[0,4]]]]]]})";

ZBTxRequest txReq = ZBTxRequest(coordinatorAddr64, (uint8_t *)testCmd.c_str(), (uint8_t)testCmd.length());   
ZBTxStatusResponse txResp = ZBTxStatusResponse();

xbee.send(txReq);

这是什么类型的字符串?另外,请使用序列化库/框架!将protobuf用于arduino。如果
String
甚至有一个
c_str()
方法返回指向原始字符数据的指针,并且它使用8位字符,那么这将起作用。如果
String
使用的是16/32位字符,则必须将
长度
乘以字符大小,假设库需要的是字节计数而不是字符计数。或者将
字符串
数据编码为8位格式,如UTF-8。此外,您可能应该将其转换为 const PoTeIn AdUnIO,它确实使用字符串上的8位字符。ARDUINO可能使用8位字符串,但OP没有说明在他的C++代码中使用了哪种<代码>字符串类。代码>字符串不是标准C++字符串(将是<代码> STD::String < /Cord>)。据我们所知,
String
可能是第三方Unicode字符串类。是的,你是对的,但我非常怀疑,因为微处理器上的内存是非常宝贵的资源。但是,它确实可以。从
c_str()
返回的指针也可能立即无效。最好复制数据,以确保在响应完成之前数据保持有效。