Kommunikation mittels synaser unter linux/lazarus

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

Kommunikation mittels synaser unter linux/lazarus

Beitrag von c-bob »

Habe ein weiteres Problem:

Ich muss unter Linux die serielle Schnittstelle ansprechen und habe dazu die Unit Synaser im Einsatz. Wenn ich nun das Beispielprogramm von http://wiki.lazarus.freepascal.org/Hard ... munikation nutzr, funktioniert zumindest augenscheinlich der Zugriff auf die Schnittstelle. Allerdings werden keine Daten als Rückmeldung angezeigt, wenn ich z.B. eine alte serielle Maus an den Port hänge (USB-Seriell-Adapter, mittels ttyUSB0 bzw. ttyUSB1).
Wenn ich weiterhin das Programm der Art verändere, dass ich bspw. einen kleinen Logger ansprechen möchte und ihm dazu einen kurzen Befehl sende, bekomme ich auch keine Daten zurück. Diese müssten aber 100% wieder zurückkommen.
Geteste hab ich das mit einem Teminalprogramm (gtkterm). Dort konnte ich einen kurzen Befehl absetzen, woraufhin ich dann auch sofort eine Antwort vom Logger bekam.
Wahrscheinlich setze ich die Synaser-Routinen noch nicht richtig ein, aber deshalb bin ich ja hier, vielleicht kann mir jemand auf die Sprünge helfen.
hier nun der Code:

Code: Alles auswählen

program serialtest;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,SysUtils,Synaser,Crt
 
  procedure RS232_connect;
  var
     ser: TBlockSerial;
  begin
       ser:=TBlockSerial.Create;
       try
          ser.Connect('/dev/ttyUSB1'); //ComPort
          Sleep(1000);                                           //--> sind die sleeps notwendig?! Ist die Anwendung zeitkritisch?
          ser.ConvertLineEnd:=true;                              //--> der Logger wirft nur ein <CR> zum Ende einer Zeile aus
          ser.config(19200, 8, 'N', SB1, False, False);
          Write('Device: ' + ser.Device + '   Status: ' + ser.LastErrorDesc +' '+Inttostr(ser.LastError));
          Sleep(500);                                            //--> hier genauso: sleep notwendig? 
          repeat
                ser.SendString('$01V'+#13);         //------> Anfrage an den Logger, müsste mit Versionsstring antworten
                sleep(150);
                Write(inttostr(ser.WaitingDataEx)+": ");         //--> Anzahl der Daten im Ausgabepuffer ()hier immer "0"  :-(
                Write(ser.RecvBufferStr(10,500)+':RecvBuff ');   //--> ergo, hier wird nichts ausgegeben
                Write(ser.RecvString(500)+'RecvStr '+#13+#10);   //--> hier auch nicht   :-(  ?? Was ist falsch?!?
                sleep(500);
          until keypressed; [/search]
       finally
              Writeln('Serial Port will be freed...');
              ser.free;
              Writeln('Serial Port was freed successfully!');
       end;
  end;
 
  begin
 
     RS232_connect();
  end.
Die Doku zu Synaser ist ja ansich nicht schlecht und es klingt ja auch alles recht logisch, aber es klappt halt nicht.
Vor allem komm ich mit der Aussage aus der Doku nicht klar:
"(RecvPacket) Read all available data and return it in the function result string. This function may be combined with @link(RecvString), @link(RecvByte) or related methods."
Oder:
"(RecvBufferEx) This method is used to read any amount of data (e. g. 1MB), and may be freely combined with all receviving methods what have Timeout parameter, like the @link(RecvString)"
--> Wie soll/kann ich da was kombinieren?!

Hat jemand eine Idee?!

Grüße
=C=

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
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: Kommunikation mittels synaser unter linux/lazarus

Beitrag von af0815 »

Keep it simple :-)

Wenn du per Nullmodemkabel 2 PCs verbindest und du nur 1 Buchstaben sendest, kommt dann was am anderen PC an ? Zumindest das Beispielprogramm mal testen.
Falls das nicht geht, würde ich einmal zwei 'Standard' Terminalprogramme verwenden und das Testen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

Re: Kommunikation mittels synaser unter linux/lazarus

Beitrag von c-bob »

2PC's mit Nullmodemkabel, hm, das ist ne Mögllichkeit. Muss ich mir aber erst basteln...
Mit nem TerminalProgramm funktionierts so, wie es eigentlich sollte. Bei dem Testprogramm wird allerdings definitiv gesendet und irgendwas kommt zumindest auch zurück - ist am USB-Serial-Adapter an den Rx/Tx LEDs zu sehen.
Das komische ist aber, dass ich garnichts sehe, was kommt.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
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: Kommunikation mittels synaser unter linux/lazarus

Beitrag von af0815 »

Die Idee mit den 2 PCs bringt dir die Sicherheit, das Dein Test-Programm mal ohne (offensichtlichen) Fehler ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

Re: Kommunikation mittels synaser unter linux/lazarus

Beitrag von c-bob »

Ja, eigentlich ist's ja noch einfacher - der USB-Seriell-Adapter hat zwei ports... merkste was?! Konnte ich an einem Rechner ausprobieren. Manchmal sieht man den Wald vor lauter Bäumen nicht - das ist halt einfach fehlende Erfahrung und der pragmatische Einsatz derer :oops:
Nun zum Thema - die Message wird von dem Programm richtig abgeschickt - im Terminal kommt folgerichtig "$01V<CR>" an. Tippe ich aber während der Port quasi offen ist etwas im Terminal, dann sollte dieses ja theoretisch von dem Programm aufgefangen werden und ausgegeben werden - das klappt aber nunmal definitiv leider immer noch nciht!
Hab ich die Routinen falsch verstanden? oder falsch initialisiert/configuriert?

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6770
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: Kommunikation mittels synaser unter linux/lazarus

Beitrag von af0815 »

Mach die Empfangsbuffergrösse mal 1. Ansonsten wird solange gewartet bis der Buffer voll ist.


BTW: Welchen USB-Serial Adapter verwendest du ? Meiner ist leider ein Win-Only.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

Re: Kommunikation mittels synaser unter linux/lazarus

Beitrag von c-bob »

So, Ergebnisse:
1.: der Adapter ist ein VSCom (oder so ähnlich) - funktioniert wunderbar unter Linux, zumindest mit den Standard-Programmen, die ich nicht selber programmiert hab ;-)
-> wie gesagt, mit nem normalen Terminal-Programm (gtkterm bspw. läufts ja ohne Probleme)

2.: unter Linux das Programm mit gtkterm als Gegenstelle getestet: die Daten, welche vom Programm gesendet werden, kommen korrekt im Terminal an, allerdings da, was ich zurück schreibe, kommt nicht im Programm an.

aber, nun kommts:
3.: das selbe Programm unter Windows (VirtualBox, XP, Lazarus (letzte veröffentliche Version aus Oktober09) nur /dev/ttyUSB1 in Com3 (unter Win wirds halt als Com3 erkannt) umbenannt, kompiliert und ausgeführt, funktioniert ohne Probleme mit dem Terminal gegenüber in Hin- und Rückrichtung.
Jetzt Test mit besagtem Logger: funktioniert auch (fast) Tadellos), nur mit RecvPacket kommt er nicht klar, er liest immer genau 24Byte, den Anfang schneidet er einfach ab - warum auch immer, in der Beschreibung ist eigentlich nix zu finden.
Mit RecvString läuft's so, wie es soll. Was mach ich unter Linux falsch??? Schreiben kann ich auf die Schnittstelle, nur lesen daraus irgendwie nicht :-/

c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

Re: Kommunikation mittels synaser unter linux/lazarus

Beitrag von c-bob »

Ergänzung:

Nach weiterem Rumprobieren (bspw. mit Flush, was aber auch nix brachte) habe ich nun einen Versuch mit parallel laufendem gtkterm , welches auf der selben Schnittstelle lauscht, gestartet. Siehe da, im Programm gab es die ersten Reaktionen. Es hatte den Anschein, als würden sich die beiden Programme die ankommenden Daten teilen.Ein paar Zeichen erschienen im Terminal und die anderen wurden durch mein Programm empfangen. Habe ich gtkterm auf eine andere Schnittstelle gestellt, kam wieder überhaupt nix mehr bei meinem Programm an. Woran kann das liegen?
Fängt irgend ein anderes Programm die Daten an der Schnittstelle ab?! Habe ich irgendetwas Grundlegendes bei der Behandlung der Schnittstellen übersehen?

c-bob
Beiträge: 30
Registriert: Mo 15. Jun 2009, 11:11

Re: Kommunikation mittels synaser unter linux/lazarus

Beitrag von c-bob »

Update:
Es liegt offensichtlich wirklich am USB-RS232 Adaptor. Mit der Onboard RS232 klappt es wie es soll.

Antworten