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。此外,您可能应该将其转换为String
可能是第三方Unicode字符串类。是的,你是对的,但我非常怀疑,因为微处理器上的内存是非常宝贵的资源。但是,它确实可以。从c_str()
返回的指针也可能立即无效。最好复制数据,以确保在响应完成之前数据保持有效。