TBytes FData;
FData=Socket->ReceiveData(100);
len_rx=FData.Length;
Memo1->Lines->Add(len_rx);
Memo1->Lines->Add(TEncoding::UTF8->GetString(FData));
len_rx=0;
if(len_rx == 0)
{
TArray__1<System::Byte> * buffer = new TArray__1<System::Byte>;
buffer->set_length(6);
(*buffer)[0] = 'r';
(*buffer)[1] = 'e';
(*buffer)[2] = 's';
(*buffer)[3] = 'e';
(*buffer)[4] = 't';
(*buffer)[5] = 0x0D;
Socket->SendData(*buffer);
delete buffer;
}
Вышеприведенный код запускается по таймеру каждую секунду - командой "reset" целевое устройство отправляется в перезагрузку, после чего отвечает, мол здесь я.
То есть вначале проверяется нет ли чего в буфере приема (не ответило ли целевое устройство), а если ответа нет, команда на ресет подается повторно.
То что len_rx принудительно сбрасывается в ноль - не обращайте внимания, это временно для отладки.
Так вот, что меня смущает - количество байт в FData, почему то всегда равно размеру buffer
Я было подумал, что где-то я эти переменные приравниваю друг к другу - ан нет. То, что оказывается в FData, является правильными данными, то есть тем, что шлет целевое устройство в ответ.
В чем причина? И чем отлиючаются ReadData и ReceiveData? Это буфера или нет? Как они работают? Что-то не густо информации в интернете.
Вот дока http://docwiki.embarcadero.com/Libraries/Berlin/en/System.Bluetooth.TBluetoothSocket.ReadData
но она как-то не сильно помогает.
Хм... для меня явилось откровением, что оказывается сопряжение то и не требуется чтобы подключиться к устройству...
У меня до этого была какая-то библиотека на Java, так она вообще работала только лишь с сопряженными устройствами. Что и сбило меня с толку.
Попробовал без сопряжения- сокет создается, данные гонятся.
Так что можно считать, что проблема исчерпана.