[Gelöst] DataPort-Komponente und Datenübertragungsproblem

Rund um die LCL und andere Komponenten
Lomat
Beiträge: 17
Registriert: Fr 14. Jan 2022, 13:44

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Hallo Siro,

vielleicht bin ich auch zu dumm, aber ich finde keine Möglichkeit bei Syanser den Port zurückzusetzen, noch irgenwelche sinnvollen Fehlermeldungen zu generieren. Der Port verweigert sporadisch die Kommunikation und kann nur durch Öffnen und Schließen mit einem separaten Terminalprogramm reaktiviet werden. Öffnen und Schließen meiner Anwendung führt nicht zur Freigabe des Ports, obwohl dies im Destruktor natürlich versucht wird. CanRead und CanWrite ergeben trotzdem True. Mein Verbindungsversuch lautet wie folgt:

Procedure TSpectrometer.Connect(stPort : String;
iBaudRate : Integer;
cParity : Char;
SerialStopBits : TSerialStopBits;
iDataBits : Integer;
SpectrometerModelToggleBox : TToggleBox);
Var st : String;
Begin
//Der Port wird völlig neu Initialisiert (CloseSocket und anschließend noch mal Open bringt nichts):
If Assigned(BlockSerial) Then FreeAndNil(BlockSerial);
BlockSerial := TBlockSerial.Create;
st := BlockSerial.GetVersion; //Nur zum Debuggen
BlockSerial.Connect(stPort);
BlockSerial.Purge;

If Not(BlockSerial.LastError = 0) Then ShowMessage(BlockSerial.LastErrorDesc);

Delay(100);
BlockSerial.Config(iBaudrate, iDataBits, cParity, 1 {Stopbits}, True, False); //Stopbits müssen noch kompatibel berechnet werden

if Not(BlockSerial.InstanceActive) then ShowMessage('Verbindung Fehlgeschlagen!');
If Not(BlockSerial.CanWrite(100)) Then ShowMessage('Fehler bei der Datenübertragung!');

BlockSerial.SendString(Param.stStartInternalMeasurment); //Das Spektrometer wird gestartet

//Der Name des Spektrometers wird abgefragt: Kommt hier ein leerer String, ist die Kommunikation auch sonst tot.
If Not(BlockSerial.CanWrite(100)) Then ShowMessage('Fehler bei der Datenübertragung!');
BlockSerial.SendString(Param.stGetName);
//Delay(100);
st := BlockSerial.Recvstring(200);
SpectrometerModelToggleBox.Caption := st;
End;

Öffne und schließe ich über die DataPortSerial-Komponente und gebe über diese auch den Port frei, funktioniert die Kommunitation nur teilweise wieder. Dann kommt es zum Verschlucken von einzelnen Bytes beim anschließenden Einlesen des Spektrums bzw. der vom Messinstument generierten Daten. Dann hilft auch nur das Öffen und Schließen mit dem Terminal-Programm. Danach erhalte ich wieder valide Daten beim Einlesen der Spektren. Ich weiß nicht, wo ich ansetzen soll...

VG Christoph

siro
Beiträge: 586
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von siro »

Hallo Christoph,
ich habe heute schon mindestens 2 Stunden herum probiert.
Auch den Synaser Code mir angesehen.

Was mich grade wundert:

Ich habe ein kleines Testprogramm geschrieben, das lediglich die Schnittstelle öffnet und schliesst.
Dazu habe ich eine Taste die mir die Anzahl empfangener Daten liefert.
Mein Gerät sendet kontinuierlich Bytes, ich hole die aber nicht ab.

Die Funktion WaitData liefert mir auf Tastendruck die Anzahl Bytes im Empfangspuffer.
das endet bei mir mit der Anzeige 65536 :shock:
Der Empfangspuffer ist aber angeblich nur 4096 Bytes gross....

caption:=IntToStr(BlockSerial.SizeRecvBuffer); // liefert 4096

Label_WaitngData.caption:=IntToStr(BlockSerial.WaitingData) // Anzahl empfangener Bytes läuft hoch bis 65536 ????????

Meine Synaser Version liefert mir SynaSer 7.5.0

Ich probiere aber noch weiter, jedoch nicht mehr heute.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

siro
Beiträge: 586
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von siro »

Thema SizeRecvBuffer:
Setze ich den Wert höher als 65536 also z.B. 100000 dann geht das auch.
WaitingData liefert dann auch 100000 wenn der ReceiveBuffer voll gelaufen ist.
Aber kleinere Werte als 65536 werden anscheinend ignoriert.
Hängt evtl. mit dem Virtuellen Comport und dem Treiber zusammen ?
es wird die Windows Funktion SetupComm aufgerufen.

WaitingData und WaitingDataEx liefern anscheinend das gleiches Ergebnis 0..65536

Das der Port blockiert wird, bekomme ich aber nicht hin.

auch nicht wenn ich eine Verbindung habe und dann den USB rausziehe.

Dann habe ich die Schnittstelle geöffnet und NICHT wieder geschlossen, sondern einfach das Programm beendet.
Mit eingeschaltetem HeapTrace bekomme ich auch die entsprechende Fehlermeldung.

Aber der Port ist beim nächsten Start sofort wieder verfügbar.

Mein Baustein (USB-Seriell-Converter) ist der Silabs CP2102
Baudrate ist bei mir aber nur 115200 vielleicht hat das auch noch einen Einfluss

Da weis ich jetzt auch weiter keine Rat.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von sstvmaster »

Hier gibt es die aktuellste laz_synapse mit synaser 7.7.0: https://sourceforge.net/p/synalist/code ... ree/trunk/
LG Maik

Windows 10,
- Lazarus 2.2.2 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.3 (fixes) + fpc 3.3.1 (main/trunk)

siro
Beiträge: 586
Registriert: Di 23. Aug 2016, 14:25
OS, Lazarus, FPC: Windows 10
CPU-Target: 64Bit
Wohnort: Berlin

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von siro »

Vielen Dank für den Link Maik.

Info:
im Header der Datei Synaser.pas steht:
Project : Ararat Synapse 007.007.000

Die Funktion GetVersion von Synaser liefert
Result := 'SynaSer 7.6.0';

Dann hab ich grad mal die Funktion CanRead ausprobiert.
Angeblich kann man als Paramerter -1 übergeben.
Das löst bei mir einen Exception aus wenn der ReceiveBuffer leer ist.

Es gibt dazu aber auch eine Hinweis im Code:
If the value of the Timeout parameter is set to -1, the function returns only after it detects data on the port
(this may cause the process to hang).


folgender Code läuft aber völlig korrekt:

Code: Alles auswählen

  caption:='CanRead waiting..........';
  BlockSerial.CanRead(1000);   // warte maximal 1 Sekunde auf Daten
  caption:='CanRead ready';
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Lomat
Beiträge: 17
Registriert: Fr 14. Jan 2022, 13:44

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Hallo nochmal,

über BlockSerial.RaiseExcept:=True habe ich den Ort des Fehlers lokalisieren können:

Exception "Communication Error 87: Falsche Parameter.

Ausgelöst in der Prozedur TBlockSerial.SetCommState.

Beim Aufruf von BlockSerial.Config kommt die Komponente mit den Konfigurationsdaten nicht klar, die in in dieser Prozedur zu Win-API-Befehlen verarbeitet werden. Hier stimmt was nicht, obwohl alle Parameter richtig übergeben werden.

Viele ratlose Grüße

Christoph

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von sstvmaster »

Mach mal nach Blockserial.config ein

Code: Alles auswählen

sleep(500);
LG Maik

Windows 10,
- Lazarus 2.2.2 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.3 (fixes) + fpc 3.3.1 (main/trunk)

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von sstvmaster »

Ich weiß auch nicht in welcher Reihenfolge du blockserial hast.
Ich kenne das so:

Code: Alles auswählen

...
Var
  Ser: TBlockserial;
begin
  Ser:=TBlockserial.Create;
  Ser.Connect('COM1');
  Sleep(300);
  Ser.config(19200, 8, 'N', SB1, False, False);
  Sleep(300);
  ...
end;
LG Maik

Windows 10,
- Lazarus 2.2.2 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.3 (fixes) + fpc 3.3.1 (main/trunk)

Lomat
Beiträge: 17
Registriert: Fr 14. Jan 2022, 13:44

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Habe ich gemacht, selbst 5000 bringt nichts.

Lomat
Beiträge: 17
Registriert: Fr 14. Jan 2022, 13:44

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

...und genau diese Reihenfolge verwende ich. Mit den Delays/Sleep habe ich auch schon zu genüge rumgespielt.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von af0815 »

Code: Alles auswählen

BlockSerial.Config(iBaudrate, iDataBits, cParity, 1 {Stopbits}, True, False);
Und was steht genau in iBaudrate, iDataBits und cParity drinnen. Hast du versucht es einmal direkt in den Code zu schreiben, als über Parameter anzugeben ?! Du sagst ja selbst das es da eine Exception gibt.
Beim Aufruf von BlockSerial.Config kommt die Komponente mit den Konfigurationsdaten nicht klar, die in in dieser Prozedur zu Win-API-Befehlen verarbeitet werden. Hier stimmt was nicht, obwohl alle Parameter richtig übergeben werden.
Das heisst für mich, das die Parameter von der Win-API nicht aktzeptiert werden, auch wenn du die gerne haben würdest. Du gibst etwas vor und die Win-API schmeisst dir das zurück. Das heisst einmal alle Parameter auf 'Save' Values. Beispiel

Code: Alles auswählen

Ser.config(19200, 8, 'N', SB1, False, False);
Kommt dann noch die Exception oder nicht. Wenn nein, dann EINEN Parameter ändern und testen, Schritt für Schritt bis du den Parameter hast der die Exception auslöst. Kann sein, das eine Baudrate von 3.000.000 von dem verwendeten API Call nicht aktzeptiert wird. Bei Win steht als maximal vordefinierter wer nur (230400, B230400) zur Verfügung ! Nur Unter Unix/Linux sind höhere Werte in der Synaser.pas vorgesehen. Damit glaube ich auch nicht das du die Konstane B3000000 in Windows verwenden kannst.

Edit: Infos zum DCB der von Synaser gebildet wird https://docs.microsoft.com/en-us/window ... inbase-dcb
Zuletzt geändert von af0815 am Di 31. Mai 2022, 18:48, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1320
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Winni »

Hi!

Unkritische Baudraten sind

75 * 2 ^ n

also 75, 150, 300, ..... 115200

Es kann sein, dass die Win-API mit Werten, die aus dieser Reihe tanzen, nicht umgehen kann.

Winni

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von af0815 »

Winni hat geschrieben:
Di 31. Mai 2022, 18:39
Es kann sein, dass die Win-API mit Werten, die aus dieser Reihe tanzen, nicht umgehen kann.
Die Frage ist eher ob der Treiber der über die Win-API angesteuert wird, es so zulässt. Die Win-APi macht da keine Auskünfte (M$-Antwort - im Prinzip ja)
win-API hat geschrieben:The baud rate at which the communications device operates. This member can be an actual baud rate value, or one of the following indexes.
Edit: Eine Frage noch - Ist das Programm Win32 oder Win 64 ? Nicht das Probleme mit der Länge des Controlblocks gibt https://stackoverflow.com/questions/370 ... -windows-7
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Winni
Beiträge: 1320
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Winni »

Hi!

In Windows vordefinierte Baudraten:

115,200 Yes
128,000 Yes (ISDN )
230,400 No
250,000 No
256,000 Yes

Aus:

https://en.wikipedia.org/wiki/Serial_port#Settings (plattdeutsch)

Winni

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von af0815 »

Die Limits für die Hardware haben sich mit den USB-Sticks verschoben.

https://ftdichip.com/products/ft2232hq/
Independent Baud rate generators.
RS232/RS422/RS485 UART Transfer Data Rate up to 12Mbaud. (RS232 Data Rate limited by external level shifter).
Aus dem Datasheet
Independent Baud Rate Generators – The Baud Rate Generators provides an x16 or an x10 clock
input to the UART’s from a 120MHz reference clock and consists of a 14 bit pre-scaler and 4 register bits
which provide fine tuning of the baud rate (used to divide by a number plus a fraction). This determines
the Baud Rate of the UART which is programmable from 183 baud to 12 million baud. The FT2232H does
not support the baud rates of 7 Mbaud 9 Mbaud, 10 Mbaud and 11 Mbaud.
Appications Notes für die Kalkulation der Baudrate beim obiger Chipfamilie siehe https://www.ftdichip.com/Support/Docume ... dRates.pdf

Eine weiter Diskussion ist nicht zielführend, weil weder die HW noch weiter Parameter wirklich bekannt sind.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten