2009-11-02 55 views
0

我在一堵砖墙上!从VB.net 2008的串口读取信息

我有一个高温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 
+0

什么问题?就你的问题而言,一切都进展顺利。 – 2009-11-02 13:28:05

+0

同意Konrad,告诉我们什么是或不正在发生与VB – 2009-11-02 13:49:10

+0

啊 - 对不起! 基本上,我运行程序时出现超时错误。 似乎没有任何信息通过COM1传出......但我知道它是! – 2009-11-02 14:02:14

回答

2

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

它现在的作品 - 这是一个2个月的头痛了!

0

你可能想赞成使用DataReceived-事件的减少您的设计()的SerialPort类。

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

+1

+1 - 我还建议查看PCB发送的行尾字符,以确保它与串行端口类在ReadLine()函数中所期望的相符,尽管我同意@Bobby基于事件的模型是要走的路。 – 2009-11-02 14:18:03

+0

@Miky D:提及ReadLine()/ NewLine-Character事物的+1 ...我总是忘记这一点。 :d – Bobby 2009-11-02 14:22:09

+0

我改成 私人小组DataReceived1(BYVAL发件人为对象,BYVALË作为System.IO.Ports.SerialDataReceivedEventArgs)处理SerialPort1.DataReceived MSGBOX( “W”) ListBox1.Invoke(新myDelegate1(AddressOf新的对象(){}) 但没有任何反应 我添加了msgbox,看看子有没有触发 - 它不? – 2009-11-02 14:39:20

-1

也许THIS后可以帮助你。您需要将开放声明更改为

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

Ahm ...我不想被粗鲁,噢,上帝没有......但是这就像使用木制日志作为螺丝刀一样......至少在DotNET中(你链接的帖子是VBA,这是更有限的)。 – Bobby 2009-11-02 14:17:27

+0

此代码甚至不能在.NET中工作。 – 2009-11-02 14:53:39

+0

true Konrad ...抱歉 - 我的VBA内容太深 – MikeD 2009-11-02 15:12:25