Serial Port Automatisch suchen lassen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Serial Port Automatisch suchen lassen

    Hallo, ich schreibe derzeit eine Anwendung welche sich über USB mit einem Gerät verbinden soll. Das klappt soweit auch ganz gut. Jedoch hätte ich gerne das sobald das Gerät raus gezogen und wieder angesteckt wird sich mein Programm automatisch neu verbindet. Wie löse ich dieses Problem am besten? Würde mich echt über ein paar Konstruktive Ideen freuen.
    Mit freundlichen Grüßen aus Lippstadt
    Chris
    Willkommen im Forum. :thumbup:

    Der_Chris schrieb:

    Wie löse ich dieses Problem am besten?
    ZUnächst brauchst Du ein Event, das Dir meldet, dass Dein USB-Stück angesteckt wurde, da sollte Dir Frau Google helfen:
    stackoverflow.com/questions/13…sconnect-event-in-c-sharp
    mycsharp.de/wbb2/thread.php?threadid=59606
    Hab keine Angst vor C#-Code der ist VB-Code völlig äquivalent. Einen Übersetzer findest Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Der_Chris schrieb:

    aber wie kann ich das so einbinden das es es läuft wenn nix angeschlossen ist?
    Aber was ist denn nun Dein Plan?
    Im Eröffnungspost stand solch nicht drin.
    Überlege also, was Du genau willst und schreib das dann hier und wir reden drüber. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also mein Plan ist folgender, sobald ich ich das Programm starte sucht dieses nach dem passenden Gerät. In diesem Fall ein Arduino Mega 2560.
    Wenn dieses vorhanden ist verbindet sich die Software damit. Wenn es nicht da ist öffnet sich eine MsgBox und sagt mir das es nicht vorhanden ist!
    Das läuft soweit auch ganz gut. Jedoch muss ich jetzt nachdem das Gerät angeschlossen wurde zum neu verbinden erst auf die Statusleiste klicken. Das möchte ich aber gerne umgehen indem sich die Software automatisch verbindet. Hier mal mein bisheriger Code.

    VB.NET-Quellcode

    1. Imports SystemImports System.ThreadingImports System.IO.PortsImports System.ComponentModelImports System.Threading.ThreadImports System.IO
    2. Public Class Main Dim Datum As String = DateString Dim SP_Empfangen As String Dim PortName As String Dim myPort As Array Dim check_com As Boolean = False Delegate Sub SetTextCallBack(ByVal [text] As String) Public XmlName As String = "CocktailDatabase.xml" Public XmlPfad As String = ".\CocktailDatabase.xml" Public XmlBackup As String = ".\Backup\" Private _Encoding As System.Text.Encoding
    3. Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load CocktailLabel2.Visible = False btnZubereiten.Enabled = False TSSL_Verbindung.Text = ("Keine Verbindung!") TSSL_Port.Text = ("Bitte hier klicken zum verbinden") If My.Computer.FileSystem.FileExists(XmlPfad) = True Then Cocktails.ReadXml(XmlPfad) CocktailLabel2.Visible = True End If Me.BackColor = My.Settings.Backcolor myPort = IO.Ports.SerialPort.GetPortNames() ToolStripComboBox1.Items.AddRange(myPort) check_port() If check_com = True Then Verbinden() ElseIf check_com = False Then MsgBox("Das Gerät wurde nicht gefunden!" + vbNewLine + "Bitte überprüfen Sie die Kabel und schalten Sie das Gerät ein!")
    4. End If End Sub
    5. Public Sub New() InitializeComponent() _Encoding = System.Text.Encoding.Default End Sub
    6. Private Sub SP_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived Dim ToRead As Integer = SerialPort1.BytesToRead If ToRead > 0 Then Dim Buffer(ToRead - 1) As Byte SerialPort1.Read(Buffer, 0, ToRead) SP_Empfangen &= _Encoding.GetString(Buffer) End If End Sub Public Sub check_port()
    7. For Each Port As String In ToolStripComboBox1.Items
    8. If SerialPort1.IsOpen = True Then SerialPort1.Close() End If
    9. SerialPort1.PortName = Port
    10. SerialPort1.Open() SP_Empfangen = Nothing SerialPort1.Write("0") Sleep(100)
    11. If Not SP_Empfangen = Nothing Then
    12. If SP_Empfangen.Contains("Cocktail") Then ToolStripComboBox1.SelectedItem = Port check_com = True Exit Sub End If End If Next End Sub
    13. Private Sub HintergrundToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles HintergrundToolStripMenuItem.Click If ColorDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then Me.BackColor = ColorDialog1.Color My.Settings.Backcolor = ColorDialog1.Color My.Settings.Save() End If End Sub
    14. Private Sub btnZubereiten_Click(sender As Object, e As EventArgs) Handles btnZubereiten.Click
    15. End Sub
    16. Private Sub Verbinden() SerialPort1.Close() SerialPort1.PortName = ToolStripComboBox1.SelectedItem SerialPort1.Open() If SerialPort1.IsOpen Then TSSL_Verbindung.Text = ("Verbunden über: ") TSSL_Port.Text = (SerialPort1.PortName) btnZubereiten.Enabled = True Else TSSL_Verbindung.Text = ("Keine verbindung, ") TSSL_Port.Text = ("bitte zum verbinden klicken!") btnZubereiten.Enabled = False End If
    17. End Sub
    18. Private Sub TSSL_Port_Click(sender As Object, e As EventArgs) Handles TSSL_Port.Click check_port() Sleep(400) If check_com = True Then SerialPort1.Close() Verbinden() ElseIf check_com = False Then MsgBox(" Der Cocktail BOT wurde nicht gefunden!" + vbNewLine + "Bitte überprüfen Sie die Kabel und schalten das Gerät ein!")
    19. End If End Sub
    20. Private Sub DBAnzeigenToolStripMenuItem_Click(sender As Object, e As EventArgs) Datenbank.Show()
    21. End Sub
    22. Private Sub InfoToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles InfoToolStripMenuItem.Click AboutBox1.Show() End Sub
    23. Private Sub btnHinzufügen_Click(sender As Object, e As EventArgs) Handles btnHinzufügen.Click If Datenbank.ShowDialog() = Windows.Forms.DialogResult.OK Then Cocktails.Clear() If My.Computer.FileSystem.FileExists(XmlPfad) = True Then Cocktails.ReadXml(XmlPfad) End If End If End Sub
    24. Private Sub DatenbankSichernToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DatenbankSichernToolStripMenuItem.Click If System.IO.Directory.Exists(XmlBackup) = False Then System.IO.Directory.CreateDirectory(XmlBackup) End If
    25. Me.Validate() CocktailsBindingSource.EndEdit() ZutatenBindingSource.EndEdit() Cocktails.WriteXml(XmlBackup + XmlName, True) End Sub
    26. 'Private Sub DatenbankWiederherstellenToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DatenbankWiederherstellenToolStripMenuItem.Click ' OpenFileDialog1.InitialDirectory = XmlBackup ' If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then ' If My.Computer.FileSystem.FileExists(XmlPfad) = True Then ' My.Computer.FileSystem.DeleteFile(XmlPfad) ' End If ' Me.Cocktails.Clear() ' File.Copy(OpenFileDialog1.FileName, Path.Combine(XmlPfad, Path.GetFileName(OpenFileDialog1.FileName))) ' Me.Cocktails.ReadXml(XmlPfad) ' End If 'End SubEnd Class

    Der_Chris schrieb:

    Hier mal mein bisheriger Code.
    Kannst Du ihn auch nicht lesen?
    Tab Editor / Quellcode auf Quellcode und Code aus dem Studio per C&P einfügen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Imports System
    Imports System.Threading
    Imports System.IO.Ports
    Imports System.ComponentModel
    Imports System.Threading.Thread
    Imports System.IO


    Public Class Main
    Dim Datum As String = DateString
    Dim SP_Empfangen As String
    Dim PortName As String
    Dim myPort As Array
    Dim check_com As Boolean = False
    Delegate Sub SetTextCallBack(ByVal [text] As String)
    Public XmlName As String = "CocktailDatabase.xml"
    Public XmlPfad As String = ".\CocktailDatabase.xml"
    Public XmlBackup As String = ".\Backup\"
    Private _Encoding As System.Text.Encoding

    Private Sub Main_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    CocktailLabel2.Visible = False
    btnZubereiten.Enabled = False
    TSSL_Verbindung.Text = ("Keine Verbindung!")
    TSSL_Port.Text = ("Bitte hier klicken zum verbinden")
    If My.Computer.FileSystem.FileExists(XmlPfad) = True Then
    Cocktails.ReadXml(XmlPfad)
    CocktailLabel2.Visible = True
    End If
    Me.BackColor = My.Settings.Backcolor
    myPort = IO.Ports.SerialPort.GetPortNames()
    ToolStripComboBox1.Items.AddRange(myPort)
    check_port()
    If check_com = True Then
    Verbinden()
    ElseIf check_com = False Then
    MsgBox("Das Gerät wurde nicht gefunden!" + vbNewLine + "Bitte überprüfen Sie die Kabel und schalten Sie das Gerät ein!")

    End If
    End Sub

    Public Sub New()
    InitializeComponent()
    _Encoding = System.Text.Encoding.Default
    End Sub

    Private Sub SP_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    Dim ToRead As Integer = SerialPort1.BytesToRead
    If ToRead > 0 Then
    Dim Buffer(ToRead - 1) As Byte
    SerialPort1.Read(Buffer, 0, ToRead)
    SP_Empfangen &= _Encoding.GetString(Buffer)
    End If
    End Sub
    Public Sub check_port()

    For Each Port As String In ToolStripComboBox1.Items

    If SerialPort1.IsOpen = True Then
    SerialPort1.Close()
    End If

    SerialPort1.PortName = Port

    SerialPort1.Open()
    SP_Empfangen = Nothing
    SerialPort1.Write("0")
    Sleep(100)

    If Not SP_Empfangen = Nothing Then

    If SP_Empfangen.Contains("Cocktail") Then
    ToolStripComboBox1.SelectedItem = Port
    check_com = True
    Exit Sub
    End If
    End If
    Next
    End Sub

    Private Sub HintergrundToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles HintergrundToolStripMenuItem.Click
    If ColorDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
    Me.BackColor = ColorDialog1.Color
    My.Settings.Backcolor = ColorDialog1.Color
    My.Settings.Save()
    End If
    End Sub

    Private Sub btnZubereiten_Click(sender As Object, e As EventArgs) Handles btnZubereiten.Click

    End Sub

    Private Sub Verbinden()
    SerialPort1.Close()
    SerialPort1.PortName = ToolStripComboBox1.SelectedItem
    SerialPort1.Open()
    If SerialPort1.IsOpen Then
    TSSL_Verbindung.Text = ("Verbunden über: ")
    TSSL_Port.Text = (SerialPort1.PortName)
    btnZubereiten.Enabled = True
    Else
    TSSL_Verbindung.Text = ("Keine verbindung, ")
    TSSL_Port.Text = ("bitte zum verbinden klicken!")
    btnZubereiten.Enabled = False
    End If

    End Sub

    Private Sub TSSL_Port_Click(sender As Object, e As EventArgs) Handles TSSL_Port.Click
    check_port()
    Sleep(400)
    Verbinden()

    If SerialPort1.IsOpen = False Then
    MsgBox(" Der Cocktail BOT wurde nicht gefunden!" + vbNewLine + "Bitte überprüfen Sie die Kabel und schalten das Gerät ein!")

    End If
    End Sub

    Private Sub DBAnzeigenToolStripMenuItem_Click(sender As Object, e As EventArgs)
    Datenbank.Show()

    End Sub

    Private Sub InfoToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles InfoToolStripMenuItem.Click
    AboutBox1.Show()
    End Sub

    Private Sub btnHinzufügen_Click(sender As Object, e As EventArgs) Handles btnHinzufügen.Click
    If Datenbank.ShowDialog() = Windows.Forms.DialogResult.OK Then
    Cocktails.Clear()
    If My.Computer.FileSystem.FileExists(XmlPfad) = True Then
    Cocktails.ReadXml(XmlPfad)
    End If
    End If
    End Sub

    Private Sub DatenbankSichernToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles DatenbankSichernToolStripMenuItem.Click
    If System.IO.Directory.Exists(XmlBackup) = False Then
    System.IO.Directory.CreateDirectory(XmlBackup)
    End If

    Me.Validate()
    CocktailsBindingSource.EndEdit()
    ZutatenBindingSource.EndEdit()
    Cocktails.WriteXml(XmlBackup + XmlName, True)
    End Sub
    End Class
    @Der_Chris: Ja und?
    Nutze auch den [VB]-Tag.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!