[gelöst] SerialPort - TCommTimeouts - was einstellen ?

Rund um die LCL und andere Komponenten
PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

[gelöst] SerialPort - TCommTimeouts - was einstellen ?

Beitrag von PeterS »

Hallo zusammen,

auf der Suche nach einer Erklärung /Dokumentation der Werte für TCommTimeouts
habe ich selbstverständlich den Link auf Microsofts Website gefunden:

https://learn.microsoft.com/de-de/windo ... mmtimeouts

Die Erklärungen dort sind für mich nicht verständlich.
Bei weiterer Suche im Internet habe ich z.B. dies hier gefunden:

Code: Alles auswählen

    // instance an object of COMMTIMEOUTS.
    COMMTIMEOUTS comTimeOut;
     // Specify time-out between charactor for receiving.
    comTimeOut.ReadIntervalTimeout =3;
     // Specify value that is multiplied
     // by the requested number of bytes to be read.
    comTimeOut.ReadTotalTimeoutMultiplier =3;
     // Specify value is added to the product of the
     // ReadTotalTimeoutMultiplier member
    comTimeOut.ReadTotalTimeoutConstant =2;
     // Specify value that is multiplied
     // by the requested number of bytes to be sent.
    comTimeOut.WriteTotalTimeoutMultiplier =3;
     // Specify value is added to the product of the
     // WriteTotalTimeoutMultiplier member
    comTimeOut.WriteTotalTimeoutConstant =2;
     // set the time-out parameter into device control.
    SetCommTimeouts(handlePort_,&comTimeOut);
In konkreten Implementierungen fand ich z.B.

Code: Alles auswählen

    // from here:  https://www.swissdelphicenter.ch/en/showcode.php?id=841
    ReadIntervalTimeout         := 0;           // 100; ?    https://www.mikrocontroller.net/topic/290997
    ReadTotalTimeoutMultiplier  := 0;
    ReadTotalTimeoutConstant    := 1000;        // 100; ?    https://www.mikrocontroller.net/topic/290997
    WriteTotalTimeoutMultiplier := 0;
    WriteTotalTimeoutConstant   := 1000;        // 100; ?    https://www.mikrocontroller.net/topic/290997
Trotzdem ist mir nicht klar, was für Werte gesetzt werden (müssen ?) und warum / wofür.
Kann mir das jemand erklären oder hat jemand von Euch einen guten Web-Link dazu für mich ?
Zuletzt geändert von PeterS am Sa 8. Mär 2025, 11:46, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10879
Registriert: Mo 11. Sep 2006, 19:01

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von theo »

Gibt es einen Grund, nicht Synaser zu verwenden?
http://synapse.ararat.cz/doc/help/synaser.html

Aus dem OPM installierbar.

Mathias
Beiträge: 6921
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von Mathias »

theo hat geschrieben: Mo 30. Dez 2024, 16:40 Gibt es einen Grund, nicht Synaser zu verwenden?
http://synapse.ararat.cz/doc/help/synaser.html

Aus dem OPM installierbar.
Oder für einfaches reicht auch die unit Serial, die standardmässig dabei ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von PeterS »

theo hat geschrieben: Mo 30. Dez 2024, 16:40 Gibt es einen Grund, nicht Synaser zu verwenden?
Ja. Hat nicht funktioniert. lazcomport auch nicht.

Schreddern beide die Datenblöcke, die meine "Quelle" verschickt, in kleine unbrauchbare Stücke.

viewtopic.php?p=144401

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von PeterS »

Ist etwas schwer zu verstehen, was in dem anderen Thread alles steht, aber in der Summe:

Ich bekomme die RS485 Daten per TCP auf meinen Rechner, empfange sie aber (testweise) per virtueller COM Schnittstelle.
Um die echten RS485-To-USB (= To-COM-Port)-Adapter zu simulieren.

Mit Synaser und lazcomport hat das in einer Katastrophe geendet.
Seitdem ich das Problem verstanden hatte, läuft mein Programm
so einigermaßen mit RS485-To-USB-Adaptern.

Jetzt ist aber ein Adapter aufgetaucht, der beim Aufruf von
SetCommTimeouts() eine Fehlermeldung schmeißt.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von MmVisual »

Ich habe auch mal mit Synaser ein Terminalprogramm geschrieben, wenn du magst kannst du das einmal testen.
Falls meine Variante gehen sollte könnte es dann sein dass du mit Synaser was nicht korrekt gemacht hast.
www.elela.de > Download, nach dem installieren im Reiter "Extras-F10" > "Terminal"
Das wäre zumindest ein recht einfacher Test.
EleLa - Elektronik Lagerverwaltung - www.elela.de

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von PeterS »

MmVisual hat geschrieben: Mo 30. Dez 2024, 18:36 Falls meine Variante gehen sollte könnte es dann sein dass du mit Synaser was nicht korrekt gemacht hast.
Danke, aber meine Lösung funktioniert bereits.
Ich lese einfach ein, was bereits im Puffer angekommen ist, und verarbeite es dann.
https://forum.lazarus.freepascal.org/in ... #msg538993

Ich lese ein Hersteller-spezifisches serielles Protokoll.
Das absolut nichts mit Modem-Kommunikation oder MODBUS zu tun hat.

Synaser und Lazserial haben meinen Dateninput nur geschreddert abgeliefert.
Und RFC 2217 hat dazwischengefunkt, was ich garnicht brauche.


Meine Frage war eine Verständnisfrage: record TCommTimeouts - was einstellen ?

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von PeterS »

MmVisual hat geschrieben: Mo 30. Dez 2024, 18:36 Ich habe auch mal mit Synaser ein Terminalprogramm geschrieben, wenn du magst kannst du das einmal testen.
Falls meine Variante gehen sollte könnte es dann sein dass du mit Synaser was nicht korrekt gemacht hast.
www.elela.de > Download, nach dem installieren im Reiter "Extras-F10" > "Terminal"
Das wäre zumindest ein recht einfacher Test.
So, ich habe mal Dein Programm installiert, um zu schauen, wie es "meine" Datenpakete einliest.
Das Terminalfenster reiht ohne Unterbrechung die Bytes wahllos hintereinander.
So ist das absolut unbrauchbar für meine Anwendung.
.
Screenshot (50).png
Screenshot (50).png (46.03 KiB) 3594 mal betrachtet

Die virtuelle COM-Schnittstelle "USR-VCOM" zeigt, wie "meine" Datenpakete tatsächlich herein kommen - incl. "Zeitstempel".
Und so - also "häppchenweise" - brauche ich die bei mir im Dateninput.
... wobei, man sieht in line 20 - 21 daß dort ein Datenpaket in der Mitte zerrissen wurde.
Zwei halbe Datenpakete wieder zusammenkleben ist aber weitaus einfacher
als das Daten-Puzzle im Fenster oben zu analysieren und korrekt wieder zusammen zu setzen.
.
Zum Verständnis: in diesem Hersteller-spezifischen Protokoll
fängt ein Datenpaket mit $32 an und endet mit $34.
.
Screenshot (49).png
Screenshot (49).png (195.75 KiB) 3566 mal betrachtet
Zuletzt geändert von PeterS am Di 31. Dez 2024, 11:12, insgesamt 1-mal geändert.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von MmVisual »

Schön dass du mein Programm installiert hast.
So wie ich das sehe sind auch da die Daten alle da. Man könnte das Häkchen "Zeilenwechsel nach ms" aktivieren und da eine Zeit hinterlegen, damit sollte es dann auch besser aussehen.
Zumindest geht es mit Synaser ebenfalls.

Ich habe mir bei Synaser 2 Threads dazu programmiert, einen zum Daten lesen, den zeiten um die Daten darzustellen. Damit wird der Datenstrom der seriellen Schnittstelle nie blockiert.

Ursprümglich hatte ich das Terminal Programm so geschrieben, dass man mit einem selbst programmierten Microcontroller per UART infos sich zeigen kann und man Kurzbefehle senden kann. Die Sende Befehle werden in einer Liste gemerkt, so dass man schneller wiederholende Befehle hat. Dieses Feature bieten nicht viele serielle Terminalprogramme.

Zum EleLa wieder zu löschen:
- Deinstallieren
- C:\EleLa löschen
- Es wurde nichts in anderen Ordnern installiert, das System ist somit wieder "sauber".

Ich habe bei meinem Quellcode nachgesehen, irgend welche Timeouts habe ich nicht eingestellt, die sind alle von Synaser Standard belassen.
EleLa - Elektronik Lagerverwaltung - www.elela.de

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von PeterS »

MmVisual hat geschrieben: Di 31. Dez 2024, 10:53 Ich habe mir bei Synaser 2 Threads dazu programmiert, einen zum Daten lesen, den zeiten um die Daten darzustellen. Damit wird der Datenstrom der seriellen Schnittstelle nie blockiert.
Seitdem ich die Lösung gebaut habe wie hier gezeigt ...
https://forum.lazarus.freepascal.org/in ... #msg538993

brauche ich garkeine separaten Threads. Die gerade angekommenen SerialPort-Daten werden sofort gelesen,
der MainThread wird nicht blockiert. Für meine Zwecke also unnötiger Overhead, so ein Konstrukt.

Der SerialPort blockiert nur dann den Mainthread, wenn man auf Daten "wartet".

"Hol ab, was da ist, und arbeite sofort weiter."
Zuletzt geändert von PeterS am Di 31. Dez 2024, 11:46, insgesamt 1-mal geändert.

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von MmVisual »

Den Konstrukt mit "ClearCommError(ComFileHandle, error, @status);" kannte ich noch nicht, also den dritten Parameter. Es ist jetzt auch schon 20 Jahre her als ich die Windows Befehle noch zu Fuß verwendet hatte.
Das liegt wohl auch daran dass meine EXE unter Windows läuft und unter Linux ebenfalls übersetzt ist und es da anders aussieht. Daher habe ich einen anderen Weg gewählt, Synaser.
EleLa - Elektronik Lagerverwaltung - www.elela.de

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von PeterS »

Dann zurück zu ..
PeterS hat geschrieben: Mo 30. Dez 2024, 22:10 Meine Frage war eine Verständnisfrage: record TCommTimeouts - was einstellen ?
Ich habe die Wirkung der hier im record gelisteten Parameter
trotz "Dokumentation" nicht verstanden.

Code: Alles auswählen

    // instance an object of [b]COMMTIMEOUTS[/b].
    COMMTIMEOUTS comTimeOut;
     // Specify time-out between charactor for receiving.
    comTimeOut.ReadIntervalTimeout =3;
     // Specify value that is multiplied
     // by the requested number of bytes to be read.
    comTimeOut.ReadTotalTimeoutMultiplier =3;
     // Specify value is added to the product of the
     // ReadTotalTimeoutMultiplier member
    comTimeOut.ReadTotalTimeoutConstant =2;
     // Specify value that is multiplied
     // by the requested number of bytes to be sent.
    comTimeOut.WriteTotalTimeoutMultiplier =3;
     // Specify value is added to the product of the
     // WriteTotalTimeoutMultiplier member
    comTimeOut.WriteTotalTimeoutConstant =2;
     // set the time-out parameter into device control.
    SetCommTimeouts(handlePort_,&comTimeOut);
Es gibt Beispiele im Web, da werden die folgenden beiden Werte auf 1000 gesetzt,
woanders auf 300, anderes Beispiel war 100 ..

Code: Alles auswählen

ReadTotalTimeoutConstant := 1000;        // 100; ?    https://www.mikrocontroller.net/topic/290997
WriteTotalTimeoutConstant := 1000;        // 100; ?    https://www.mikrocontroller.net/topic/290997
Ich habe beide wieder auf 0 gesetzt, dafür

Code: Alles auswählen

    ReadIntervalTimeout         := 10;       // @ 9600 Bits / sec = 1200 byte / sec
Mangels der betroffenen Hardware muss ich mein Programm jetzt mal testweise
an einen meiner "User" schicken, in der Hoffnung, daß das was verbessert,
und nicht alles noch schlimmer macht .. :|

MmVisual
Beiträge: 1581
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
CPU-Target: 32/64Bit

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von MmVisual »

Gib diese fragwürdie Parameter per INI Datei ein, dann kann man mit dem User ein wenig spielen, ohne dass er Lazarus haben muss.
EleLa - Elektronik Lagerverwaltung - www.elela.de

PeterS
Beiträge: 161
Registriert: So 22. Feb 2015, 11:36
OS, Lazarus, FPC: L 3.8
CPU-Target: win32

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von PeterS »

MmVisual hat geschrieben: Di 31. Dez 2024, 12:10 Gib diese fragwürdie Parameter per INI Datei ein, dann kann man mit dem User ein wenig spielen, ohne dass er Lazarus haben muss.
Daran hatte ich auch schon gedacht, aber die User sind spielfreudig :D

Im ersten Schritt gebe ich ihnen einen Fest-Wert.
10 ms sind aus Sicht eines Computers ja eine riesengroße Zeitspanne.
Und mit der simulierten COM-Schnittstelle hat es hier gelaufen.

Ich weiß halt nicht, wie die realen RS485-To-USB-Adapter und ihre Treiber reagieren.
Ich kann mir ja nicht alle Adapter selber kaufen, die sich draußen herumtreiben, nur um's zu testen .. :roll:

sstvmaster
Beiträge: 582
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 3.8
CPU-Target: 32+64bit
Wohnort: Dresden

Re: SerialPort - TCommTimeouts - was einstellen ?

Beitrag von sstvmaster »

Hallo,

du könntest auch mal LazComPort probieren, ist eigentlich TComPort 4.12.

Link: https://github.com/alexx2000/lazcomport

!!! WINDOWS ONLY !!!

Hier brauchst du den Ordner Source, dann das Paket DsgnCPort.lpk compilieren und installieren.

Dann hast du in Lazarus einen Tab CPortLib. Dort befindet sich eine Komponente TComDataPacket,
hier kannst du ein Startstring / Stopstring eingeben

Im Anhang habe ich mal ein Library_help_file zugefügt.

Die ist aber für TComPort 2.6xx.
Dateianhänge
ComPort_library_help_file.pdf
(53.12 KiB) 131-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)

Antworten