Kommunikation über die serielle Schnittstelle mit VB.Net (Ports dont show up)

Erstens ich bin nicht sehr gut im Programmieren und ich habe versucht, so erklärend wie möglich in meine codes. Ich habe versucht ein Programm zu schreiben, die es einem Benutzer zu chatten (recieved & übertragung) von Nachrichten über die Serielle Schnittstelle mit einem einfachen maßgeschneiderte IR-modem. Ich habe gebaut, das modem an, und versucht nun das schreiben meiner eigenen simple Programm statt der Verwendung von Terminal-oder andere bereits geschriebene Programm (z.B. Tera Term). Btw, ich bin auf Windows 7 und mit Microsoft Visual Express 2010-Umgebung

Ich geschrieben habe, einen der folgenden codes, basierend auf dem tutorial auf dieser Website.
(setzen Sie hier nur für den Fall)
MSDN-auf Serielle Schnittstelle

Problem (Stand jetzt)
Die combo-Boxen cmbComPort scheint nicht zu fangen, die alle verfügbaren ports auf meinem computer. Ich vermutete, dass wahrscheinlich gibt es keine! Also ich überprüfte, und hier ist was ich gefunden habe. Basierend auf dieser, ich nehme an, es gibt einen Seriellen Anschluss auf meinem computer und daher ist dies nicht die Quelle des Problems (Lassen Sie mich wissen, ansonsten, da bin ich nicht wirklich sicher). Ich ausführen die debug-und eine Fehlermeldung auftauchte. Ich habe dann erstellen Sie das Programm, um es zu testen. Beide Fehlermeldungen sind unten angehängt

Fragen
1. Scheint, wie die folgenden codes nicht fangen die verfügbaren ports und speichern Sie Sie in der myPort-array.

'procedure to detect all available ports and store them in the myPort array
    For Each port_name As String In IO.Ports.SerialPort.GetPortNames
        Dim myPort As New IO.Ports.SerialPort(port_name)
        If myPort.IsOpen = True Then
            cmbComPort.Items.Add(port_name)
        End If
    Next

Fragte ich mich, ob der Hafen selbst ist problematisch und nicht erkannt. Jedoch, die Verwendung von codes unten, ich war in der Lage zu bestätigen, dass COM1 existieren und arbeiten.

Imports System
Imports System.IO.Ports

Module SerialPortExample

Sub Main()
' Get a list of serial port names. 
Dim ports As String() = SerialPort.GetPortNames()

Console.WriteLine("The following serial ports were found:")

' Display each port name to the console. 
Dim port As String 
For Each port In ports
    Console.WriteLine(port)
Next port

Console.ReadLine()

End Sub 
End Module

Hier ist, was die Ausgabe der Konsole -

Die folgenden seriellen ports gefunden wurden: COM1

So, der Anschluss ist da. Das problem liegt wahrscheinlich (ich bin mir nicht ganz sicher sowieso) auf diesem Teil des codes?

'procedure to detect all available ports and store them in the myPort array
For Each port_name As String In IO.Ports.SerialPort.GetPortNames
    Dim myPort As New IO.Ports.SerialPort(port_name)
    cmbComPort.Items.Add(port_name)
Next

Ist es trotzdem kann ich den Inhalt überprüfen von myPort-array nach dieser Zeile? ebenso wie die Elemente der cmbComPort?

Eins noch, dies ist ein Projekt, übernimmt Sie zusätzliche Funktionen (schreiben, mein eigenes Programm ist definitiv eine). Ich könnte schätzen, wenn Sie Kerle ablegen kann, irgendwelche Ideen auf die Funktionen, ob im Zusammenhang mit der Kommunikation über die serielle Schnittstelle oder die Programm-Oberfläche selbst. Ich denke, der kann ein paar, wie Chats Speichern, um die Datei, Laden Sie Chat-Dateien, Hilfe/Tutorial-Datei - alle werden umgesetzt werden, sobald ich herausgefunden, dass die oben genannten Fehler. Außerdem, dachte ich, ist es trotzdem kann ich zeichnen Sie eine 'Blase chat" Anzeige der Gespräche anstelle der einfachen rich-text-Feld? das wäre schön.

Vielen Dank im Voraus! 😀
Projekt-Dateien

CODES:

'Chatty Raffy Version 1.3
'This is a simple program to demonstrate Serial Ports communication via a simple custom made IR Modem. 

Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports

Public Class frmMain

Dim myPort As Array  'an array to store list of available ports

Delegate Sub SetTextCallback(ByVal [text] As String) 'Added to prevent threading errors during receiveing of data

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

    'Fill up the cmbBaudRate Combo box to common baud rates used
    cmbBaudRate.Items.Add(9600)
    cmbBaudRate.Items.Add(19200)
    cmbBaudRate.Items.Add(38400)
    cmbBaudRate.Items.Add(57600)
    cmbBaudRate.Items.Add(115200)

    'procedure to detect all available ports and store them in the myPort array
    For Each port_name As String In IO.Ports.SerialPort.GetPortNames
        Dim myPort As New IO.Ports.SerialPort(port_name)
        If myPort.IsOpen = True Then
            cmbComPort.Items.Add(port_name)
        End If
    Next

    'initiate the combo boxes
    cmbComPort.SelectedIndex = 0  'set cmbComPort text to the first COM port detected
    cmbBaudRate.SelectedIndex = 0    'set cmbBaudRate text to the first Baud rate on the list
    cmbParity.SelectedIndex = 0    'set cmbParity text to the first Baud rate on the list
    cmbStopBit.SelectedIndex = 0    'set cmbStopBit text to the first Baud rate on the list

    'btnDisconnect.Enabled = False   'disable the disconnect button

End Sub

'open the selected serial port and start the connection
Private Sub btnConnect_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
    SerialPort1.PortName = cmbComPort.Text      'set Serial Port to the selected COM port 
    SerialPort1.BaudRate = cmbBaudRate.Text      'set Baud rate to the selected value Baud rate
    SerialPort1.Parity = cmbParity.Text     'set parity setting to the selected value 
    SerialPort1.StopBits = cmbStopBit.Text  'set stop bit setting to the selected value

    SerialPort1.DataBits = 8    'use the default 8 bit for data bit length

    SerialPort1.Open()      'open the chosen serial port

    btnConnect.Enabled = False      'disable the Connect button
    btnDisconnect.Enabled = True    'enable the Disconnect button
    picboxDisconnect.Visible = False 'disable the disconnect picture
    picboxConnect.Visible = True 'enable the disconnect picture
End Sub


'close the serial port currently in used, hence closing the connection
Private Sub btnDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisconnect.Click
    SerialPort1.Close()     'close the used Serial Port

    btnConnect.Enabled = True  'esable the Connect button
    btnDisconnect.Enabled = False  'disable the Disconnect button
    picboxDisconnect.Visible = True 'enable the 'disconnect' picture
    picboxConnect.Visible = False 'disable the 'connect' picture
End Sub

'send the text contained in the txtText to the serial port in ASCII using the 'SEND' key
Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    SerialPort1.Write(txtTransmit.Text & vbCr)
End Sub


'detect data at the serial port and call ReceivedText automatically 
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
    ReceivedText(SerialPort1.ReadExisting())
End Sub


'read incoming messages at serial port once data is detected
Private Sub ReceivedText(ByVal [text] As String)
    'compare the ID of the Creating Thread to the ID of the Calling Thread
    If Me.rtbReceived.InvokeRequired Then
        Dim x As New SetTextCallback(AddressOf ReceivedText)
        Me.Invoke(x, New Object() {(text)})
    Else
        Me.rtbReceived.Text &= [text]
    End If
End Sub



'this section prevents user from making any changes to the current connection without disconnecting

Private Sub cmbComPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
    If SerialPort1.IsOpen = False Then
        SerialPort1.PortName = cmbComPort.Text
    Else
        'pop an error message if user try to change port without closing the current port in use
        MsgBox("Please close the currently used port before making any changes to the connection setting", vbCritical)
    End If
End Sub


Private Sub cmbBaudRate_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaudRate.SelectedIndexChanged
    If SerialPort1.IsOpen = False Then
        SerialPort1.BaudRate = cmbBaudRate.Text
    Else
        'pop an error message if user try to change Baud rate without closing the current port in use
        MsgBox("Please close the currently used port before making any changes to the connection setting", vbCritical)
    End If
End Sub

Private Sub cmbParity_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaudRate.SelectedIndexChanged
    If SerialPort1.IsOpen = False Then
        SerialPort1.Parity = cmbParity.Text
    Else
        'pop an error message if user try to change Baud rate without closing the current port in use
        MsgBox("Please close the currently used port before making any changes to the connection setting", vbCritical)
    End If
End Sub

Private Sub cmbStopBit_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaudRate.SelectedIndexChanged
    If SerialPort1.IsOpen = False Then
        SerialPort1.StopBits = cmbStopBit.Text
    Else
        'pop an error message if user try to change Baud rate without closing the current port in use
        MsgBox("Please close the currently used port before making any changes to the connection setting", vbCritical)
    End If
End Sub

End Class
  • Warum sind Sie der überprüfung IsOpen? Ich würde nicht erwarten, dass um wahr zu sein für alle SerialPort Objekt, dass Sie gerade gebaut.
  • Ich Stimme mit @Damien_The_Unbeliever, sollten Sie nicht nur eine Liste der Geöffneten COM-ports. In der Tat, wenn ein port bereits offen ist, dann wird Ihre app nicht in der Lage sein, um es zu öffnen. Scheint, wie Sie sein sollte-listing diejenigen, die NICHT offen sind.
  • "custom made-IR-modem" klingt wie ein ziemlich großer fail whale. Haben Sie auch einen benutzerdefinierten Treiber? Funktioniert der Treiber emulieren einen seriellen Anschluss? Wenn Sie nicht sehen, die ports im Geräte-Manager aufgelistet haben, dann haben Sie keine Hoffnung, dass dieser code funktioniert.
  • Ich habe die Antwort in den Antwort-Abschnitt statt. Tut mir Leid, dass.
InformationsquelleAutor Cache | 2012-08-15
Schreibe einen Kommentar