C# читать поток Bluetooth надежно (InTheHand 32 футов)
У меня есть проблема с надежно читать поток Bluetooth. Это первый раз, когда я работал с подключениями Bluetooth. Приложение связывается с Arduino через модуль Bluetooth. Он отправит команду и получит ответ.
Например, ответ должен выглядеть примерно так:100,200,300,400
Вот что я получаю:1
и если я получу другой ответ (также, если он должен выглядеть совершенно иначе), я получу остаток от запрошенного ранее ответа:00,200,300,400
Иногда я даже получаю пустой ответ.
Вот код, который я использую для чтения и записи в поток:
void BluetoothClientConnectCallback(IAsyncResult result)
{
try
{
BluetoothClient client = (BluetoothClient)result.AsyncState;
client.EndConnect(result);
NetworkStream stream = client.GetStream();
stream.ReadTimeout = 1000;
_frm.printMsg("Connected!", false);
byte[] receive = new byte[1024];
while (true)
{
while (!ready) ;
if (stopConnection == true)
{
return;
}
try
{
stream.Write(message, 0, message.Length);
}
catch
{
_frm.printMsg("Error occurred while writing stream.", true);
}
try
{
if (Commands.awaitresponse == true)
{
Array.Clear(receive, 0, receive.Length);
readMessage = "";
do
{
stream.Read(receive, 0, receive.Length);
readMessage += Encoding.ASCII.GetString(receive);
}
while (stream.DataAvailable);
_frm.printMsg("Received: " + readMessage, false);
Commands.awaitresponse = false;
}
}
catch
{
_frm.printMsg("Error occurred while receiving stream.", true);
}
ready = false;
}
}
catch
{
_frm.printMsg("Error occurred while connecting.", true);
}
}
Я долго смотрел на это, но не мог прийти к решению.
1 ответ
Решение
После некоторой отладки и тестирования я сам пришел к решению.
Я добавил 1 секунду задержки Thread.Sleep(1000);
перед чтением потока.
Все пакеты теперь красные правильно.