Формат данных для передачи / приема характеристики UART rx в зоне Bluetooth LE ANE
Я подключаюсь к Arduino через устройство Adafruit Bluefruit UART, используя bluetooth ANE от distriqt.
Я могу подключиться, найти сервис UART, найти характеристики и т. Д.
Однако, когда я отправляю данные в характеристику устройства, я не получаю ожидаемых ответов - все обновления дают мне нулевую длину для длины значения характеристики RX.
У меня есть приложение Bluefruit, и я могу видеть правильные ответы, когда отправляю команды через инструмент обмена сообщениями UART. Я получаю ответ нулевой длины только в том случае, если отправляю бессмысленную команду.
Это заставляет меня задуматься, отправляются ли данные в правильном формате. Код AS3, который делает это:
var value:ByteArray = new ByteArray();
value.writeUTFBytes( msg );
sendUpdateMsg("trying to write to tx - value: " + msg);
var readSuccess:Boolean = _peripheral.readValueForCharacteristic(_rxChannel);
sendUpdateMsg("trying to read from rx before tx - outcome: " + readSuccess);
var success:Boolean = _peripheral.writeValueForCharacteristic( _txChannel, value );
sendUpdateMsg("trying to write to tx - outcome: " + success);
sendUpdateMsg
Функция просто пишет сообщения в журнал на экране. Когда характеристика rx обновлена, обработчик события:
private function peripheral_characteristic_updatedHandler( event:CharacteristicEvent ):void
{
sendUpdateMsg( "peripheral characteristic updated: " + event.characteristic.uuid );
sendUpdateMsg( "length="+ event.characteristic.value.length.toString() );
sendUpdateMsg( "value="+ event.characteristic.value.readUTFBytes( event.characteristic.value.length ) );
}
Это всегда выводит ноль для длины и ничего для значения.
Например, если я отправляю "!D", нужно ли это трактовать иначе, чем:
var value:ByteArray = new ByteArray();
value.writeUTFBytes( "!D" );
для того, чтобы он был правильно принят службой UART?
У меня нет непосредственного доступа к Arduino - я могу попросить разработчика добавить некоторую отладку для меня, чтобы повторить то, что кажется бессмысленными сообщениями - но это не будет быстрым.
2 ответа
Проблема заключалась в том, что мне не хватало символа LF (0x0A) в конце сообщения.
Это работает:
var value:ByteArray = new ByteArray();
value.writeUTFBytes( msg );
if(value[value.length-1] != 0x0A) {
value.writeByte(0x0A);
}
... и позволяет мне добавлять 0x0A, только если это необходимо - в зависимости от того, пришло ли сообщение msg из текстового ввода или кодированной строки.
Это, вероятно, проблема, связанная с кодированием, старайтесь не использовать строку, просто байты intead
var ba:ByteArray = new ByteArray()
//Instead of "!D"
ba.writeByte(33);
ba.writeByte(68);