Serial Port Datenübertragung ungewolte Pausen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von gfcwfzkm.

    Serial Port Datenübertragung ungewolte Pausen

    Hallo zusammen,

    ich habe ein problem und zwar ich habe mit ein Adapter von USB zu USART mit einem Microkontroller zusammengeschlossen und habe mir in Visual Studio eine Serial Port einbindung mit diesem Adapter hergestellt.
    Die Datenübertragung klappt zwar super es kommen auch alle Bytes an aber ab und zu sind zwischen 2 Bytes einfach mal 500 - 1000 ms Pausen wie kann ich das Problem beheben.

    Hat jemand eine Idee?


    Ich habe Imports System.IO verwendet
    und zur benutzung:

    SerialPort1.PortName = Port.Text

    SerialPort1.BaudRate = 19200
    SerialPort1.StopBits = IO.Ports.StopBits.One
    SerialPort1.DataBits = 8
    SerialPort1.Parity = IO.Ports.Parity.None
    SerialPort1.Encoding = System.Text.Encoding.GetEncoding(1252)
    SerialPort1.Open()

    zum Byte senden:

    SerialPort1.Write(Chr(&H91))
    SerialPort1.Write(Chr(&H89))
    .
    .
    .

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „wiemax“ ()

    Willkommen im Forum. :thumbup:

    wiemax schrieb:

    es kommen such alle Bytes an
    Empfängt die Gegenstelle Bytes?
    Dann sende auch Bytes.

    VB.NET-Quellcode

    1. Dim by() As Byte = { 91, 89 }
    2. SerialPort1.Write(by, 0, 2)
    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!

    Eierlein schrieb:

    Mehrere Bytes zu einem String zusammenfassen.
    What :?:
    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 die Antworten Aber wass soll das bringen damit die Bytes zu einem String zusammen gefasst werden?
    Das Programm sollte doch so schnell sein damit das eigentlich nicht auffält.
    Dann verwende ich einen hochwertigeren USB-Adapter.
    Und es sollte USB-Adapter bleiben, da dies auch am Laptop laufen sollte.

    Kann es auch sein damit Windows das Programm am Senden ab und zu Unterbricht?

    Aber ich werde Morgen mal die Metode von "RodFromGermany" Austesten.

    wiemax schrieb:

    die Bytes zu einem String zusammen gefasst werden
    Vergiss das.
    Was empfängt / sendet die Gegenstelle: Bytes oder 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!
    Hardware-Handshake wird nicht verwendet, was ist XON/XOFF?
    Beide seiten sind gleich Konfiguriert.

    Der PC Sendet 5 ID Bytes und 8 Daten Bytes als Antwort kommen 8 Daten Bytes zurück.
    An der gegenstelle liegt es nicht die ist mit Assembler Programmiert und Funktioniert super.
    die Pausen liegen zwischen den 5 ID Bytes und 8 Daten Bytes.

    wiemax schrieb:

    Bytes
    OK, dann ist alles klar, dann nutze die Write-Überladung mit Bytes und verwende

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Dim by() As Byte = { 91, 89 }
    2. SerialPort1.Write(by, 0, 2)
    und für das Lesen dies:

    VB.NET-Quellcode

    1. Private Sub SerialPort1_DataReceived(sender As Object, e As IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived
    2. Dim anzahl = SerialPort1.BytesToRead
    3. Dim by() = New Byte(anzahl) {}
    4. SerialPort1.Read(by, 0, anzahl)
    5. ' was mit by tun
    6. End Sub

    Bedenke, dass das SerialPort in einem anderen Thread läuft, so dass Du ggf. zur Anzeige invoken musst.
    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!

    wiemax schrieb:

    was ist XON/XOFF
    Software-Handshake.
    Wenn eine Seite schneller sendet als die andere lesen kann, schickt die Langsame eine XOFF, um die Schnelle zu pausieren, bis der Puffer wieder leer ist.
    Das wird normalerweise innerhalb des Treibers gehandelt.
    Die Schnittstelle muss aber auf beiden Seiten dementsprechend eingestellt sein.

    Wenn weder Hardware- noch Software-Handshake existiert können bei unterschiedlich schnellen Gegenstellen und zu kleinen Puffern Datenverluste auftreten.
    Da du aber keine Datenverluste, sondern Stockungen hast, gehe ich davon aus, dass das Handshake funktioniert, aber auch zuschlägt.
    Vielleicht kannst du die Lesepuffer etwas vergrössern.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    hmm, kann doch fast nur auf der PC seite liegen.
    Je nach Microcontroller arbeitet dieser so schnell das er keinen Lesepuffer hat und die Daten direkt verarbeitet.
    Habe jedoch die Erfahrung gemacht das PCs etwas mühe mit USB/UART Konverter haben wenn die non-stop laufen / senden&empfangen (Habe ab +30k Baud non-stop transmission teilweise Tastatur/Maus Lägs).

    Hast du keine klassische RS-232 Schnittstelle zur verfügung? Mit nem MAX232-IC hast du schnell ein Konverter zusammengebaut für RS232<>TTL-UART.

    mfg

    gfc