Вобщем - написал драйвер BT-канала (на SIM808). Тестирую. Впечатления пока самые грустные.
Модуль вобщем работает, работает нормально.... а потом в какой-то момент виснет обмен по UART.

((((
Использую только BT (+CFUN: 4, симка не вставлена и GPS выключен).
AT+BTSPPCFG=MC,0
AT+BTSPPCFG=TT,0
модуль в режиме сервера (принимает входящее подключение).
Скорость по UART - фиксированная 460800 бод.
Режим APP.
Использую только SPP профиль. Режим AT+BTSPPGET -
Manual (вначале написал обмен используя
Auto mode, но обнаружил, что модуль теряет входящие данные, если в данный момент идёт передача по AT+BTSPPSEND; а мне нужен полный дуплекс). Но ладно - фиг с ним - переписал на использование
+BTSPPMAN и
AT+BTSPPGET.
Как всё происходит:
Процессы коннекта/дисконнекта - всё ок (только одно соединение), спаривание - тоже ок.
Приём данных от удалённого устройства - тоже всё ок (но в эту сторону мне нужно мало данных передавать).
А вот с передачей (AT+BTSPPSEND) - затык. Передаю данные из кольцевого буфера (его заполняет отдельная задача ОС псевдослучайными данными).
Передаю так:
1. шлю "AT+BTSPPSEND".
2. жду предложения "> " или ERROR. Если получил первое - к след.шагу, ERROR - прерывание процесса.
3. передаю блок данных (DMA, размер блока 1...1024 байт - в зависимости от количества данных в кольцевом буфере и положения границы кольца).
4. жду "SEND OK" или "SEND FAIL" или "ERROR".
5. Если есть ещё данные в кольцевом буфере - перехожу к шагу 1.
Между 4 и 5 шагами периодически вставляются другие команды: запрос наличия входящих данных (AT+BTSPPGET), периодический опрос статуса (AT+BTSTATUS).
Вобщем всё работает нормально пока в очередной команде
AT+BTSPPSEND на шаге 4 модуль перестаёт отвечать. От слова "совсем". Ожидание длится бесконечно долго - от модуля ничего.
Думал - может по какой-то причине часть передаваемого блока байт модуль не принял и счётчик байт не обнулился у него? Хорошо - подключаю модуль к терминалке на компе, пытаюсь вручную дослать ему байты - без толку, сколько и что не шли модуль молчит. В этой ситуации он приходит в себя только после аппаратного сигнала RESET.
Данная ситуация наблюдается что с выключенным FC (AT+IFC=0,0) что с включенным hardware FC (AT+IFC=2,2). Причём я вообще никогда не наблюдаю чтобы модуль ставил CTS=1 в процессе работы (лог.анализатор всё время видит "0"). Только когда подаёшь RESET модуль ставит CTS=1.
Данный затык может произойти уже на 2...3 команде AT+BTSPPSEND от начала потока данных, а может и 20 команд передать, а потом повиснуть.
Пробовал ограничивать размер блока данных даже до 10 байт - почти ничего не меняется (ну чуть больше успевает команд проскочить до зависона).
Пробовал понизить скорость UART до 230400 бод - опять то же самое, но чуть больше команд AT+BTSPPSEND успевают передаться.
Даже сохранил +IPR и +IFC во флешь (AT&W) на всякий случай.
Единственное что помогает - вставить задержку не менее 4 мсек между 4-м и 5-м шагом. В этом случае передача идёт нормально, но всё равно в какой-то момент происходит то же самое зависание. Но успевает передаться иногда до 10 МБ данных (один раз удалось даже 24МБ передать). Но тем не менее всё равно происходит зависон.
Дальнейшее увеличение задержки до 8 мсек никак не влияет на ситуацию.
Опять-же -
всё это время сигнал CTS никак не шевелится!
И
зависания всегда происходят в одном и том же месте - на шаге 4.
PS: Вобщем пока не знаю что делать....

(((((
Ещё буду дальше искать баги в своём ПО (надеюсь что всё-таки где-то у меня баг). Но ощущение скверное - такое чувство, что где-то в SIM808 серьёзный баг в работе с UART.
Может ещё попробую перешить модуль новой прошивкой, но на это надежды почти нет.