SerialPort mögliche Baudraten / Treiber auslesen

  • VB.NET
  • .NET (FX) 4.0

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

    SerialPort mögliche Baudraten / Treiber auslesen

    Hallo

    Ich betreibe in meinem Programm eine Serielle Schnittstelle. Eine Art universelles Terminal zum Empfangen von Daten.
    Gegenstelle nicht vorgegeben. Deshalb soll die Schnittstelle möglichst umfänglich einstellbar sein.

    Gibt es eine Möglichkeit die vom Treiber der jeweiligen COM-Schnittstelle unterstützten Baudraten usw.
    direkt auszulesen?

    Bisher läuft das bei mir so:
    • Am Rechner vorhandene COM-Ports ermitteln und in ComboBox zur Portauswahl eintragen
    • Vorgegebene Liste mit möglichen Baudraten durchfahren
    • Immer einen Wert SerialPort.BaudRate zuweisen
    • Mit try versuchen den Port mit dieser Baudrate zu öffnen
    • Wenn es funktioniert die entsprechende Baudrate in die ComboBox für die Baudraten-Auswahl eintragen….
    • Nächste Baudrate aus der Liste probieren…….
    OK, das funktioniert. ABER
    1. Das ist furchtbar langsam. Je nach angeschlossener Hardware kann sich das auf 4-5 Sekunden summieren.
    2. Man ist nicht sicher ob man alle von der Hardware bzw. dem Treiber unterstützten Baudraten usw. in seiner
      vorgegebenen Liste hat oder ob Werte fehlen.
    3. Andererseits, je umfangreicher die Liste, desto länger dauert der Check. Manche Hardware (z.B. USB-RS232 Umsetzer)
      braucht schon mal 300-400ms um festzustellen, dass eine Baudrate nicht möglich ist
    Im Gerätemanager lassen sich für den jeweiligen COM-Port die Standardwerte einstellen. Die dort angebotene
    Liste stellt die Fähigkeiten von Treiber/Hardware dar. Diese Liste würde ich gerne direkt erhalten.

    Vielen Dank schon mal

    0-Plan schrieb:

    Diese Liste würde ich gerne direkt erhalten.
    Diese Liste ist doch so gut wie konstant (75-128000).
    So viele verschiedene UARTs gibt es nicht, als dass du da große Vielfalt hättest.
    Hast du schon mal was anderes gesehen?

    Um herauszufinden, welche Baudrate die Gegenstelle verwendet, musst du sowieso durchprobieren, wenn keine Vereinbarungen getroffen wurden.
    Du kannst eine Reihenfolge deiner Tests machen.
    Fange mit 9600 an und hangle dich erst nach oben und dann nach unten.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo

    Vielen Dank

    Ja, der Ansatz war eben:
    "Mach es dem Anwender einfach und biete ihm nur das zur Auswahl an was auch funktioniert"

    Etwas erst zur Auswahl anbieten und wenn ich es dann benutzen will kommt ne Fehlermeldung. Sowas sorgt selten für gute Stimmung.
    Wenn z.B. der Videoplayer 15 Minuten einen Film läd und dann erst meldet "Kann Format nicht wiedergeben" ist wohl jeder genervt.

    Wie sich gezeigt hat unterstützen einige Schnittstellen Baudraten unter 300 nicht. (Gut, wer braucht das schon)
    Andere unterstützen 7200 nicht
    Wieder andere unterstützen 28800 und 76800 nicht
    der USB-Adapter unterstützt 128000 nicht. Bietet dafür aber 230400, 460800 und 921600 ?
    (Keine Ahnung mit welchem Kabel / Gerät das funktionieren soll. Und soll ich das wirklich in die allgemeine Auswahlliste aufnehmen)

    Ich mach das jetzt anders: Ich setze alles in die Auswahl-ComboBox und wenn der Benutzer einen Wert wählt checke ich gleich genau diesen ab.
    Wenn nicht geht dann Fehlermeldung, dass der gewählte Com-Port diesen Wert nicht unterstützt und Wert raus aus der Liste.
    Das geht schnell und der Benutzer hat sofort ein Featback. Ist aber eben nicht ganz so benutzerfreundlich.

    Grüße
    Ich halte es für sekundär, welche Baudraten die Hardware unterstützt.
    Das ist ein Superset der Möglichkeiten.
    Es gibt nur eine gültige Baudrate, nämlich die, die die Gegenstelle parametriert hat.
    Dasselbe gilt für alle anderen Übertragungsparameter wie Parity, Anzahl Bits und eigentlich auch für Handshake.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    0-Plan schrieb:

    "Mach es dem Anwender einfach und biete ihm nur das zur Auswahl an was auch funktioniert"
    Dann musst Du alles zum Probieren im Hintergrund vorsehen und dann dem User das eine funktionierende offenbaren.
    Das Problem dabei ist, dass Du Kenntnisse der Gegenstelle haben musst, denn wie sonst willst Du ermitteln, ob sie antwortet, wenn Du die falsche Frage stellst?
    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!