Espruino:Примеры/Использование UART-портов (NUS) при помощи BLE

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Использование UART-портов (NUS) при помощи BLE[1]

По умолчанию у BLE-устройств вроде Puck.js есть сервис Nordic UART, который служит чем-то вроде последовательного порта для доступа к Espruino REPL. При необходимости его можно отключить при помощи NRF.setServices({},{uart:false}).

Вспомогательный скрипт «puck.js» позволяет получить доступ к UART из веб-браузера с Web Bluetooth – более подробно читайте в этом руководстве.

Отправка

Если вы, имея одно Espruino-устройство, хотите подключиться к сервису UART на другом Espruino-устройстве, то можете просто воспользоваться для отправки данных модулем «ble_simple_uart» (более подробно о модулях читайте тут).

Используйте его следующим образом:

NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
  require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n", function() {
    print('Готово!');
  });
});

Кроме того, require("ble_simple_uart").write возвращает промис, который можно использовать в .then().

NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
  return require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n");
}).then(function() {
  print('Готово!');
});

Текст по UART можно передавать сколько угодно долго – модуль будет автоматически разбивать его на BLE-пакеты и отправлять дальше.

Получение / выполнение

Модуль «ble_simple_uart» просто отправляет данные. Но модуль «ble_uart» может также принимать данные. Для этого он держит соединение открытым, и когда всё будет готово, вам нужно будет вручную закрыть его при помощи disconnect().

Здесь мы также воспользуемся вспомогательной функцией eval(), которая вычисляет выражение устройства, находящегося по ту сторону коммуникации, передаёт его обратно в виде JSON-строки, а затем парсит:

var uart;
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
  return require("ble_uart").connect(device);
}).then(function(u) {
  uart = u;
  // Опционально. Ждём 0.5 секунд, пока из BLE-буфера
  // не будут отправлены находящиеся в нём данные, 
  // так как они могут пересечься с результатом eval():
  return new Promise(function(r) { setTimeout(r, 500); });
}).then(function() {  
  return uart.eval('E.getTemperature()');
}).then(function(data) {
  print("Получили температуру "+data);
  uart.disconnect();
});

Но вы также, если нужно, можете воспользоваться on('data' ...) и write():

NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
  return require("ble_uart").connect(device);
}).then(function(uart) {
  uart.on('data', function(d) { print("Получили:"+JSON.stringify(d)); });
  uart.write("digitalPulse(LED,1,10);\n"); // .then(...)
  setTimeout(function() {
    uart.disconnect();
    console.log("Отключились");
  }, 2000);
});
Примечание

Код выше напечатает что-то вроде:

Получили:"digitalPulse(LED,1,1"
Получили:"0);\r\n=undefined\r\n>"

Это происходит из-за того, что по умолчанию JavaScript-консоль (REPL) пересылает обратно все команды, которые ей были отправлены, также применяя к ним функцию eval(). Чтобы не допустить этого, перед командой можно поставить префикс \x10 или вообще отключить эхо-отображение с помощью функции echo().

См.также

Внешние ссылки