2016-07-14 5 views
-1

Я программирую приложение в VB.Net, и я хочу читать полученные данные с последовательного порта в максимальной скорости передачи. Я использовал SerialPort компонент в моей форме и его свойства являются следующими:Прочитайте SerialPort в максимальном BaudRate в VB.Net

(BuadRate = 115200, бит данных = 8, Parity = нет, Стоп-биты = один)

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

С другой стороны, когда я использую connPort.ReadExisting, я могу прочитать все полученные данные в режиме реального времени без перегрузки данных в буфере, но полученные данные выглядят следующим образом:

Первый получил:
-12917
-12958
-13004

Второй получил:
-13055
-13118
-13181
-1324

Третьи получили:
-13320
-13391
-13463

Поэтому мне нужно парсер принимаемых данных построчно и по с другой стороны мне нужно обнаружить некоторые полученные ошибки данных:

...
-1324

Третий получил:
...

Правильным данные: -13246

Мой код:

Private Sub connPort_DataReceived _ 
    (ByVal sender As System.Object, _ 
    ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _ 
           Handles connPort.DataReceived 
    Dim rcData as String 
    rcData = connPort.ReadLine 
    dt_Write(rcData) 

    'rcData = connPort.ReadExisting 
    'dt_Write(rcData) 
End Sub 

' Save received data in a created DataTable 
Public dt As New DataTable 
Private Sub dt_Write(ByVal rcData As String) 
    dt.Rows.Add(New Object() {Nothing, rcData}) 
End Sub 

Я попробовал компонент Timer и Tick событие С одним миллисекундным свойством Interval (одна миллисекунда не является реальным разрешением) для получения данных, но огонь также медленнее, и есть также упомянутые проблемы.

Я ищу правильный путь, и я стараюсь избегать избыточных операций. Спасибо

+0

Можем ли мы увидеть код? 'ReadLine()' должен работать. Вы установили 'connPort.Newline'? –

+0

Спасибо за ваш комментарий Джим. Я добавляю свой код в вопрос. Когда я использую 'connPort.ReadLine()', у меня есть некоторые проблемы. Сначала я не определял свойство NewLine, но остальное я определил как «connPort.NewLine = Chr (13) .ToString' в инициализации, но он не решает мои проблемы, и на самом деле я не мог найти разницы. – farzad89

+0

Что произойдет, если вы используете 'connPort.Read()' вместо 'connPort.ReadLine()'? – djv

ответ

0

Мои друзья благодарит за комментарии. У меня возникла проблема с чтением данных в реальном времени при использовании компонента SerialPort в Vb.Net, и, наконец, я нашел решение. И я хотел поделиться с вами.

Как известно, событие не должно быть поднято для каждого полученного байта, и мы должны использовать свойство BytesToRead, чтобы определить, сколько данных осталось читать в буфере. https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived(v=vs.110).aspx

Я испытал новый способ, структура While...End While почти повторяется тысячу раз за 100 миллисекунд. Таким образом, он запускается очень быстро, чем любое событие, поэтому я использовал эту структуру в событии DataReceived, пока BytesToRead больше нуля. С помощью этой стратегии я смог прочитать полученные данные в реальном времени.

Мой код:

Private Sub connPort_DataReceived _ 
(ByVal sender As System.Object, _ 
ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) _ 
          Handles connPort.DataReceived 
    Dim rcData as String 

    While connPort.BytesToRead > 0 
     rcData = connPort.ReadLine 
     dt_Write(rcData) 
    End While 

End Sub 

' Save received data in a created DataTable 
Public dt As New DataTable 
Private Sub dt_Write(ByVal rcData As String) 
    dt.Rows.Add(New Object() {Nothing, rcData}) 
End Sub 
+0

Кроме того, мы можем использовать 'connPort.ReadTo (vbCrLf)' вместо 'connPort.ReadLine'. – farzad89