Серийная ошибка чтения C # - PullRequest
1 голос
/ 24 января 2012

Я занимаюсь разработкой программного обеспечения, которое считывает данные, отправленные через COM-порт, и отображает значение в реальном графике и в текстовом поле (для отладки). Сначала он хорошо читается, но затем одно из чисел внезапно разделяется на две части. Как это:

63 - 64 - 65 - 66 - 67 - 6 - 8 - 69 - 70 - 80

Это должно сказать 68. Это делает график совершенно неправильным!

В чем причина этого?

Мой код выглядит следующим образом:

   private void DisplayText(object sender, EventArgs e)
    {
        textBox1.AppendText(RxString);
        textBox1.AppendText(" - ");

    }



    private void comPort_DataReceived_1(object sender, SerialDataReceivedEventArgs e)
    {
      RxString = comPort.ReadExisting();
      this.Invoke(new EventHandler(DisplayText));

      newRead = Convert.ToDouble(RxString);
      AddDataToGraph(zedGraph, howfar, newRead);
      howfar++;


    }

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 24 января 2012

Нет никакой гарантии, в каких размерах куски вы получите данные ....

они могут получать их по одному символу или по несколько символов за раз.

Как правило, никогдазависит от времени, чтобы определить разницу между логическими «кусками» (в вашем случае, числами).Вместо этого создайте протокол, который вы можете интерпретировать.

в вашем случае, если у вас ОЧЕНЬ простой протокол, в который вы отправляете число [пробел] число [пробел], то вы можете проанализировать

, например...

RxString += comPort.ReadExisting();  // add to an existing string
if(RxString.Contains(" ") // ok, there is a space, so we can parse out a number
{
  // parse...
  newRead = Convert.ToDouble(RxString.Substring(0,RxString.IndexOf(" "));
  RxString = RxString.Remove(0,RxString.IndexOf(" ")+1;
  AddDataToGraph(zedGraph, howfar, newRead);
  howfar++;
}

и если вы использовали 123,123,234,123,343 \ n

    RxString += comPort.ReadExisting();  // add to an existing string
    if(RxString.Contains("\n")   // ok, there is a linefeed, so we can parse out all the numbers
    {
       // parse...
       var line = RxString.Substring(0, RxString.IndexOf("\n"));
       var values = line.Split(new char[] {','}, StringSplitOptions.None).ToList();
       values.ForEach(v =>  AddDataToGraph(zedGraph, howFar, Convert.ToDouble(v)));
       RxString = RxString.Remove(0, RxString.IndexOf("\n"));
       howfar++;
    }
2 голосов
/ 24 января 2012

Вы, вероятно, получаете меньше данных, чем ожидаете. Если вы теперь знаете, сколько данных должно быть в ваших чанках, вам следует использовать некоторый буфер для хранения неполных чанков и ожидания оставшихся. Когда блок завершен, вы должны продолжить с AddDataToGraph (zedGraph, howfar, newRead).

...