DataPort-Komponente und Datenübertragungsproblem

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

DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Hallo zusammen,

ich habe die DataPort-Komponenten von Sergey Bodrov installiert, um ein Spektrometer (Messgerät) an seinem COM-Port zu betreiben. So weit so gut: Die Kommunikation funktioniert grundsätzlich, die Einstellungen und die Datenverarbeitung stimmen. Es wird das erwartete Spektrum ausgeleisen. Allerdings sind 30% der Messwerte von Übertragungsfehlern betroffen, die sich in willkürlichen sogenannten Spikes äußern. Das Spektrum wird als String aus ca. 3600 Zeichen übertragen. Hierbei handelt es sich um 1600 UInt16-Variablen, wobei abwechselnd das Hi- und das Lo-Byte übertragen werden. Die Baudrate beträgt 3.000.000 bauartbedingt durch das Spektrometer. Bei meiner Datenverarbeitung habe ich wie gesagt keinen Fehler gefunden. Die nicht korrupten Zahlen machen Sinn. Die Software von Spektrometerhersteller auf Lab-View-Basis zeigt keinerlei Übertragungsfehler. Kurze Rückantworten, wie das Auslesen des Spektrometertys funktionieren auch bei meiner Software, aber wie gesagt, die Übertragung des Datenstrings nur unzuverlässig. Hat jemand eine Idee, woran die Probleme liegen könnten?

Ich habe auch schon SynapseVS probiert. Hier scheitert die Sache schon daran, dass TvsComPort keine so hohe Baudrate erlaubt.

Viele Grüße

Christoph

NoCee
Beiträge: 157
Registriert: Do 3. Mär 2011, 21:34
OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
CPU-Target: Intel 32/64Bit, ARM9
Wohnort: Ulm

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von NoCee »

Hallo,
was benutzt du für eine Schnittstelle?
Com-Port kann ja vieles sein. echte RS232, RS422/485-Karte, virtueller Com-Port von USB/Netzwerk usw.
Die angegebene Baudrate ist schon ordentlich. Da macht nicht jede Hardware mit.
Eine echte RS232 z.B. mit Sicherheit nicht.
Läuft die Software von Spektrometerhersteller auf Lab-View-Basis auf der gleichen Hardware?

Gruß
NoCee

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Winni »

Hi!

Wenn es nicht zur Beseitigung der Fehlerquelle hilft, dann dient es aber zur Erheiterung:

Ich hatte Probleme beim Auslesen der Daten einer Telefonanlage eines namhaften deutschen Herstellers. Im Handbuch stand, wie sie es gerne gehabt hätten. Aber:

Statt der dokumentierten 8 Bit wurden nur 7 Bit geliefert - Umlaute gab es nicht.
Und es stand viel Müll in den Daten.

Da half schließlich ein Blick in die ANSI-Tabelle:
Der Müll entstand, wenn das 8. Bit gesetzt war.
Und wann das gesetzt war, entschieden die Elektro-Götter.

Nach dem maskieren des 8. Bits klappte alles wunderbar.
Wenn auch nur mit 7 Bit.

Deutsche Wertarbeit.

Will sage: Die Fehler können auch dort liegen, woran man zuerst mal nicht denkt.

Winni

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Hallo nochmal und Nachtrag:

Es handelt sich um einen virtuellen com-Port über USB.

Viele Grüße

Christoph

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Hallo, hier ein paar neue Infos:

Das Problem liegt wohl daran, dass die Daten in Binärcode übergeben werden. Da die Komponente einen Null-terminierten String verwendet, ist dies der Todesstoß, da auch Nullen übertragen werden.

Gibt es eine Komponente, die stattdessen ein Array of Char oder Int8 verwendet?

Viele Grüße

Christoph

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Winni »

Hi!

Und was, wenn im HI byte oder im Lo byte ne Null steht???
Dann gibt's auch Ärger.

Du solltest die Daten nach Base64 umwandeln. Das ist für genau solch Fälle entwickelt worden.

Winni

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Hallo Winni,

so was ähnliches habe ich den Spektrometerhersteller auch schon vorgeschlagen. Antwort: Zu kompliziert und in Labview C oder Pyton geht es ja. Toll, soll ich jetzt in Lazarus eine Komponente auf Basis von Win-Api-Funktionen neu schreiben, habe ich mir gedacht. Die Frage ist, ob es auch einfacher geht. Über ein paar Tips, die nicht die Firmware eines Herstellers auf den Kopf stellt, wäre ich sehr dankbar, da letzteres ich will es mal so sagen, sehr anstrengend werden könnte.

Viele Grüße

Christoph

Benutzeravatar
six1
Beiträge: 615
Registriert: Do 1. Jul 2010, 19:01

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von six1 »

Also ich habe mal bei gekaufter nrCom und auch bei TLazSerial nachgeschaut.
Da gibt es neben dem Empfang eines String ala "LazSerial1.ReadData" auch einen Zugriff auf einen Buffer.
Hiermit ist der Empfang eines Null Bytes gar kein Problem: "LazSerial1.SynSer.RecvBuffer()"

...oder habe ich dich missverstanden?
Gruß, Michael

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Hallo six1,

ich habe zusätzlich noch SynapseVS installiert und das Paket enthält auch eine Com-Komponente. Die Fehler waren die gleichen. Ich habe jetzt mal nachgeforscht und komme auch auf SynSer.RecvBuffer(). Wenn ich hier auf den unveränderten Eingangspuffer Zugriff habe, habe ich wohl gewonnen. Was ich mich in dem Zusammenhang frage ist, ob diese Komponente wirklich frei ist. Ich habe in den heruntergeladenen Dateien keine Angaben zur Lizenz gefunden.

Viele Grüße und vielen Dank

Christoph

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

...und noch eine entscheidende Frage:

Für die Funktion brauche ich die Größe bzw. den Füllstand des Eingangspuffers. Wie komme ich an diese Info?

VG Christoph

Benutzeravatar
six1
Beiträge: 615
Registriert: Do 1. Jul 2010, 19:01

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von six1 »

gibt es für deine Übertragung so etwas wie ein Protokoll? (Startzeichen, länge, daten, Endekenner) oder so etwas?
Ansonsten kann man Daten auch mit Timeout am Ende der daten empfangen...
Gruß, Michael

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Ja, die gibt es natürlich. Aber dafür muss ich ja auf den Puffer zurückgreifen. Ich weiß halt nicht, ob bei dem Ereignis onRXData schon alle Daten übertragen worden sind. Da steht dann irgend ein Teil in dem Block. Meine bisherige Programmierung läuft so, dass alles in einen Pufferstring geladen wird, bis die Terminierungszeichenfolge am Ende steht. Hierbei kommt es aber zum Verschlucken der Null-Bytes.

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

Re: DataPort-Komponente und Datenübertragungsproblem

Beitrag von Lomat »

Ich muss ja irgendeinen Zeiger übergeben, der eine Variable repräsentiert in der die Daten stehen. Ich weiß halt nicht, was passiert, wenn der Block zu groß ist. Ansonsten müsste man hier sich bis zur Terminatinsbitfolge vortasten. Was ich mich frage ist halt, ob es irgendeine Funktion gibt, die mir den Füllstand des Puffers verrät. Alternativ kann ich mir vorstellen, dass es sich um einen statischen Puffer handelt, bei dem halt ein Block definierter Größe hinterlegt ist. Hier müsste ich die größe des Speicherblocks wissen.

Antworten