• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

BLE модуль JDY-10 на чипе TLSR8266

pvvx

Активный участник сообщества
И ещё с UART в TLSR8266.

DMA к UART привязано через некую китайскую "фичу". Это для мягкости выражения. Да и сам контроллер UART имеет ещё "фичи" - типа FIFO в 4 байта, в одном 32-х битном регистре. В этот регистр входные биты (RX) укладываются как в кольцевой буфер, с выработкой побайтного сигнала прерываний. Биты в принимаемых байтах в нем живые – сдвигаются по мере поступления и если считать байт до сигнала готовности, то получите неполные и сдвигаемые биты текущего принимаемого байта :)

Т.е. при работе по прерываниям с UART имеем 3 байта FIFO и 4-й - текущий неполноценный = задвигаемый в данный момент и всё более менее.

Но вот с DMA…

DMA задается тупо – просто считывает этот регистр в 32 бита по назначенному счетчику тиков у UART и кладет куда указано.

Если межсимвольный интервал на RX UART не равен нулю или не совпадает с тактом считывания DMA, то в буфере DMA получаем “незрелые входные байты” (с). Такова китай-фича у TLSR8266 c UART.

Для нормальной работы UART-DMA у TLSR8266 требуется передача в RX пакета без межсимвольных разрывов. Это ограничивает область применимости RX-UART-DMA в TLSR8266.

PS: Так-же, к примеру, не все терминалы на PC умеют работать с обычным UART. Прошли десятилетия, но многие так и не научились...
К не умеющим можно отнести https://sites.google.com/site/terminalbpp/ и многие другие “ТЕРМИНАЛЫ”. Конкретно указанный “Терминалище!” не умеет и не правильно выставляет межсимвольную паузу на TX. В среднем, от погоды(!), он ставит межсимвольную паузу в 1 ms, чем ограничивает трафик себе и создает проблемы для устройств отслеживающих размер блока по появлению межсимвольной паузы. Кроме межсимвольной паузы он ещё имеет стихийную задержку между блоками, возникающую от кратности сдвига Луны - размера буфера у дров UART…

Короче в помойку его и многие другие так горячо любимые в народе детсадовские программульки...
 

oleg_777

New member
В модуле JDY-33 нет никаких настроек интервалов и латентности (но зато есть двойной стек SPP и BLE). Поэтому и спрашивал может у вас с TLSR826x получилось больше выжать байт/сек. Просто пытаюсь выбрать оптимальное решение для коммер. изделий в плане интерфейса пользователя. Ладно значит остановлюсь на JDY-33 и закуплю здесь несколько сотен.

А поводу web serial что думаете вроде скорость 500 пакетов на нем получал.

Да кстати большое вам спасибо за ESP8266 свалку. Я исходники перебрал и теперь есть OTA, разные плюшки удобные, глюки разные поправил чтобы модуль более менее стабильно запускался и работал (просто это для тех пользователей кто прям хочет wifi, т.е. удаленный доступ к устройству). Но с вами я согласен что это все равно глючный чип.

Выше я выкладывал универсальный драйвер что насчет него скажете. Там есть работа с AJAX, WebSocket, BLE, Serial COM Port.
 

pvvx

Активный участник сообщества
В модуле JDY-33 нет никаких настроек интервалов и латентности (но зато есть двойной стек SPP и BLE).
А как же он тогда работает? Это протокол соединения и спецификация BT4.2
Поэтому и спрашивал может у вас с TLSR826x получилось больше выжать байт/сек.
Получится, безусловно, но это будет чисто специализированная вещь, про что и написал и что надо преодолеть... Но зачем она мне? Я на данном модуле просто откатываю разные алгоритмы и изучаю как ведут себя разные бытовые BLE устройства при связи, а не пишу Arduino подобное...
Просто пытаюсь выбрать оптимальное решение для коммер. изделий в плане интерфейса пользователя.
А там без шлюза никак. Т.е. вам придется учитывать что есть у обычных пользователей для связи с вашим модулем.
А поводу web serial что думаете вроде скорость 500 пакетов на нем получал.
Типовых пакетов BLE/BT4.0 по 20 байт? Или чистых BT без BLE? Это огромная разница.
Выше я выкладывал универсальный драйвер что насчет него скажете. Там есть работа с AJAX, WebSocket, BLE, Serial COM Port.
Нужная весчь, но пока занят другим. Погляжу обязательно. А пока руки не доходят даже слепить класс в js для UBIA... Пытался сделать набросок, но не завершил... Надо сначала решить более актуальные задачи с энтими BLE...
 

pvvx

Активный участник сообщества
Поправленный авто-перевод из:


Для канала BLE параметры соединения управляют частотой, с которой данные могут обмениваться между периферийным устройством и центральным устройством после установления соединения между ними.
Эти параметры согласовываются между центральным и ведущим во время установления канала.

Примеры параметров подключения следующие.

а. Connection interval (CI):

Центральный устанавливает CI, когда устанавливается соединение BLE между центральным и периферийным устройствами.
Периферийное устройство задает минимальное и максимальное значения интервала, которые являются верхним и нижним пределами интервала соединения, требуемого периферийным устройством.
Большинство центральных станций будут использовать некоторые CI по умолчанию и, как правило, игнорируют макс. и мин. CI указанные периферийным устройством.
Периферийное устройство должно генерировать запрос на обновление параметров соединения через некоторое время после установления соединения BLE, чтобы попытаться изменить CI, который находится в пределах требуемого диапазона.
Центральный будет отвечать интервалом соединения, который может или не может быть в этом диапазоне.
Если периферийное устройство принимает номер, это будет новый CI соединения.

б. Connection Timeout c. Тайм-аут соединения.

Интервал соединения и задержка ведомого устройства обычно влияют на производительность канала BLE больше всего. Чем меньше задержка ведомого устройства и чем меньше интервал соединения, тем выше эффективная скорость передачи данных между периферийным устройством и центральным устройством. С другой стороны, это также приводит к более высокому среднему потреблению тока в периферийных устройствах.
 

pvvx

Активный участник сообщества
Задержка у BLE возникает только в режимах LowPower, когда устройство работает c перемешиванием режимов sleep.
Выход из режимов sleep у большинства BLE чипов требует от 1.5..2.5 ms на раскручивание всяких задающих клоков и стабилизации внутренних цепей питания...
Если чип не использует sleep, то задержки нет и он может контролировать канал/каналы c дискретом менее времени передачи стандартного пакета...
Но зачем такой BLE, если его главное предназначение - пониженное потребление, достигаемое только за счет режимов sleep.
Берите тогда простой BT - там скорость BT-UART в разы больше.
 

pvvx

Активный участник сообщества
остановлюсь на JDY-33 и закуплю здесь
У продавца написана такое:
Bluetooth version: Bluetooth 3.0 SPP + BLE4.2

Bluetooth 3.0
Появившийся в 2009 году стандарт Bluetooth 3.0 поддерживает высокоскоростную передачу данных со скоростью до 24 Мбит/с.
+ https://ru.wikipedia.org/wiki/Bluetooth#Bluetooth_3.0_+_HS

Это совсем не BLE...
 

oleg_777

New member
Bluetooth 3.0 SPP - это задел для использования на компах (OS Windows) как обычный СОМ порт (есть в chrome как navigator.serial). А BLE4.2 у него это как раз для использования у пользователей на их смартах (только андроид) в chrome для создания интерфейса (pwa app) пользователя (есть в chrome как navigator.bluetooth).

А насчет "В модуле JDY-33 нет никаких настроек интервалов и латентности" имелось в виду что в модуле невозможно изменить заводские параметры. И скорее всего они в районе 30 - 40 мс.
 

pvvx

Активный участник сообщества
А насчет "В модуле JDY-33 нет никаких настроек интервалов и латентности" имелось в виду что в модуле невозможно изменить заводские параметры. И скорее всего они в районе 30 - 40 мс.
UBIA тоже говорит в линию что давай 20..80 ms, а клиент в виде USB-брелка лезет на connect с любой скоростью - от 7.5 до 30 ms.

Центральный устанавливает CI, когда устанавливается соединение BLE между центральным и периферийным устройствами.
Периферийное устройство задает минимальное и максимальное значения интервала, которые являются верхним и нижним пределами интервала соединения, требуемого периферийным устройством.
Большинство центральных станций будут использовать некоторые CI по умолчанию и, как правило, игнорируют макс. и мин.


Так-же и Android - лезет на любой скорости (connection interval).
В win ещё запоминается последняя скорость соединения и повторное соединение идет на ней. Если в предыдущей сессии менял на 7.5, то повторный коннект не всегда удается с первого раза - какие-то баги в дровах win.
 

pvvx

Активный участник сообщества
Походу, наверно, возникло недопонимание.
Connection interval соединения как устанавливается, так и устанавливается. Далее, уже на ходу, Connection interval меняется согласно спецификации BT командами дровам на такой, какой надо. Это не относится к каким-то заранее выставленным параметрам.
 

pvvx

Активный участник сообщества
olag_777 - В API должна быть команда смены Connection interval соединения.

Это я пока делаю это через свой модуль его командами для диагностики и отвязки от API.
Пример, лог соединения в
Код:
Requesting bluetooth device...
DOMException: User cancelled the requestDevice() chooser.
Requesting bluetooth device...
"tBLETST" bluetooth device selected
Connecting to GATT server...
GATT server connected, getting service...
Service found, getting characteristic...
Characteristic found
Starting notifications...
Notifications started
Send command #00: WhoIs?
#00 DeviceID: 1021, Ver: 0004
// Передаю команду модулю, чтобы сам модуль запросил изменение Connect parameters 
Set Connect parameters #04: interval 11.60 ms (real 11.25), timeout 1015 ms
// Опрашиваю - когда там оно изменится... не сменилось
 #04 Connect parameters [interval (min/max): 25/100 ms, latency: 0, timeout: 2000 ms]
Current Connect parameters (0) [interval: 60 ms, latency: 0, timeout: 9600 ms]
// Опрашиваю - когда там оно изменится... не сменилось
Send command #4: Get current connect parameters...
#04 Connect parameters [interval (min/max): 25/100 ms, latency: 0, timeout: 2000 ms]
Current Connect parameters (1) [interval: 60 ms, latency: 0, timeout: 9600 ms]
// Поменялся только флаг  '(1)' - есть движуха в эфире
// Ещё Опрашиваю - когда там оно изменится... т.к. пока не сменилось
Send command #4: Get current connect parameters...
#04 Connect parameters [interval (min/max): 25/100 ms, latency: 0, timeout: 2000 ms]
Current Connect parameters (1) [interval: 60 ms, latency: 0, timeout: 9600 ms]
// Ещё Опрашиваю - когда там оно изменится... т.к. пока не сменилось
Send command #4: Get current connect parameters...
#04 Connect parameters [interval (min/max): 25/100 ms, latency: 0, timeout: 2000 ms]
Current Connect parameters (3) [interval: 11.25 ms, latency: 6, timeout: 1010 ms]
// Сменился флаг на (3) - пришло уведомление в нутро дров стека/GATT/BLE.
// Ура interval сменился, оппонент согласился и сменил на 11.25 ms. 
// Можно выходить на работу с ADC на 3333 sps (> 6 килобайт в сек).
Send command #08: Init ADC (3333 sps)
#08 ADCConfig[6]: Pkt Count: 111, Channel: 9, Sample Rate: 3333, PGA Gain: 0x0000
Disconnecting from "tBLETST" bluetooth device...
Notifications stopped
"tBLETST" bluetooth device disconnected
И что говорит Power Profiler про это, для наглядности как менялся интервал приемника-передатчика:
1582531866875.png
 

pvvx

Активный участник сообщества
UBIA: UART throughput (sps).

Вход RX и TX на модуле замкнут.
В BLE передается блок для UART в 59 байт, в модуле он поступает в UART и тут-же принимается (перемычка на RX-TX) и принятое передается в BLE.

Для Connect Interval = 11.25 ms и UART 2 MBaud Rate:
1582543763433.png
Для Connect Interval = 7.5 ms и UART 115200 Baud Rate:
1582543799018.png
На графиках отмечены минимальные пики SPS (расчет sps ведется на транзакцию в 4 блока).
Общий throughput = RXsps + TXsps !
 

pvvx

Активный участник сообщества
Ну и как-бы предел для BLE4.2, 7.5 ms, LL=4, UART 4 Mbit/s, блок UART в 59 байт:
1582544809651.png
Для большего блока RX-TX будет больше, ещё есть издержки на заголовки блоков для UART в UBIA...
 

pvvx

Активный участник сообщества
Запрос-ответ - это самый оптимальный режим для WebBluetooth, т.к. отрабатывает по калбакам:
по событию "принял":
characteristic.addEventListener('characteristicvaluechanged', handleCharacteristicValueChanged);
производится передача нового блока.

И выходит, что USB-брелок(BT4.2) или smart c Android с модулем JDY-10 в WebBluetooth развивают скорость передачи данных в максимуме к 7 килобайтам (в одну сторону с подтверждениями и MTU на 9 пакетов).
Что в обе стороны (RX/TX) надо делить на 1.5..2.
 

pvvx

Активный участник сообщества
Кстати в chrome 80 теперь есть web serial - инфо
...
Я пока сделал небольшой драйвер для универсального подключения к различным модулям - пример
Это как раз то, про что я и говорил: чипы без USB никому ныне не сдались!
PS: ESP совсем мертв.
 

pvvx

Активный участник сообщества
подскажите не детсадовский терминал пожалуйста?
Универсальных не бывает.
К примеру 'Tera Term' не имеет такого кол-ва ошибок c UART. Но у него своя специфика.
Да и вообще в инете много программ "терминал".
Даже такая мелкая китайская прога и то лучше работает с COM портом:
1582557846774.png
А вообще советую забыть о том что ещё где-то есть RX-TX UART. Заменяйте на USB.
 

pvvx

Активный участник сообщества
я поэтому и спросил. этих "терминал" 100500 штук?
Я честно не понимаю в чем сложность выбора этих "терминалов".
Предполагаю, что это примерно так:
Загрузили, посмотрели, нравится/не нравится, если нравится - воткнули осел на выход USB-COM и поглядели как там оно... соответствует или нет тому что написано и выставлено в программе.
 

pvvx

Активный участник сообщества
Python нормально работает с COM-портами. Java, т.е. javascript Web Serial
- ещё не проверял.

Написать необходимый специализированный терминал на них - дело вечера. Это не публиковать его - раскрашивать и т.д. и ещё поддерживать...
 
Сверху Снизу