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.
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=