从VB.net 2008中的串口读取信息

时间:2009-11-02 13:26:10

标签: vb.net serial-port

我在砖墙上!

我有一个teperature PCB,通过串口报告温度。

我可以打开超级终端并接收我想要的所有数据 - 所以我知道该设备正在运行......但我想创建一个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 个答案:

答案 0 :(得分:2)

我需要将searialport1.DTREnable设置为true!

它现在有效 - 这是2个月的头痛不见了!

答案 1 :(得分:0)

你可能想放弃你的设计,转而使用SerialPort-Class的DataReceived-Event()。

如果已经到达一定数量的数据,将触发DataReceived-Event(我认为是DataReceivedThreshold-Property)。但是该事件将在另一个线程上触发,因此如果您尝试更改任何控件,请确保使用Invoke()。

答案 2 :(得分:-1)

也许THIS帖子可以帮到你。您需要将open语句更改为

...
open "COM1:" for Input as #1
Input #1, MyString
...