Entwickler-Ecke

Sonstiges (FPC / Lazarus) / Linux API - Kommunikation mittels synaser unter linux/lazarus


cbob - Do 08.10.09 21:20
Titel: Kommunikation mittels synaser unter linux/lazarus
Habe wieder ein 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/Hardware_Access/de#Serielle_Kommunikation 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:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
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(192008'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=


cbob - Mo 12.10.09 20:20

Hm, komisch, niemand da, der schonmal unter Linux mit Lazarus/FreePascal die serielle sChnittstelle programmiert hat?!


cbob - Di 27.10.09 01:05

Update:

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