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
wiki.lazarus.freepas...rielle_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:
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'); Sleep(1000); ser.ConvertLineEnd:=true; ser.config(19200, 8, 'N', SB1, False, False); Write('Device: ' + ser.Device + ' Status: ' + ser.LastErrorDesc +' '+Inttostr(ser.LastError)); Sleep(500); repeat ser.SendString('$01V'+#13); sleep(150); Write(inttostr(ser.WaitingDataEx)+": "); Write(ser.RecvBufferStr(10,500)+':RecvBuff '); Write(ser.RecvString(500)+'RecvStr '+#13+#10); 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=