2016-03-31 8 views
1

У меня есть строка, которая содержит как числа, так и значения символов, например, «p1200». Мне нужно преобразовать эту строку в массив uint8_t, потому что мне нужно отправить ее из моего xBee.Как преобразовать строку в массив uint8_t на Arduino?

Как я могу преобразовать

String dataString = "p1200"

в

uint8_t dataArray[]

?

Я попытался отправить эту строку, используя следующий код:

power = ((360 * pulseCount)/60); 
String dataString = "p" + power; 
char dataArray[sizeof(dataString)]; 
dataString.toCharArray(dataArray, sizeof(dataString)); 
XBeeAddress64 addr64 = XBeeAddress64(); 
addr64.setMsb(0x13A200); 
addr64.setLsb(0x406A42B7); 
ZBTxRequest zbTx = ZBTxRequest(addr64, (uint8_t *)dataArray, sizeof(dataArray)); 
xbee.send(zbTx); 

и получить строку, используя следующий код:

String incomingData; 
xbee.readPacket(); 
if (xbee.getResponse().isAvailable()) { 
    Serial.println(xbee.getResponse().getApiId()); 
    if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) { 
     xbee.getResponse().getZBRxResponse(rx); 
     for (int i = 0; i < rx.getDataLength(); i++) { 
      incomingData += (char)rx.getData(i); 
     } 
    } 
} 

При печати incomingData, я получаю странный вывод ... Я думал, что это вызвано преобразованием строки из строки в uint8_t

+0

Пожалуйста, [см. Это] (https://www.arduino.cc/ru/Reference/StringToCharArray). –

+0

@WeatherVane Я пробовал это, но он не работал – Engo

+0

Каким образом это не сработало? –

ответ

1

Использование getBytes (https://www.arduino.cc/en/Reference/StringGetBytes), чтобы скопировать байты из вашей строки в массив. Это ожидает byte[], и если https://www.arduino.cc/en/Reference/byte активно вводит в заблуждение, это должно быть то же самое, что и uint8_t[].

Вам понадобится массив, чтобы существовать уже и достаточно большой. Вы можете найти длину строки с ее методом length.

(я думаю, что getBytes предпочтительнее toCharArray, если это определенно uint8_t[] Вы желаете.)

Некоторые комментарии на ваш код

Выше было написано до Энго отправил код, и попытки просто чтобы ответить на вопрос. Но вот некоторые комментарии к коду.

  • Вызов sizeof на String почти наверняка не то, что вы хотите. Объект String может включать в себя другие вещи (например, информацию о длине) и может не включать фактические байты (которые могут быть, например, за указателем). Существует метод length; используй это. (Помня, что ваш буфер должен быть на один байт больше из-за завершающего нулевого символа.)
  • Я понятия не имею, что происходит с магическими цифрами в addr64 (я ничего не знаю о xBee), но предположим то, что вы там делаете, имеет смысл - но это похоже на то, что стоит проверить очень внимательно.
  • Вы говорите, что «получите странный результат», но было бы более полезно, если бы вы сказали нам, какой именно странный вывод, и, возможно, как (если вообще) он изменяется, когда вы меняете строку, которую вы пытаетесь передачи.
  • Ваш код ссылается на то, что я принимаю за переменную, называемую rx, но вы не показали нам, как она объявлена.
  • ZBRxResponse, как представляется, имеет метод, называемый getDataOffset. Опять же, я ничего не знаю об этом, но это то, что вы на самом деле пытаетесь вытащить из ответа, возможно, не начинать со смещения 0, а со смещением, указанным при вызове getDataOffset?
+0

Это результат, который я получаю: http://i.imgur.com/bhAHqHT.png – Engo

+1

Вы видите бит, который идет «@jB»? Коды ASCII этих символов в шестнадцатеричном формате - 40 6A 42. Это три байта вашего адр. 64 вашего. Поэтому позвольте мне снова указать на мой последний пункт. Я предполагаю, что ZBRxResponse содержит различные другие вещи помимо фактических данных, которые вы отправили, в том числе, в частности (некоторые из?), Которые вы указали, и что вы извлекаете данные из неправильного бита ZBRxResponse. Посмотрите, что возвращает 'getDataOffset'. Посмотрите, что произойдет, если вы начнете там вместо смещения 0. –

+1

(Вы также должны исправить значение 'sizeof', но в вашем коде, как написано, эффект этой ошибки, вероятно, будет менее впечатляющим.) –

1

гляньте HERE

uint8_t dataArray[dataString.length()]; 
dataString.toCharArray(dataArray, dataString.length()) 
Смежные вопросы