Последовательный порт ReadLine против ReadExisting или как правильно читать данные с последовательного порта

StackOverflow https://stackoverflow.com/questions/636758

Вопрос

Я читаю данные из последовательного порта. Данные зашкаливают. Теперь я использую Readline () и удаляю данные даже после удаления DiscardInBuffer () . Как правильно читать данные с последовательного порта? В Интернете так мало примеров, что я чувствую, что это какой-то святой Грааль, которого никто не понял.

Помогите, пожалуйста?

Похоже, последовательный порт - капризный ребенок.

C #, WinCE 5.0, тонкий клиент HP, Compact Framework 2.0

 private void WeighSample()
    {
        this._processingDone = false;
        this._workerThread = new Thread(CaptureWeight);
        this._workerThread.IsBackground = true;
        this._workerThread.Start();
    } //end of WeighSample()


    private void CaptureWeight()
    {
         globalCounter++;
         string value = "";


          while (!this._processingDone)
          {
              try
              {

                 value = this._sp.ReadLine();

                  if (value != "")
                  {
                      if (value == "ES")
                      {
                          _sp.DiscardInBuffer();
                          value = "";
                      }
                      else
                      {
                          this.Invoke(this.OnDataAcquiredEvent, new object[] { value });
                      }
                  }
              }
              catch (TimeoutException)
              {
                  //catch it but do nothing
              }
              catch
              {
                  //reset the port here?
                  MessageBox.Show("some other than timeout exception thrown while reading serial port");
              }
          }


    } //end of CaptureWeight()

Что касается моего приложения, следует отметить, что я запускаю поток (weightSample), когда курсор переходит на текстовое поле. Причиной этого является то, что вес также может быть введен вручную (часть требований). Поэтому я не знаю заранее, собирается ли пользователь нажимать на весах PRINT или вводить вес. В любом случае после получения данных я выхожу из рабочего потока. Также обратите внимание, что я не использую событие последовательного порта DataReceived, поскольку мне сказали, что это ненадежно.

Любые комментарии / идеи приветствуются. Это мой первый опыт работы с последовательными портами.

Это было полезно?

Решение

Мне никогда не повезло с работой ReadLine. Просто выполняйте чтение в локальный буфер всякий раз, когда данные доступны, а затем используйте отдельный поток для сканирования данных и поиска разрывов строк самостоятельно.

Другие советы

Зависит от того, что символ (ы) конца строки (EOL) для ваших входных данных. Если ваши данные ориентированы на строки, тогда ReadLine является допустимой функцией для использования, но вы можете захотеть взглянуть на свойство NewLine и убедиться, что оно установлено соответствующим образом для ваших входных данных.

Например, если ваша шкала выводит перевод строки для EOL, тогда установите port.NewLine = " \ n " ;;

http://msdn.microsoft. ком / EN-US / библиотека / system.io.ports.serialport.newline.aspx

Я хотел бы прокомментировать Элиаса Сантоса, но у меня недостаточно репутации. Есть некоторые ошибки при использовании метода ReadExisting:

https : //msdn.microsoft.com/en-us/library/system.io.ports.serialport.readexisting (v = vs.110) .aspx

  

Обратите внимание, что этот метод может оставить конечные байты в   внутренний буфер, в котором значение BytesToRead больше нуля.

Раньше я сталкивался с некоторыми проблемами с ReadExisting, и это из-за нежелательных байтов. Использование Readline решило эти проблемы.

if (serialPort1->IsOpen){
    if (serialPort1->BytesToRead>0){
        this->textBox1->Text += serialPort1->ReadExisting();
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top