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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
(Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighligh...»)
 
Нет описания правки
Строка 3: Строка 3:
{{Myagkij-редактор}}
{{Myagkij-редактор}}


=<ref>[ www.espruino.com - ]</ref>=
=Использование UART-портов (NUS) при помощи BLE<ref>[https://www.espruino.com/BLE+UART www.espruino.com - Bluetooth LE UARTs (NUS)]</ref>=


По умолчанию у BLE-устройств вроде [https://www.espruino.com/Puck.js Puck.js] есть сервис Nordic UART, который служит чем-то вроде последовательного порта для доступа к Espruino REPL. При необходимости его можно отключить при помощи [http://wikihandbk.com/wiki/Espruino:Справочник_по_API/Класс_NRF/setServices() NRF.setServices({},{uart:false})].


<syntaxhighlight lang="html5" enclose="div">
Вспомогательный скрипт «puck.js» позволяет получить доступ к UART из веб-браузера с Web Bluetooth – более подробно читайте в [http://wikihandbk.com/wiki/Espruino:Примеры/Использование_спецификации_Web_Bluetooth_с_Espruino этом руководстве].
 
==Отправка ==
 
Если вы, имея одно Espruino-устройство, хотите подключиться к сервису UART на другом Espruino-устройстве, то можете просто воспользоваться для отправки данных модулем [https://www.espruino.com/modules/ble_simple_uart.js «ble_simple_uart»] (более подробно о модулях читайте [https://www.espruino.com/Modules тут]).
 
Используйте его следующим образом:
 
<syntaxhighlight lang="javascript" enclose="div">
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
  require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n", function() {
    print('Готово!');
  });
});
</syntaxhighlight>
 
Кроме того, require("ble_simple_uart").write возвращает промис, который можно использовать в .then().
 
<syntaxhighlight lang="javascript" enclose="div">
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
  return require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n");
}).then(function() {
  print('Готово!');
});
</syntaxhighlight>
 
Текст по UART можно передавать сколько угодно долго – модуль будет автоматически разбивать его на BLE-пакеты и отправлять дальше.
 
== Получение / выполнение ==
 
Модуль [https://www.espruino.com/modules/ble_simple_uart.js «ble_simple_uart»] просто отправляет данные. Но модуль [https://www.espruino.com/modules/ble_uart.js «ble_uart»] может также принимать данные. Для этого он держит соединение открытым, и когда всё будет готово, вам нужно будет вручную закрыть его при помощи disconnect().
 
Здесь мы также воспользуемся вспомогательной функцией eval(), которая вычисляет выражение устройства, находящегося по ту сторону коммуникации, передаёт его обратно в виде JSON-строки, а затем парсит:
 
<syntaxhighlight lang="javascript" enclose="div">
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();
});
</syntaxhighlight>
 
Но вы также, если нужно, можете воспользоваться on('data' ...) и write():
 
<syntaxhighlight lang="javascript" enclose="div">
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);
});
</syntaxhighlight>
 
Примечание: Код выше напечатает что-то вроде:
 
<syntaxhighlight lang="javascript" enclose="div">
Получили:"digitalPulse(LED,1,1"
Получили:"0);\r\n=undefined\r\n>"
</syntaxhighlight>
 
Это происходит из-за того, что по умолчанию JavaScript-консоль (REPL) пересылает обратно все команды, которые ей были отправлены, также применяя к ним функцию eval(). Чтобы не допустить этого, перед командой можно поставить префикс \x10 или вообще отключить эхо-отображение с помощью функции echo().


=См.также=
=См.также=

Версия от 15:49, 6 марта 2021

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


Использование 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().

См.также

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