如何在C ++(Arduino / C ++)中将String转换为uint8_t?

时间:2018-05-02 23:19:26

标签: c++ arduino atmega

我有一个字符串:String outputValue = "",然后我附加它以构建类似JSON的结构以发送到远程设备。此代码使用Arduino引导程序在ATMEGA328P上运行。我通过outputValue += "hello"附加值。

我用来发送值的库需要一个uint8_t *的有效负载以及该有效负载的相关长度。有没有办法将此String转换/转换为uint8_t数组,还是有一种首选方法来构建构建器而不是使用String?我对任何建议持开放态度

我用来测试库的工作代码如下。请注意,这只是我将原始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);

2 个答案:

答案 0 :(得分:2)

是的。

做这样的事情:

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

编辑:

您应该按照以下方式将其应用于您的问题:

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);

答案 1 :(得分:1)

您可以像这样编写数组:

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对象具有c_str()方法以及length()。所以你可以试试:

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);