SerialPort auslesen

  • VB.NET

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

    SerialPort auslesen

    Hallo,

    Ich möchte mit meinem VB-Programm dem SerialPort auslesen und mit My.Computer.Keyboard.SendKeys Buchstaben ausgeben lasen.
    über den SerialPort werden die Zeichen A,B,C,D einzeln übertragen

    Nur funktioniert das ganze nicht so wie ich es mir vorstelle :(

    Danke im Voraus

    Hier mein VB-Code:

    VB.NET-Quellcode

    1. Imports System.IO.Ports.SerialPort
    2. Public Class Form1
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Verfügbare Comports suchen Dim Ports As String() = GetPortNames() Dim Port As String
    4. 'Combobox richtig sortieren Combobox_Comport.Items.Clear()
    5. If Ports.Length > 0 Then 'für alle COM-Nr. < 10 ein Leerzeichen einfügen For ii As Integer = 0 To (Ports.Length - 1) If CInt(Ports(ii).Substring(3)) < 10 Then Ports(ii) = "COM " & Ports(ii).Substring(3) End If Next
    6. Array.Sort(Ports)
    7. 'das Leerzeichen in "COM x" wieder entfernen For ii As Integer = 0 To (Ports.Length - 1) Ports(ii) = "COM" & Ports(ii).Substring(3).Trim Next
    8. End If
    9. 'In die Combobox übernehmen For Each Port In Ports Combobox_Comport.Items.Add(Port) Next Port
    10. 'Buttons setzen Button_disconnect.Enabled = False Button_connect.Enabled = False
    11. End Sub
    12. Private Sub ComboBox_comport_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Combobox_Comport.SelectedIndexChanged If Combobox_Comport.SelectedItem <> "" Then Button_connect.Enabled = True End If End Sub
    13. Private Sub Button_disconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_disconnect.Click 'Verbindung trennen Timer2.Stop() Timer1.Enabled = False Button_connect.Enabled = True Button_disconnect.Enabled = False Combobox_Comport.Enabled = True SerialPort1.Close() End Sub
    14. Private Sub Button_connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button_connect.Click 'Comport verbinden Timer2.Start() Try 'Buttons freigeben/sperren Button_connect.Enabled = False Button_disconnect.Enabled = True Combobox_Comport.Enabled = False
    15. 'Comport Einstellungen SerialPort1.PortName = Combobox_Comport.Text SerialPort1.BaudRate = 9600 SerialPort1.Open()
    16. Timer1.Enabled = True Catch ex As Exception 'Fehlermeldung MessageBox.Show("Achtung die Schnittstellen konnte nicht geöffnet werden:" & vbCrLf & ex.Message) Button_connect.Enabled = True Button_disconnect.Enabled = False Combobox_Comport.Enabled = True End Try End Sub
    17. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick If SerialPort1.IsOpen Then
    18. If (SerialPort1.ReadExisting() = "A") Then My.Computer.Keyboard.SendKeys("A", True) End If
    19. If (SerialPort1.ReadExisting() = "B") Then My.Computer.Keyboard.SendKeys("B", True) End If
    20. If (SerialPort1.ReadExisting() = "C") Then My.Computer.Keyboard.SendKeys("C", True) End If
    21. If (SerialPort1.ReadExisting() = "D") Then My.Computer.Keyboard.SendKeys("D", True) End If
    22. End If End SubEnd Class
    Willkommen im Forum. :thumbup:
    Was soll die Port-Abfrage im Timer?
    Wenn Du eine Pizza bestellst, rennst Du auch nicht alle 5 Minuten zur Tür um nachzusehen, ob der Boter vor der Tür steht, Du wartest, bis es klingelt.
    Dazu gibt es das Event DataReceived.
    Dann solltest Du zunächst mal die empfangenen Zeichen anzeigen und Dich freuen, dass sie angezeigt werden. Tastendrücke zu senden kommt in einer anderen Lektion, das kriegen wir später.
    Mach es zunächst mal so. Da das Port in einem anderen Thread arbeitet als die GUI, müssen wir per Invoke() hier einen Durchgang schaffen:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Me.Invoke(Sub() ReceiveText())
    3. End Sub
    4. Private Sub ReceiveText()
    5. Dim ToRead As Integer = SerialPort1.BytesToRead
    6. If ToRead > 0 Then
    7. 'Neu empfangene Zeichen an die Empfangspuffer anhängen
    8. Dim Buffer(ToRead - 1) As Byte
    9. SerialPort1.Read(Buffer, 0, ToRead)
    10. TextBox1.Text &= System.Text.Encoding.Default.GetString(Buffer)
    11. End If
    12. End Sub
    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!
    danke für deine Hilfe!!!
    Ein Problem habe ich aber noch:

    Wenn ich bei gewissen Programmen die "My.Computer.Keyboard.SendKeys" Funktion verwende hat es die gleiche Auswirkung als die ESC-Taste.

    Woran könnte das noch liegen? VB Einstellungen?
    Wenn Du die Ecs-Taste sendest, ja.
    Ansonsten verstehe ich die Frage nicht.
    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!