Приём данных
Для чтения данных из буфера 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