[gelöst] Frage zu unit serial, bzw Raspi Pico aulesen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
oliver2104
Beiträge: 22
Registriert: Sa 26. Dez 2020, 13:22

[gelöst] Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von oliver2104 »

Hallo,
möchte mit der Unit serial, lesend auf den Pico zugreifen. (Unter Linux)
Bin aber über die Parameter von SerSetParams nicht ganz sicher.

Code: Alles auswählen

procedure SerSetParams(Handle: TSerialHandle; BitsPerSec: LongInt;
  ByteSize: Integer; Parity: TParityType; StopBits: Integer;
  Flags: TSerialFlags); 
Die Parameter : Handle(ausgelesen mit SerOpen) ,BitsPerSec(115200),ByteSize(8) und StopBits(1) dürften so richtig gesetzt sein.

Jetzt gehts noch darum, wie ich : no Handshake, DTR aktiv, RTS inaktiv (so vom Pico benötigt)
in den SerSetParams umsetze.

Um das zu setzen bleiben eigentlich nur die Parameter: Parity und Flags übrig.
Kann mir da jemand helfen ?
Zuletzt geändert von oliver2104 am Di 25. Okt 2022, 13:24, insgesamt 1-mal geändert.

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

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von six1 »

Rechte Maustaste auf TParityType und TSerialFlags und die Deklaration anschauen...
Gruß, Michael

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

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von siro »

TParityType habe ich gefunden:

Code: Alles auswählen

TParityType = (NoneParity, OddParity, EvenParity); 

vermutlich benötigst Du NoneParity

TSerialFlags habe ich auch gefunden

Code: Alles auswählen

TSerialFlags = set of (RtsCtsFlowControl); 
aber wo finde man nun RtsCtsFlowControl ???
da bin ich auch überfragt... :roll:
Suchfenster_01.jpg
Suchfenster_01.jpg (34.88 KiB) 1698 mal betrachtet
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

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

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von theo »

@Siro: Ja, ist merkwürdig.
Das muss wohl eine Art Überbleibsel sein.
Habe nur das gefunden: https://www.mail-archive.com/fpc-devel@ ... 11220.html

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von PascalDragon »

siro hat geschrieben:
Sa 15. Okt 2022, 18:25
TSerialFlags habe ich auch gefunden

Code: Alles auswählen

TSerialFlags = set of (RtsCtsFlowControl); 
aber wo finde man nun RtsCtsFlowControl ???
da bin ich auch überfragt... :roll:
Du findest RtsCtsFlowControl genau in der Deklaration von TSerialFlags. Das ist eine Deklaration eines Sets ohne spezifischen Enum-Typ, deswegen auch die Klammern und nicht set of TSomeEnum.
FPC Compiler Entwickler

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

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von siro »

Das habe ich jetzt leider noch nicht verstanden PascalDragon. :P
Ein "Set of" wovon denn ? Was soll man denn da als Parameter übergeben ?
Über die Klammerung wunderte ich mich schon, das ist schon aussergewöhnlich.
Einen numerischen Wert kann ich nicht übergeben, die Frage wäre ja auch welchen...
Ich danke Dir aber schonmal für die zusätzliche Info.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von Socke »

siro hat geschrieben:
So 16. Okt 2022, 18:05
Ein "Set of" wovon denn ? Was soll man denn da als Parameter übergeben ?
Über die Klammerung wunderte ich mich schon, das ist schon aussergewöhnlich.
Einen numerischen Wert kann ich nicht übergeben, die Frage wäre ja auch welchen...
Bei Set of gibt es zwei Varianten:

Code: Alles auswählen

type
// Variante 1 mit vordefiniertem Basistypen
TSomeEnum = (option1, option2);
TMySet = set of TBaseEnum;
// direkte Angabe der möglichen Werte
TMyOtherSet = set of (directOption1, directOption1);

var
  mySet: TMySet;
  myOtherSet: TMyOtherSet;
begin
   mySet := [option1];
   myOtherSet := [directOption1, directOption1];
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von PascalDragon »

siro hat geschrieben:
So 16. Okt 2022, 18:05
Das habe ich jetzt leider noch nicht verstanden PascalDragon. :P
Ein "Set of" wovon denn ? Was soll man denn da als Parameter übergeben ?
Über die Klammerung wunderte ich mich schon, das ist schon aussergewöhnlich.
Einen numerischen Wert kann ich nicht übergeben, die Frage wäre ja auch welchen...
Ich danke Dir aber schonmal für die zusätzliche Info.
Bei set of TYPE kannst du für TYPE entweder einen Enumerationstyp, einen anderen Typ (zum Beispiel Char oder einen Bereichstyp (z.B. TRange = 1..4)) oder direkt eine namenslose Enumeration angeben (in runden Klammern). In letzterem Fall gibst du eben wie in einem Enumerationstyp die Namen der einzelnen Werte an, allerdings hat dann eben nur der Mengentyp einen Namen, nicht aber der Enumerationstyp.
FPC Compiler Entwickler

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

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von theo »

Danke für die Erklärung.
Im vorliegenden Fall, mit nur einem möglichen Wert, kommt das aber auf einen Boolean raus, wenn ich das richtig verstehe.
Deshalb bleibt es für mich "merkwürdig" und ein "Überbleibsel", wie oben schon vermutet.

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

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von siro »

Es ist vollbracht,ich habe es verstanden, dauert bei mir immer etwas länger.... :roll:
und nochmals vielen Dank für die Infos.

Das Ursprungsproblem ist ja die Übergabe des Sets an eine Funktion bzw. Procedure:

Ich muss also ersteinmal eine Instanz erzeugen vom Typ TSerialFlags, welche später als Übergabeparameter verwendet wird
und diese Instanz muss dann erstmal initialisiert werden. (dachte ich)
Wenn ich jedoch nur EINEN Wert habe, gibt das ja irgendwie nicht wirklich Sinn...(dachte ich)
Doch dazu erstmal folgendes kleines Progrämmchen zum testen:

Code: Alles auswählen

program Project1;

type
  TMySet = set of (opt1, opt2);
var
  mySet: TMySet;

procedure Test(param:TMySet);
begin
  if param = [] then writeln('nix drin')
  else begin
    if opt1 in param then Write('opt1 ');
    if opt2 in param then Write('opt2 ');
  end;
  Writeln;
end;

begin
  mySet:=[opt1];       // initialisierung der Instanz mit opt1
  Test(mySet);         // hier wird dann opt1 ausgegeben

  mySet:=[opt2];       // initialisierung der Instanz opt2
  Test(mySet);         // hier wird dann opt2 ausgegeben

  mySet:=[opt1,opt2];  // initialisierung der Instanz mit opt2 und opt2
  Test(mySet);         // hier wird dann opt1 und opt 2 ausgegeben

  mySet:=[];           // nun ist das Set leer....das geht nämlich auch...
  Test(mySet);         // hier wird dann "nix drin" ausgegeben

  readln;              // Beenden mit Entertaste

end.
Demnach folgerte ich für die Unit Serial muss man dann folgendes tun:

Code: Alles auswählen

var FlowControl = TSerialFlags;
.....
  FlowControl:=[RtsCtsFlowControl];  // wenn man die Datenflusskontrolle über RTS und CTS haben möchte.
  FlowControl:=[];                   // wenn man keine Flusskontrolle haben möchte.

  SerSetParams(handle, 115200, 8, NoneParity, 1, FlowControl);
Aber es geht auch ohne eine Zwischenvariable, nämlich so:

Code: Alles auswählen

   
  SerSetParams(handle, 115200, 8, NoneParity, 1, []);                   // ohne Flusskontrolle
  SerSetParams(handle, 115200, 8, NoneParity, 1, [RtsCtsFlowControl]);  // mit  Flusskontrolle
Achja, mit diesen Proceduren lassen sich die Pegel für DTR und RTS einstellen, das war ja auch noch gefragt.
procedure SerSetDTR(Handle: TSerialHandle; State: Boolean);
procedure SerSetRTS(Handle: TSerialHandle; State: Boolean);


Ich würde sagen das Problem ist gelöst, aber ich war ja nicht der Thread Steller.
Grüße von Siro
Bevor ich "C" ertragen muß, nehm ich lieber Lazarus...

PascalDragon
Beiträge: 830
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von PascalDragon »

theo hat geschrieben:
Mo 17. Okt 2022, 08:11
Im vorliegenden Fall, mit nur einem möglichen Wert, kommt das aber auf einen Boolean raus, wenn ich das richtig verstehe.
Deshalb bleibt es für mich "merkwürdig" und ein "Überbleibsel", wie oben schon vermutet.
Nur weil aktuell nur ein Wert enthalten ist, muss das nicht heißen, dass dies so bleiben muss. Durch die Verwendung eines Set statt eines Boolean ist dies leicht ohne Überladung oder Kompilierfehler erweiterbar.
FPC Compiler Entwickler

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

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von theo »

PascalDragon hat geschrieben:
Di 18. Okt 2022, 07:37
Nur weil aktuell nur ein Wert enthalten ist, muss das nicht heißen, dass dies so bleiben muss. Durch die Verwendung eines Set statt eines Boolean ist dies leicht ohne Überladung oder Kompilierfehler erweiterbar.
Ja, theoretisch möglich, praktisch aber eher unwahrscheinlich und es sieht nicht so aus, als ob das hier der Fall wäre.
Ich glaube eher, dass die restlichen Optionen entfernt wurden.
Die Deklaration sah anscheinend schon mal anders aus:

Code: Alles auswählen

TSerialFlag = (NoneFlowControl, XOnXOffFlowControl, RtsCtsFlowControl, DtrDsrFlowControl);

TSerialFlags = set of TSerialFlag;
Ich habe ja nicht gesagt, dass es falsch sei, nur merkwürdig. :wink:

oliver2104
Beiträge: 22
Registriert: Sa 26. Dez 2020, 13:22

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von oliver2104 »

Vielen Dank für die Beiträge,
soweit ich das ausprobiert habe gibts nur diese 2 Möglichkeiten:

Code: Alles auswählen

  SerSetParams(handle, 115200, 8, NoneParity, 1, []);                   
  SerSetParams(handle, 115200, 8, NoneParity, 1, [RtsCtsFlowControl]);
alles andere: [NoneFlowControl], [XOnXOffFlowControl] und [DtrDsrFlowControl]
ergibt beim kompilieren > Error: Identifier not found
darüber hinaus gibt es noch:

Code: Alles auswählen

  SerSetDTR(handle, true); // DTR aktiv
  SerSetRTS(handle, false); // RTS inaktiv
nehme mal das passt so für den Pico.

Bin aber ein totaler Anfänger was die serielle Schnittstelle betrifft.
und befürchte auch Probleme beim Einlesen:

Code: Alles auswählen

{ Reads a maximum of "Count" bytes of data into the specified buffer.
  Result: Number of bytes read. }
function SerRead(Handle: TSerialHandle; var Buffer; Count: LongInt): LongInt;
Der Pico liefert ca. alle 10ms einen 16bit Wert gefolgt von einem <ENTER> bzw. CR+LF
also so wie es auch Pascal bei einem writeln(wert); tun würde.
Möchte jetzt jede Zeile die vom Pico geliefert wird, in Pascal einlesen.
Zu erwarten sind eben nur Werte zwischen 0 und 65535.

Wäre die obige Funktion dafür geeignet ?
Wenn ja, auf was sollte ich "Count" (Number of bytes read) setzen ?
2 (nur Werte) oder 3 (Werte + neue Zeile) ?

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von Socke »

oliver2104 hat geschrieben:
Di 18. Okt 2022, 12:58
Der Pico liefert ca. alle 10ms einen 16bit Wert gefolgt von einem <ENTER> bzw. CR+LF
also so wie es auch Pascal bei einem writeln(wert); tun würde.
Möchte jetzt jede Zeile die vom Pico geliefert wird, in Pascal einlesen.
Zu erwarten sind eben nur Werte zwischen 0 und 65535.

Wäre die obige Funktion dafür geeignet ?
Wenn ja, auf was sollte ich "Count" (Number of bytes read) setzen ?
2 (nur Werte) oder 3 (Werte + neue Zeile) ?
Da kannst du ganz einfach zusammenzählen:
  • 16 Bit = 2 Byte
  • CR+LF = 2 Byte (UTF-8/ASCII)
  • Summe = 4 Byte
Du kannst natürlich immer erst zwei Byte lesen und in deine Ziel-Variable schreiben und dann liest du zwei weitere Bytes (CR+LF) und machst nichts weiter damit. Du musst sie aber lesen, damit sie von der seriellen Schnittstelle verwschwinden.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: Frage zu unit serial, bzw Raspi Pico aulesen

Beitrag von sstvmaster »

Dumme Zwischenfrage von mir, käme oliver2104 nicht besser er würde die unit Synaser aus dem Paket Laz_Synapse nehmen?
LG Maik

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

Antworten