seit einiger Zeit versuche ich, ein Messgerät über die serielle Schnittstelle anzusprechen.
Das Prinzip ist ja immer das gleiche: Schnittstelle konfigurieren, String senden, String empfangen. So weit, so einfach. Für diese Aufgabe wird im Netz 'synaser' empfohlen.
Leider habe ich kein Minimalbeispiel eines funktionierenden Programms gefunden.
Wenn ich das Gerät z.B. mit PuTTy anspreche, meldet sich das Gerät zurück. Natürlich laufen die Programme bei Tests nicht gleichzeitig. Am Zugriff oder einem Konflikt sollte es also nicht liegen. Selbst mit dem Lazarus Programm schaltet das Messgerät auf den Remote-Modus um. Also irgendwas scheint anzukommen.
Aber warum bekomme ich nichts zurück? Woran liegt's? Kurze Antwort: An mir natürlich

Nach dem TimeOut wird in Memo1 angezeigt:
COM1,COM3,COM12 HalloEnde
d.h. 'Carriage Return' chr(13) wird in Memo1 nicht angezeigt, liegt's vielleicht auch beim SendString() am chr(13) oder ist das ein anderes Thema?
Danke für Hinweise.
Theo.
Der Code:
Code: Alles auswählen
unit tbeserial;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
SynaSer;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
StaticText1: TStaticText;
procedure Button1Click(Sender: TObject);
procedure RS232_connect(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
RS232_connect(Sender);
end;
procedure TForm1.RS232_connect(Sender: TObject);
var
ser: TBlockSerial;
Response, Command: string;
begin
ser:=TBlockSerial.Create;
ser.Connect('COM1');
ser.config(19200, 8, 'N', SB1, False, False);
Command := '*IDN?' + chr(13);
ser.SendString(Command);
sleep(1000);
Response := ser.RecvString(3000);
Memo1.Append(GetSerialPortNames() + chr(9) + 'Hallo' + chr(13) + Response + chr(13) + 'Ende');
end;
end.