Чтение двоичных данных из последовательного порта - PullRequest
0 голосов
/ 16 апреля 2010

Ранее я читал данные NMEA из GPS через последовательный порт, используя C #. Сейчас я делаю нечто подобное, но вместо GPS из серийника. Я пытаюсь прочитать Заявление KISS от TNC. Я использую этот обработчик событий.

comport.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);

Вот port_DataReceived.

        private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        string data = comport.ReadExisting();

        sBuffer = data;

        try
        {
            this.Invoke(new EventHandler(delegate { ProcessBuffer(sBuffer); }));
        }
        catch { }
    }

У меня проблема в том, что метод вызывается несколько раз за оператор. Таким образом, метод ProcessBuffer вызывается только с частичным определением. Как я могу прочитать все заявление?

Ответы [ 3 ]

2 голосов
/ 16 апреля 2010

Последовательная связь позволяет разбить поток данных на сообщения, используя тайм-аут. Но следуя KISS TNC в этом протоколе такие функции не представлены.

Каждый кадр предшествует и сопровождаемый специальным FEND (конец кадра) символ, аналогичный флагу HDLC. CRC или контрольная сумма не предоставляются. В Кроме того, нет рукопожатия RS-232C сигналы используются.

Я предлагаю разбить поток данных на сообщения путем декодирования символов конца кадра.

0 голосов
/ 17 апреля 2010

Смотрите это

Серийный 101

0 голосов
/ 17 апреля 2010

Володя прав: вам нужно искать FEND (0xC0) и пытаться обрабатывать буфер только тогда, когда вы его видите.

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