Приём данных

Для чтения данных из буфера RX используйте метод bt.getdata.

В типичной системе BLE постоянно нужно обрабатывать входящий поток данных. Простой подход - опрос. Вы в цикле проверяете буфер, есть ли в нём данные, и когда появляются новые, считываете их из буфера TX. Код использует bt.rxlen, чтобы проверить, ждут ли в буфере какие-либо данные:

'NOT RECOMMENDED!
...
while 1 'endless loop
	if bt.rxlen>0 then
		dim s as string=bt.getdata(255) 'process the data
	end if
	doevents 'allow other events to execute
wend
...

Такой подход работает, но навсегда оставит вас в цикле ожидания. Приложения TiOS устроены иначе, поэтому в общем случае его лучше избегать. Вместо этого используйте событие on_bt_data_arrival, которое генерируется всякий раз, когда в буфере RX есть данные:

sub on_bt_data_arrival
	dim s as string
	s = bt.getdata(255) ' Extract the data -- but in a non-blocking way.
end sub

Событие on_bt_data_arrival генерируется всегда, когда в буфере RX есть данные, но только один раз. В очереди никогда не ждут два события on_bt_data_arrival. Следующее событие может быть сгенерировано только после завершения обработки предыдущего (если в буфере RX всё ещё остались данные).

При обработке этого события читать все данные из буфера RX не обязательно. Можно обработать часть данных, и после выхода из обработчика будет сгенерировано новое событие того же типа, если необработанные данные остались.

Вот хороший пример реализации возврата данных (эхо) на устройстве. Он ещё и передаёт данные, а о передаче речь пойдёт только в следующей теме, но этот фрагмент приведён здесь как прекрасная иллюстрация того, как следует использовать событие on_bt_data_arrival в ваших приложениях.

sub on_bt_data_arrival
	bt.setdata(bt.getdata(bt.txfree))
	bt.send
end sub

Ещё несколько свойств и методов, связанных с буфером RX:

  • bt.peekdata позволяет «подсмотреть» данные в буфере RX
  • bt.rxclear удаляет все данные в буфере RX
Исходный материал Tibbo обновлён 12 сентября 2022Оригинал на docs.tibbo.com · Сообщить об ошибке