Auslesen der seriellen Schnittstelle mit VB2010

  • VB.NET

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

    Auslesen der seriellen Schnittstelle mit VB2010

    Hallo,

    ich möchte in VB2010 die serielle Schnittstelle (bei mir COM1) auslesen. Habe schon so einige Beiträge gelesen aber noch keine Lösung gefunden.
    Es kommt von einem ATMega32 genau ein Byte als Zahl an und soll dann später in eine Datei gespeichert werden. Ich finde einfach hier im Netz keinen
    Code der funktioniert. Das Senden einer Zahl bis 65535 klappt problemlos.
    Eigentlich würde es mir schon helfen, wenn mir jemand diese Funktion erklären und wie ich sie verwenden kann:

    Private Sub SerialPort1_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles SerialPort.DataReceived

    Vor mir liegt VB 2010 von Addison-Weslay mit 1267 Seiten aber keine Information über RS232.

    Danke Jo
    @VB-MD Willkommen im Forum. :thumbup:
    Poste mal den kompletten relevanten Code.
    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!
    Aloha,

    das DataReceived-Event benachrichtigt dich nur, dass Daten empfangen wurden.
    Um an die Daten dran zu kommen, musst du den Empfangspuffer auslesen.
    Dazu gibt es die Read-Funktionen.

    Exemplarisch (C#):

    C#-Quellcode

    1. void com_DataReceived( object sender, SerialDataReceivedEventArgs e )
    2. {
    3. byte data = (byte)com.ReadByte();
    4. }


    Übersetzt mit Telerik Code Converter (VB):

    VB.NET-Quellcode

    1. Private Sub com_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
    2. Dim data As Byte = CByte(com.ReadByte())
    3. End Sub


    In der Variable data sollte nun Dein empfangenes Byte liegen :)
    @TRiViUM Ist Dir meine Glaskugel zugelaufen :?: :D
    Meine Glaskugel ist weg
    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 TriViUM,
    habe den Code etwas verändert, da ich port1 definiert habe und mußte wohl noch am Anfang "Imports System.IO.Ports" zufügen.
    Aber leider noch keinen Empfang. Sollte eigentlich etwas im Direktfenster sehen.

    Private Sub com_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs)
    Dim data As Byte = CByte(SerialPort1.ReadByte())
    'Dim data As Byte = CByte(com.ReadByte())

    Debug.Print(data)

    End Sub


    Gibt es eigentlich den Button "Absolut nicht hilfreich" im Forum für den mit der Glaskugel? Das wäre hilfreich!
    @VB-MD Offensichtlich ist dem jungen Padawan der Post #2 von dem mit der Glaskugel entgangen.
    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!

    RodFromGermany schrieb:

    der Post #2 von dem mit der Glaskugel entgangen
    Allerdings. Sonst war es doch eigentlich so, dass man darüber informiert wurde, wenn ein neuer Post, während man selbst einen verfasst, geposetet wurde :huh:

    VB-MD schrieb:

    Gibt es eigentlich den Button "Absolut nicht hilfreich" im Forum für den mit der Glaskugel?
    Ich bin jetzt davon ausgegangen, dass Du nur eine Erklärung über das DataReceived-Event wolltest, die ja auch grundsätzlich erstmal unabhängig vom Projekt ist.
    Und da Du ja scheinbar auch schon Daten schreiben kannst, bin ich davon ausgegangen, dass du dich bereits um das Handling (Port-Name zuweisen, Port öffnen usw.) gekümmert hast.

    Oder habe ich da jetzt jemanden falsch verstanden? :whistling:
    Nein nicht falsch verstanden. Um den Port1 habe ich mich schon gekümmert. Ich habe lediglich nach einer Empfangsmöglichkeit
    eines Bytes von meinem Mikroprofessor gesucht. Bisher wurden nur Daten gesendet. Möchte nur benachrichtigt dass ein Byte
    angekommen ist, es auslesen und den Empfangspuffer wieder löschen. Und da habe ich diese Funktion gefunden mit der ich aber
    nicht so erfolgreich war. Es gibt sogar mehrere Möglichkeiten den Datenverkehr zu organisieren, z.B. mit ReadLine().
    Und dann habe ich noch nicht herausgefunden warum man die DtrEnable-Eigenschaft des SerialPort-Controls auf True setzen soll.
    Danke vom Jo

    Meinen Code muss ich erst mal entschlacken. Viele senden meist den gesamten code ohne das Wesentliche zu treffen.

    VB-MD schrieb:

    ReadLine()
    ist gemacht zur Übertragung von Strings, wenn an den Text ein vorgebbares Zeilenende gehängt wird.
    Wenn Du lediglich Bytes überträgst, solltest Du auch nur die Prozeduren zum Handeln von Bytes verwenden, das ist (SerialPort-)intern anders als das Übertragen von Strings.
    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!

    VB-MD schrieb:

    Und dann habe ich noch nicht herausgefunden warum man die DtrEnable-Eigenschaft des SerialPort-Controls auf True setzen soll
    Das könnte vielleicht so etwas (oder ähnliches) wie beim Arduino sein.
    Dieser macht beim Öffnen des COM-Ports (glaub auch Änderung des DTR-Status) z.B. einen Reset...

    VB-MD schrieb:

    Ich habe lediglich nach einer Empfangsmöglichkeit
    eines Bytes von meinem Mikroprofessor gesucht.
    Dann sollte der von mir gepostete Code genau so funktionieren.
    Ist die Empfangsleitung mit der Sendeleitung vielleicht vertauscht?
    Du meinst zwar, dass das Senden funktioniert, aber kommt es auch an der Gegenstelle an?
    Korrekt! 65535 sind 2 Bytes! Die sende ich. Empfangen möchte ich nur ein Byte, meinetwegen auch 1 Byte und vbCr!

    Das senden funktioniert schon länger. Habe einen ATMega32 mit LCD-Display dran. Auch zwei PC kommunizieren (einer nur hterm).
    Beim Einfügen Deines Codes habe ich zunächst 3 Fehlermeldungen erhalten.
    Trotzdem danke
    Jo

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VB-MD“ ()

    VB-MD schrieb:

    Beim Einfügen Deines Codes habe ich zunächst 3 Fehlermeldungen erhalten.
    Welche?
    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!
    Mein Sender auf der anderen Seite sendet mir auf die Com1 alle Sekunde einen Wert und zwar von 0 bis 255 die er intern hochzählt und diesen Wert
    möchte ich gern in VB sehen, meinetwegen auch zunächst nur im Direktfenster. Aber leider ....
    Auch ein zusätliches Ende-Zeichen würde ich akzeptieren, da in einigen Beiträgen steht, dass es ohne wohl nicht geht. Ich brauche aber nur ein Byte.
    Und schließe ich VB und starte hterm kommt genau diese Zahlenfolge an. Natürlich wegen hterm gefolgt von 000.
    @VB-MD Mit welchem Code in Deinem hier diskutierten VB.NET-Programm sollen Daten von wem auch immer per SerialPort empfangen werden, unabhängig davon, ob tatsächlich welche ankommen oder 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!
    Ich habe gestern erst das senden / empfangen ohne Probleme hinbekommen aber es kann nicht sein das du hier wie wild um den heißen Brei redest aber nicht ein bisschen Code dazu postest. Nun Poste doch mal deinen vollständigen Code zum Senden / Empfangen und dann können wir dir auch Sicherlich weiter helfen.

    Was genau klappt bei dir nicht?
    1. Senden von dem Arduino zum VB-Programm
    2. Senden von VB-Programm zum Arduino

    Oder fehlt dir das komplette Einstellen des SerialPorts?

    Einfach paar genauere Informationen wären echt hilfreich!
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Hallo CODE,
    dank Deines Beitrages von 10:53Uhr heute morgen an anderer Stelle läuft jetzt auch der Empfang. Mehr wollte ich eigentlich nicht wissen.
    Ich empfange genau ein Byte (0 - 255) als Zahl. Jetzt muß ich nur noch den Wert in ein Label schreiben wenn mir die Schnittstelle sagt,
    dass ein neues Zeichen eingetroffen ist. Brauche auch nicht mehr > "Imports System.IO.Ports"!
    Danke vom Jo

    Natürlich hier mein Code wie gewünscht: (wie kann man den so schon formatiert einfügen wie ihr es macht?)


    'Imports System.IO.Ports

    Public Class Form1

    Shared ZSend As Short
    Shared MyArray() As Byte
    Shared ZEmpf As Byte

    Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    ZEmpf = CByte(SerialPort1.ReadByte())
    'Label4.Text = CStr(ZEmpf)

    Debug.Print(ZEmpf)

    End Sub




    Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) 'COM-Port angeben > Voreinstellung = COM1

    End Sub

    Private Sub TextBox2_TextChanged(sender As System.Object, e As System.EventArgs) 'Baudrate angeben > Voreinstellung = 2400

    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 'Connect-Button
    Try
    SerialPort1.PortName = TextBox1.Text
    SerialPort1.BaudRate = TextBox2.Text
    SerialPort1.Open()
    Button1.Enabled = False
    Button2.Enabled = True
    Button4.Enabled = True

    Catch ex As Exception
    MsgBox("Verbindung fehlgeschlagen!")
    SerialPort1.PortName = "COM1"
    SerialPort1.BaudRate = "9600"
    End Try
    End Sub

    Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 'Senden-Button
    TextBox3.Focus() 'Fokus wird auf TextBox3 gesetzt
    Try
    ZSend = CInt(TextBox3.Text) 'Text in Integer umwandeln (CStr-Interger in Text)

    If ZSend > -1 And ZSend < 65535 Then
    MyArray = BitConverter.GetBytes(ZSend)
    End If

    Catch ex As Exception
    MsgBox("Eingabe falsch!")
    End Try

    'System.Threading.Thread.Sleep(50) 'Warten 50ms
    SerialPort1.Write(MyArray, 0, 2)

    End Sub

    Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click 'Disconnect-Button
    SerialPort1.Close()
    Button1.Enabled = True
    Button2.Enabled = False
    Button4.Enabled = False
    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    If SerialPort1.IsOpen = True Then
    SerialPort1.Close()
    End If
    End Sub

    Private Sub Label1_Click(sender As System.Object, e As System.EventArgs) Handles Label1.Click

    End Sub

    Private Sub ReceiveText()
    Throw New NotImplementedException
    End Sub

    End Class