[英]Read information from a serial port in VB.net 2008
I'm at a brick wall! 我在砖墙上!
I have a teperature PCB that reports the temp back via serial port. 我有一个功能性PCB,可通过串行端口报告温度。
I can open Hyper Terminal and receive all the data I want - so I know the unit is working... but I want to create a VB app so I can use the data received. 我可以打开超级终端并接收我想要的所有数据-所以我知道设备正在运行...但是我想创建一个VB应用程序,以便可以使用接收到的数据。
When I run the program I get this error: 当我运行程序时,出现此错误:
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
Can someone PLEASE help me! 有人可以帮帮我吗! I'm going mad! 我快疯了!
In hyper terminal the data comes through like this: 在超级终端中,数据通过这样的方式来传递:
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
My VB app code looks like this: 我的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
I needed to set searialport1.DTREnable to true! 我需要将searialport1.DTREnable设置为true!
It now works - that's a 2 month headache gone! 现在可以正常工作了-头痛了2个月了!
You might wanna drop your design in favor of using the DataReceived-Event() of the SerialPort-Class. 您可能希望放弃设计,转而使用SerialPort-Class的DataReceived-Event()。
The DataReceived-Event will be fired if a certain amount of data has arrived (DataReceivedThreshold-Property, I think). 如果到达一定数量的数据(我认为是DataReceivedThreshold-Property),则将触发DataReceived-Event。 But the event will be fired on another thread, so make sure that you use Invoke() if you try to change any controls. 但是该事件将在另一个线程上触发,因此如果尝试更改任何控件,请确保使用Invoke()。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.