2010-04-16 5 views
0

Я ранее читал данные 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 вызывается только с частичным статусом. Как я могу прочитать все заявление?

ответ

2

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

Each frame is both preceded and followed by a special FEND (Frame End) character, analogous to an HDLC flag. No CRC or checksum is provided. In addition, no RS-232C handshaking signals are employed.

Мое предложение состоит в том, чтобы разбить поток данных на сообщения путем декодирования символов кадра.

0

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

0

Смотреть это

Serial 101

+0

Эта статья является фантастическим, но я борюсь с тем, когда применить кодировку он пишет о. Я попытался это сделать при определении последовательного порта следующим образом: private SerialPort comport = new SerialPort(); comport.Encoding.GetEncoding ("Windows-1252"); Добавление его там дает мне неправильную ошибку токена. Рядом с моим заявлением. comport.Encoding.GetEncoding ("Windows-1252"); Строковые данные = comport.ReadExisting(); Это дает мне ошибку: не может быть доступ с ссылкой на экземпляр. Я не знаю, где это использовать. Не могли бы вы мне помочь? – rross

+0

в VB Dim зр Как Новый IO.Ports.SerialPort Private Sub Button1_Click (ByVal отправителем As System.Object, ByVal е Как System.EventArgs) Ханделс Button1.Click 'другие настройки последовательного порта ' перед открытым зр. Encoding = System.Text.Encoding.GetEncoding ("windows-1252") End Sub – dbasnett

Смежные вопросы