Serial Port

  • VB.NET
  • .NET 4.5

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

    Moin zusammen


    brauche ein Vb.net profi

    gibt es irgendwo ein Tutorial für Laien wo der Serial Port allgemein einfach erkärt wird weil auf der msdn Seite ist er zwar gut dargestellt nur ich werde nicht ganz schlau raus.

    nun meine Frage Die activevb.de Seite ist wäre das ein Anfang damit man erstmal ein Einstieg hat damit man das Grundwissen von Serial Port versteht oder gibt es da noch andere Seiten die es noch einfacher machen


    für eure Antwort würde ich mich sehr drüber freuen

    LG Der Laie

    LG der Laie
    Dieser Artikel erklärt gut, wo die Probleme beim SerialPort in .NET liegen: sparxeng.com/blog/software/mus…ystem-io-ports-serialport
    Kurz sollte das inetwa so aussehen:

    VB.NET-Quellcode

    1. Const ReadBufferSize As Integer = 16 'Oder halt eine für Dich sinnvolle Größe.
    2. 'BaudRate, DataBits, Parity und StopBits hängt vom angeschlossenen Gerät ab.
    3. 'PortName ist der Name, der auch im Geräte-Manager zu finden ist. Mit SerialPort.GetPortNames bekommt man die Namen aller verfügbaren Ports.
    4. 'Das unendliche ReadTimeout hat den Sinn, dass einfach so lange gewartet wird, bis Daten ankommen. Wenn keine Daten kommen, wird halt ewig gewartet. Der Puffer wird trotzdem auch nur teilweise gefüllt. Sendet das Gerät an den Computer nur ein Byte und dann lange nichts, dann kommt im Callback auch nur ein Byte an.
    5. 'Das WriteTimeout hat den Sinn, dass wenn man z.B. nur ein Byte zum Gerät schicken will, dass dieses eine Byte dann nach 10 Millisekunden gesendet wird und nicht erst gewartet wird, bis der interne Puffer voll ist.
    6. Dim Port As New System.IO.Ports.SerialPort With {.BaudRate = 28800, _
    7. .DataBits = 8, _
    8. .Parity = IO.Ports.Parity.None, _
    9. .PortName = "COM6", _
    10. .StopBits = IO.Ports.StopBits.One, _
    11. .ReadTimeout = System.Threading.Timeout.Infinite, _
    12. .WriteTimeout = 10}
    13. Dim ReadBuffer As Byte() = New Byte(ReadBufferSize - 1) {}
    14. Private Sub DoIt() 'Als Beispiel.
    15. Port.Open() 'Port öffnen.
    16. KickoffRead() 'Und Lesevorgang starten.
    17. End Sub
    18. Private Sub KickoffRead()
    19. Port.BaseStream.BeginRead(ReadBuffer, 0, ReadBufferSize, AddressOf ReadCallback, Nothing)
    20. End Sub
    21. Private Sub ReadCallback(Result As IAsyncResult)
    22. Dim ActualLength As Integer
    23. Try
    24. ActualLength = Port.BaseStream.EndRead(Result)
    25. Catch ex As System.IO.IOException
    26. 'Damit habe ich mich noch nicht genug befasst.
    27. 'IOExceptions treten manchmal auf.
    28. Return
    29. Catch ex As InvalidOperationException
    30. 'Tritt auf, wenn der Port geschlossen wurde.
    31. Return
    32. End Try
    33. Dim BufferCopy = New Byte(ActualLength - 1) {}
    34. Array.Copy(ReadBuffer, BufferCopy, ActualLength)
    35. Me.BeginInvoke(Sub() BytesReceived(BufferCopy))
    36. KickoffRead()
    37. End Sub
    38. Private Sub BytesReceived(Bytes As Byte())
    39. 'Hier irgendwas mit den Bytes tun.
    40. End Sub

    Lesevorgänge abbrechen funktioniert einfach so, dass Du Port.Close aufrufst. Dann wird im Callback bei EndRead eine InvalidOperationException ausgelöst, die Du fangen (und in diesem Fall ignorieren) kannst.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Der Laie Ich würde mir eine SerialPort-Component auf die GUI ziehen und die Properties zunächst im Designer festlegen, dort auch die DataReceived-Prozedur generieren lassen.
    Dann spielst Du ne Runde mit einer Gegenstelle rum.
    1. Feststellung: Exception wegen thread-übergreifendem Vorgang, dazu siehe Zeile 38 im Code von @Niko Ortner. Das SerialPort arbeitet nämlich in einem separaten Thread.
    Bedenke, dass, wenn Du eine Pizza bestellst, Du nicht alle 60 Sekunden an die Tür läufst und nachsiehst, ob der Pizzabote schon da ist, sondern Du wartest, bis er klingelt.
    Mit dem SerialPort geht das genau so.
    Du sendest eine Anforderung an die Gegenstelle und die Gegenstelle antwortet Dir.
    Noch ne wichtige Property: .NewLine. Damit kannst Du einen String festlegen, der bei .WriteLine und bei .ReadLine als Zeilenende gesendet bzw. ausgewertet wird.
    Wenn Du mit dem Port warm geworden bist, kannst Du Deine Probleme übrigens sehr viel präziser beschreiben, da können wir dann auch konkret drauf antworten.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Ich möchte anmerken, dass das, was @RodFromGermany beschrieben hat, in erster Linie zum Testen gedacht ist. Das DateReceived-Event (in Verbindung mit der BytesToRead-Property) ist extrem unzuverlässig. Das wird auch im verlinkten Artikel bemängelt. Und normalerweise schreibt man auch nicht Strings in ein SerialPort, sondern rohe Bytes. Die NewLine- und Encoding-Properties sollten nämlich eigentlich garnicht zur SerialPort-Klasse gehören. WriteLine und ReadLine eigentlich auch nicht. Das gehört in den Layer darüber.
    Man kann jetzt natürlich argumentieren, dass es simple Anwendungsfälle vereinfacht, wenn man Strings nicht manuell enkodieren und dekodieren muss, aber im Normalfall stören die Properties da eher, weil sie von der eigentlichen Funktion der Klasse ablenken.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils