У меня есть строка: String outputValue = ""
Затем я добавляю JSON-подобную структуру для отправки на удаленное устройство. Этот код выполняется на ATMEGA328P с использованием загрузчика Arduino. Я добавляю значения, делая outputValue += "hello"
,
Библиотека, которую я использую для отправки значений, нуждается в uint8_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();
РЕДАКТИРОВАТЬ:
Вы должны применить это к вашей проблеме следующим образом:
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);
Вы можете написать свой массив следующим образом:
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 () метод, а также длина (). Так что вы можете просто попробовать:
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);