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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
Строка 5: Строка 5:
=Использование UART-портов (NUS) при помощи BLE<ref>[https://www.espruino.com/BLE+UART www.espruino.com - Bluetooth LE UARTs (NUS)]</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})].
По умолчанию у BLE-устройств вроде [https://www.espruino.com/Puck.js Puck.js] есть сервис [[Nordic UART]], который служит чем-то вроде последовательного порта для доступа к [[Espruino REPL]]. При необходимости его можно отключить при помощи [[Espruino:Справочник_по_API/Класс_NRF/setServices()|NRF.setServices({},{uart:false})]].


Вспомогательный скрипт «puck.js» позволяет получить доступ к UART из веб-браузера с Web Bluetooth – более подробно читайте в [http://wikihandbk.com/wiki/Espruino:Примеры/Использование_спецификации_Web_Bluetooth_с_Espruino этом руководстве].
Вспомогательный скрипт ''«puck.js»'' позволяет получить доступ к [[UART]] из веб-браузера с [[Web Bluetooth]] – более подробно читайте в [[Espruino:Примеры/Использование_спецификации_Web_Bluetooth_с_Espruino|этом руководстве]].


==Отправка ==
==Отправка ==


Если вы, имея одно Espruino-устройство, хотите подключиться к сервису UART на другом Espruino-устройстве, то можете просто воспользоваться для отправки данных модулем [https://www.espruino.com/modules/ble_simple_uart.js «ble_simple_uart»] (более подробно о модулях читайте [https://www.espruino.com/Modules тут]).
Если вы, имея одно [[Espruino-устройство]], хотите подключиться к сервису [[UART]] на другом [[Espruino-устройстве]], то можете просто воспользоваться для отправки данных модулем [https://www.espruino.com/modules/ble_simple_uart.js «ble_simple_uart»] (более подробно о модулях читайте [https://www.espruino.com/Modules тут]).


Используйте его следующим образом:
Используйте его следующим образом:
Строка 23: Строка 23:
</syntaxhighlight>
</syntaxhighlight>


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


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript" enclose="div">
Строка 33: Строка 33:
</syntaxhighlight>
</syntaxhighlight>


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


== Получение / выполнение ==
== Получение / выполнение ==
Строка 59: Строка 59:
</syntaxhighlight>
</syntaxhighlight>


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


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript" enclose="div">
Строка 74: Строка 74:
</syntaxhighlight>
</syntaxhighlight>


Примечание: Код выше напечатает что-то вроде:
'''Примечание:''' Код выше напечатает что-то вроде:


<syntaxhighlight lang="javascript" enclose="div">
<syntaxhighlight lang="javascript" enclose="div">
Строка 81: Строка 81:
</syntaxhighlight>
</syntaxhighlight>


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


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

Версия от 15:51, 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().

См.также

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