Читайте информацию с последовательного порта в VB.net 2008 - PullRequest
0 голосов
/ 02 ноября 2009

Я у кирпичной стены!

У меня есть рабочая плата, которая сообщает о температуре через последовательный порт.

Я могу открыть Hyper Terminal и получить все нужные мне данные - поэтому я знаю, что устройство работает ... но я хочу создать приложение VB, чтобы использовать полученные данные.

Когда я запускаю программу, я получаю эту ошибку:

System.TimeoutException: The operation has timed out.
   at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count, Int32 timeout)
   at System.IO.Ports.SerialStream.Read(Byte[] array, Int32 offset, Int32 count)
   at System.IO.Ports.SerialPort.InternalRead(Char[] buffer, Int32 offset, Int32 count, Int32 timeout, Boolean countMultiByteCharsAsOne)
   at System.IO.Ports.SerialPort.ReadTo(String value)
   at System.IO.Ports.SerialPort.ReadLine()
   at Temperature.Form1.ReadFromCom() in C:\Documents and Settings\asamuel\Desktop\VB Project Sollutions\Temperature2\Temperature\Form1.vb:line 43

Может кто-нибудь ПОЖАЛУЙСТА, помогите мне! Я схожу с ума!

В гипертерминале данные поступают так:

R V1.0 2002-01-06 20:37:37 C
1 0027.00
2 0027.00
3 0027.06
4 0027.18
1 0027.00
2 0027.00
3 0027.06
4 0027.18
1 0027.00
2 0027.06

Код моего VB-приложения выглядит следующим образом:

Imports System
Imports System.IO.Ports
Imports System.Threading

Public Class Form1

    Dim SerialPort1 As New SerialPort
    Dim readThread As Thread = New Thread(AddressOf ReadFromCom)
    Dim abortThread As Boolean

    Public Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If Button1.Text Is "Start Capture" Then
            Try
                abortThread = False
                SerialPort1.Open()
                readThread.Start()
                Button1.Text = "Stop Capture"
            Catch ex As Exception
                MsgBox("Another program is already using COM1." & vbCrLf & vbCrLf & _
                       "Please try again later", MsgBoxStyle.OkOnly + MsgBoxStyle.Information, "COM1 Not Available")
            End Try

        ElseIf Button1.Text Is "Stop Capture" Then
            abortThread = True
            Button1.Text = "Start Capture"
        End If
    End Sub

    Public Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With SerialPort1
            .PortName = "COM1"
            .BaudRate = 2400
            .Parity = Parity.None
            .DataBits = 8
            .StopBits = 1
            .ReadTimeout = 500
        End With
    End Sub

    Public Sub ReadFromCom()
        While abortThread = False
            Try
                Dim message As String = SerialPort1.ReadLine
                updateStatus("Received: " & message)
            Catch ex As TimeoutException
                updateStatus(ex.ToString)
            End Try
        End While            
    End Sub

    Public Delegate Sub updateStatusDelegate(ByVal newStatus As String)
    Public Sub updateStatus(ByVal newStatus As String)
        If Me.InvokeRequired Then
            Dim upbd As New updateStatusDelegate(AddressOf updateStatus)
            Me.Invoke(upbd, New Object() {newStatus})
        Else
            TextBox1.Text = newStatus & vbCrLf & vbCrLf & TextBox1.Text
        End If
    End Sub
End Class

Ответы [ 3 ]

2 голосов
/ 02 ноября 2009

Мне нужно было установить searialport1.DTREnable на true!

Теперь работает - ушла головная боль за 2 месяца!

0 голосов
/ 02 ноября 2009

Может быть ЭТА запись может вам помочь. Вам нужно изменить открытый оператор на

...
open "COM1:" for Input as #1
Input #1, MyString
...
0 голосов
/ 02 ноября 2009

Возможно, вы захотите отказаться от своего дизайна в пользу использования DataReceived-Event () класса SerialPort.

Событие DataReceived будет инициировано, если поступит определенный объем данных (я думаю, DataReceivedThreshold-Property). Но событие будет запущено в другом потоке, поэтому убедитесь, что вы используете Invoke (), если попытаетесь изменить какие-либо элементы управления.

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