Очень простая проблема VB.Net & Serial IO - PullRequest
3 голосов
/ 10 мая 2011

После поиска у меня все еще есть проблемы с чтением данных с последовательного порта в 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 Ответ

1 голос
/ 08 июня 2011

Довольно уверен, что это даст вам то, что вам нужно.Вам не нужен компонент 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...