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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
Строка 15: Строка 15:
Используйте его следующим образом:
Используйте его следующим образом:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
   require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n", function() {
   require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n", function() {
Строка 25: Строка 25:
Кроме того, '''require("ble_simple_uart").write''' возвращает промис, который можно использовать в .then().
Кроме того, '''require("ble_simple_uart").write''' возвращает промис, который можно использовать в .then().


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
   return require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n");
   return require("ble_simple_uart").write(device, "digitalPulse(LED3,1,1000)\n");
Строка 41: Строка 41:
Здесь мы также воспользуемся вспомогательной функцией eval(), которая вычисляет выражение устройства, находящегося по ту сторону коммуникации, передаёт его обратно в виде JSON-строки, а затем парсит:
Здесь мы также воспользуемся вспомогательной функцией eval(), которая вычисляет выражение устройства, находящегося по ту сторону коммуникации, передаёт его обратно в виде JSON-строки, а затем парсит:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
var uart;
var uart;
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
Строка 61: Строка 61:
Но вы также, если нужно, можете воспользоваться '''on('data' ...)''' и write():
Но вы также, если нужно, можете воспользоваться '''on('data' ...)''' и write():


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
NRF.requestDevice({ filters: [{ namePrefix: 'Puck.js' }] }).then(function(device) {
   return require("ble_uart").connect(device);
   return require("ble_uart").connect(device);
Строка 77: Строка 77:
Код выше напечатает что-то вроде:
Код выше напечатает что-то вроде:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript">
Получили:"digitalPulse(LED,1,1"
Получили:"digitalPulse(LED,1,1"
Получили:"0);\r\n=undefined\r\n>"
Получили:"0);\r\n=undefined\r\n>"

Текущая версия от 19:55, 23 мая 2023

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


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

См.также

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