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 alleSerialPort
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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sodala, ich habe missunderstanding, was es bedeutet, von einem port 'offen' oder 'geschlossen' vor, und wurde darauf von meinem Freund. Da ich dann fest, dass ein Teil des codes zu
@hans : Eigentlich ist die Schaltung schon arbeiten mit der terminal-IR-modem (kommt mit windows) am-lab-computer. Und ich habe bestätigt mit diesen codes, die in der Tat die serielle Schnittstelle verlassen und arbeiten
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?
Ist es trotzdem kann ich den Inhalt überprüfen von myPort-array nach dieser Zeile?
ebenso wie die Elemente der cmbComPort?