[Gelöst] DataPort-Komponente und Datenübertragungsproblem
Re: DataPort-Komponente und Datenübertragungsproblem
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
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
-
- Beiträge: 761
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: DataPort-Komponente und Datenübertragungsproblem
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
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.
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

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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 761
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: DataPort-Komponente und Datenübertragungsproblem
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.
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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: DataPort-Komponente und Datenübertragungsproblem
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 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 761
- Registriert: Di 23. Aug 2016, 14:25
- OS, Lazarus, FPC: Windows 11
- CPU-Target: 64Bit
- Wohnort: Berlin
Re: DataPort-Komponente und Datenübertragungsproblem
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:
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...
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...
Re: DataPort-Komponente und Datenübertragungsproblem
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
ü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
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: DataPort-Komponente und Datenübertragungsproblem
Mach mal nach Blockserial.config ein
Code: Alles auswählen
sleep(500);
LG Maik
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
-
- Beiträge: 582
- Registriert: Sa 22. Okt 2016, 23:12
- OS, Lazarus, FPC: W10, L 3.8
- CPU-Target: 32+64bit
- Wohnort: Dresden
Re: DataPort-Komponente und Datenübertragungsproblem
Ich weiß auch nicht in welcher Reihenfolge du blockserial hast.
Ich kenne das so:
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 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Windows 10,
- Lazarus 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Re: DataPort-Komponente und Datenübertragungsproblem
Habe ich gemacht, selbst 5000 bringt nichts.
Re: DataPort-Komponente und Datenübertragungsproblem
...und genau diese Reihenfolge verwende ich. Mit den Delays/Sleep habe ich auch schon zu genüge rumgespielt.
- af0815
- Lazarusforum e. V.
- Beiträge: 6795
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: DataPort-Komponente und Datenübertragungsproblem
Code: Alles auswählen
BlockSerial.Config(iBaudrate, iDataBits, cParity, 1 {Stopbits}, True, False);
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. BeispielBeim 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.
Code: Alles auswählen
Ser.config(19200, 8, 'N', SB1, False, False);
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).
- Winni
- Beiträge: 1577
- 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
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
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
- af0815
- Lazarusforum e. V.
- Beiträge: 6795
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: DataPort-Komponente und Datenübertragungsproblem
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)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.
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-7win-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.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- Winni
- Beiträge: 1577
- 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
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
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
- af0815
- Lazarusforum e. V.
- Beiträge: 6795
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: DataPort-Komponente und Datenübertragungsproblem
Die Limits für die Hardware haben sich mit den USB-Sticks verschoben.
https://ftdichip.com/products/ft2232hq/
Eine weiter Diskussion ist nicht zielführend, weil weder die HW noch weiter Parameter wirklich bekannt sind.
https://ftdichip.com/products/ft2232hq/
Aus dem DatasheetIndependent Baud rate generators.
RS232/RS422/RS485 UART Transfer Data Rate up to 12Mbaud. (RS232 Data Rate limited by external level shifter).
Appications Notes für die Kalkulation der Baudrate beim obiger Chipfamilie siehe https://www.ftdichip.com/Support/Docume ... dRates.pdfIndependent 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.
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).