SerialPort вопросы связи - PullRequest
       17

SerialPort вопросы связи

2 голосов
/ 19 января 2011

Я знаю, что связь SerialPort в .NET предназначена для отправки события DataReceived получателю, когда данные доступны и достигают порога.

Разве мы не можем использовать это событие DataReceived и запустить поток на стороне получателя, чтобы часто вызывать один из этих ReadXXX методов для получения данных?

Что произойдет, если получатель многомедленнее отправителя?Буфер SerialPort переполнится (данные потеряны)?

Ответы [ 3 ]

1 голос
/ 19 января 2011

В этом нет особого смысла, просто запустите поток чтения самостоятельно, после того, как откроете порт, и не беспокойтесь о DataReceived.Делать это по-своему сложно, сложно отменить подписку на событие DataReceived после того, как вы запустили поток, особенно в тот самый момент, когда данные принимаются.Вы не можете позволить себе иметь их обоих.

0 голосов
/ 14 мая 2011

Функция потока, который читает последовательный порт, может быть такой:

        private void ThreadRx()
        {
                while (true)
                {
                    try
                    {
                        if (this._serialPort.IsOpen == true)
                        {
                            int count = this._serialPort.BytesToRead;
                            if (count > 0)
                            {
                                byte[] Buffer = new Byte[count];
                                this._serialPort.Read(Buffer, 0, count);

                            //To do: Call your reception event (sending the buffer)
                            }
                            else
                            {
                                Thread.Sleep(50);
                            }
                        }
                        else
                        {
                            Thread.Sleep(200);
                        }
                    }
                    catch (ThreadAbortException ex)
                    {
                        //this exception is invoked calling the Abort method of the thread to finish the thread
                        break;//exit from while
                    }
                    catch (Exception ex)
                    {
                        //To do:call your error event
                    }
                }
        }

Не беспокойтесь о входном буфере, потому что поток может быть прочитан намного быстрее, чем скорость передачи данных последовательного порта.Вы можете даже использовать этот же код для чтения сокета tcp / ip.

0 голосов
/ 19 января 2011

Это работает, на самом деле это один из способов, которые я использовал в своем вопросе Постоянное чтение из последовательного порта с фоновым потоком .

Для вашего сценария вы можете прослушать DataReceived event, а затем запустить поток, который вызывает ReadExisting для порта, чтобы получить все доступные в настоящее время байты.Вы также можете проверить, сколько байтов ожидает в приемном буфере, посмотрев свойство SerialPort.BytesToRead.

Что касается переполнения вашего приемного буфера, а) он достаточно большой (вы можете проверитьсо свойством SerialPort.ReadBufferSize) и б) это не 1982 год, поэтому процессоры достаточно быстры, чтобы обрабатывать данные из порта, чтобы у него не было времени на заполнение (конечно, намного быстрее, чемпоследовательная скорость передачи данных).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...