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); перед чтением потока.
Все пакеты теперь красные правильно.

Другие вопросы по тегам