Формат данных для передачи / приема характеристики 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);
Другие вопросы по тегам