非常基本的VB.Net&串行IO问题

时间:2011-05-10 01:45:18

标签: vb.net serial-port

搜索后,我仍然遇到从VB.Net/VS2010中的串口读取数据的问题。我知道串口工作,我可以写到端口很好但是从它读取时没有任何反应。我过去3周只进行了编程,所以我仍然试着全神贯注。

程序必须运行以从门记录器捕获数据,然后我将数据输出到数据库(尚未实现 - 我希望首先对此部分进行排序)。 我尝试过使用多个终端程序以及另一个将数据输出到串行线上的设备,文本框tbxIn中没有显示任何内容。

非常感谢任何帮助。

代码如下:

Imports System.IO.Ports
Imports System.IO.Ports.SerialPort

Public Class Form1

Dim comPort As IO.Ports.SerialPort = Nothing
Dim sComPort As String = ""
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    GetSerialPortNames()
End Sub

Sub GetSerialPortNames()
    ' Show all available COM ports.
    For Each sp As String In My.Computer.Ports.SerialPortNames
        lstPorts.Items.Add(sp)
    Next
End Sub


Private Sub lstPorts_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstPorts.SelectedIndexChanged
    sComPort = lstPorts.SelectedItem
    Button1.Enabled = True
End Sub

Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    ' Open the serial port using the OpenSerialPort method
    Button1.Enabled = False
    Button2.Enabled = True

    Try
        comPort = My.Computer.Ports.OpenSerialPort(sComPort, 9600, IO.Ports.Parity.None, 8, 1)
        ' comPort.DtrEnable = True
        comPort.ReadTimeout = 500
        Do
            comPort.WriteLine("Go")
            Dim sIncomming As String = comPort.ReadLine()

            tbxIn.Text = sIncomming & vbCrLf
        Loop
    Catch ex As TimeoutException
        tbxIn.Text &= "Error: Serial Port Read Timeout" & vbCrLf
    End Try

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    comPort.Close()
    Button1.Enabled = True
    Button2.Enabled = False
End Sub

Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    tbxIn.Text = e.ToString
End Sub
End Class

1 个答案:

答案 0 :(得分:1)

确保这可以满足您的需求。您不需要设计器上的Serial1组件。删除它并使用此代码:

    Private comPort As IO.Ports.SerialPort = Nothing
Private sComPort As String = ""

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
    GetSerialPortNames()
End Sub

Sub GetSerialPortNames()


    ' Show all available COM ports.    
    For Each sp As String In My.Computer.Ports.SerialPortNames
        lstPorts.Items.Add(sp)
    Next
End Sub

Private Sub lstPorts_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lstPorts.SelectedIndexChanged
    sComPort = lstPorts.SelectedItem
    Button1.Enabled = True
End Sub

Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


    ' Open the serial port using the OpenSerialPort method    
    Button1.Enabled = False
    Button2.Enabled = True
    Try


        comPort = My.Computer.Ports.OpenSerialPort(sComPort, 9600, IO.Ports.Parity.None, 8, 1)
        ' comPort.DtrEnable = True      

        'must add handler
        AddHandler comPort.DataReceived, AddressOf SerialPort1_DataReceived

        comPort.ReadTimeout = 500
        Do
            comPort.WriteLine("Go")
            Dim sIncomming As String = comPort.ReadLine()
            tbxIn.Text = sIncomming & vbCrLf
        Loop
    Catch ex As TimeoutException
        tbxIn.Text &= "Error: Serial Port Read Timeout" & vbCrLf
    End Try
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    comPort.Close()
    'remove handler
    RemoveHandler comPort.DataReceived, AddressOf SerialPort1_DataReceived
    Button1.Enabled = True
    Button2.Enabled = False
End Sub
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
    tbxIn.Text = e.ToString
End Sub