[gelöst] Synaser - RS232 ansprechen
[gelöst] Synaser - RS232 ansprechen
Hallo zusammen,
ich möchte eine Digitalwaage die per RS232 mit dem PC verbunden ist ansprechen.
Habe mir das Packet "Synaser" runtergeladen, komme damit allerdings überhaupt nicht zurecht.
Kann mir vielleicht jemand Schrittweise erklären wie ich diese Schnittstelle jetzt genau anspreche?
Die Übertragung der aktuellen Wägewerte findet permanent statt. Ich möchte den Wert also nur einlesen und in irgend ein Label schreiben.
Ich hoffe das ist keine große Sache.
Vielen Dank vorab!
Grüßle,
Theo
Technische Daten
8-bit ASCII Code
1 Startbit, 8 Datenbits, 1 Stopbits, kein Paritätsbit
Baudrate wählbar auf 2400, 4800, 9600 Baud (Werkseinstellung) und 19200 Baud.
Sub-D Stecker 9-polig
Bei Betrieb mit Schnittstelle ist der fehlerfreie Betrieb nur mit dem entsprechenden KERN-Schnittstellenkabel (max. 2m) sichergestellt
AUTOPRINT PC (ständige Datenausgabe)
Es werden ständig die aktuellen Wägewerte über die RS 232 Datenschnittstelle gesendet.
ich möchte eine Digitalwaage die per RS232 mit dem PC verbunden ist ansprechen.
Habe mir das Packet "Synaser" runtergeladen, komme damit allerdings überhaupt nicht zurecht.
Kann mir vielleicht jemand Schrittweise erklären wie ich diese Schnittstelle jetzt genau anspreche?
Die Übertragung der aktuellen Wägewerte findet permanent statt. Ich möchte den Wert also nur einlesen und in irgend ein Label schreiben.
Ich hoffe das ist keine große Sache.
Vielen Dank vorab!
Grüßle,
Theo
Technische Daten
8-bit ASCII Code
1 Startbit, 8 Datenbits, 1 Stopbits, kein Paritätsbit
Baudrate wählbar auf 2400, 4800, 9600 Baud (Werkseinstellung) und 19200 Baud.
Sub-D Stecker 9-polig
Bei Betrieb mit Schnittstelle ist der fehlerfreie Betrieb nur mit dem entsprechenden KERN-Schnittstellenkabel (max. 2m) sichergestellt
AUTOPRINT PC (ständige Datenausgabe)
Es werden ständig die aktuellen Wägewerte über die RS 232 Datenschnittstelle gesendet.
Zuletzt geändert von l0lhaxx am Di 23. Feb 2016, 14:03, insgesamt 1-mal geändert.
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
Re: Synaser - RS232 ansprechen
Ist absolut kein Problem.
ser:=TBlockSerial.Create;
Sleep(1000);// hier unbedingt warten bis das OS damit fertig ist, sonst kanns Probleme geben.
ser.Connect('COM1');// Windows COM1, 2, 3, ...bei Linux heißt das anders z.B. '/dev/ttyS4'
ser.config(9600, 8, 'N', SB1, False, False);
Den Empfang kann Synaser verschieden machen. In deinem Fall ist das mit RecvTerminated am einfachsten.
Die Steuerzeichen CR+LF werden dabei entfernt.
Edit1.Text := ser.RecvTerminated(1000, ch(13)+chr(10));// Wenn nichts empfangen wurde, blockiert hier das Programm 1000ms!!
ser.free;// Spätestens am Programmende die Schnittstelle wieder freigeben.
Sonst bleibt die bis zum Restart vom OS belegt.
Das Kabel kann man problemlos selber machen. 9600 baud auf 2m geht sogar ohne abgeschirmtes Kabel.
Besser ist natürlich mit Schirm.
Eine Stolperfalle ist da gerne mal ein Falschbelegen der Rx und Tx Pins.
Wenns überhaupt nicht tut, kann man da mal Pin 2 und 3 tauschen.
Eine Verpolung der beiden Pins hält die RS232 Schnittstelle locker aus. Kann man also ohne Angst probieren.
http://synapse.ararat.cz/doc/help/synas ... erial.html
http://wiki.freepascal.org/Hardware_Access
hier hat einer was ähnliches mit einem Meßgerät gemacht
allerdings mit Befehl senden, dann Meßwert empfangen.
http://www.lazarusforum.de/viewtopic.php?f=15&t=6559
Gruß
NoCee
ser:=TBlockSerial.Create;
Sleep(1000);// hier unbedingt warten bis das OS damit fertig ist, sonst kanns Probleme geben.
ser.Connect('COM1');// Windows COM1, 2, 3, ...bei Linux heißt das anders z.B. '/dev/ttyS4'
ser.config(9600, 8, 'N', SB1, False, False);
Den Empfang kann Synaser verschieden machen. In deinem Fall ist das mit RecvTerminated am einfachsten.
Die Steuerzeichen CR+LF werden dabei entfernt.
Edit1.Text := ser.RecvTerminated(1000, ch(13)+chr(10));// Wenn nichts empfangen wurde, blockiert hier das Programm 1000ms!!
ser.free;// Spätestens am Programmende die Schnittstelle wieder freigeben.
Sonst bleibt die bis zum Restart vom OS belegt.
Das Kabel kann man problemlos selber machen. 9600 baud auf 2m geht sogar ohne abgeschirmtes Kabel.
Besser ist natürlich mit Schirm.
Eine Stolperfalle ist da gerne mal ein Falschbelegen der Rx und Tx Pins.
Wenns überhaupt nicht tut, kann man da mal Pin 2 und 3 tauschen.
Eine Verpolung der beiden Pins hält die RS232 Schnittstelle locker aus. Kann man also ohne Angst probieren.
http://synapse.ararat.cz/doc/help/synas ... erial.html
http://wiki.freepascal.org/Hardware_Access
hier hat einer was ähnliches mit einem Meßgerät gemacht
allerdings mit Befehl senden, dann Meßwert empfangen.
http://www.lazarusforum.de/viewtopic.php?f=15&t=6559
Gruß
NoCee
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Synaser - RS232 ansprechen
Ich habe dies mit einem Timer gelöst, welcher ständig die Schnittstelle überprüft.
Das hat den Vorteil, das das Programm beim einlesen nicht blockiert ist. Somit kann man zB, auch etwas in sie Schnittstelle schreiben.
Das Programm verwende ich für meinen Arduino.
Das hat den Vorteil, das das Programm beim einlesen nicht blockiert ist. Somit kann man zB, auch etwas in sie Schnittstelle schreiben.
Das Programm verwende ich für meinen Arduino.
Code: Alles auswählen
var
ser: TBlockSerial
procedure TForm1.FormCreate(Sender: TObject);
begin
ser := TBlockSerial.Create;
ser.Purge;
{$IFDEF MSWINDOWS}
ser.Connect('COM8');
{$ELSE}
ser.Connect('/dev/ttyUSB0');
{$ENDIF}
Sleep(1000);
ser.Config(9600, 8, 'N', SB1, False, False);
Memo1.Lines.Add('Device: ' + ser.Device + ' Status: ' + ser.LastErrorDesc + ' ' + IntToStr(ser.LastError));
Sleep(1000);
Timer1.Interval:=100;
Timer1.Enabled := True;
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
Timer1.Enabled := False;
ser.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ser.SendBuffer(Pointer(Edit1.Text), Length(Edit1.Text));
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
s: string;
l, i: integer;
begin
while Timer1.Enabled and (ser.CanRead(10)) do begin
l := ser.WaitingData;
SetLength(s, l);
ser.RecvBuffer(@s[1], l);
Memo1.Text := Memo1.Text + s;
if CheckBox1.Checked then begin
Memo1.SelStart := Length(Memo1.Text);
end;
Application.ProcessMessages;
end;
end;
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Synaser - RS232 ansprechen
Bei mir reicht es ein fremdes Terminal-Programm aufzurufen und anschliessend zu beenden.ser.free;// Spätestens am Programmende die Schnittstelle wieder freigeben.
Sonst bleibt die bis zum Restart vom OS belegt.
Schön wäre, wen man am Anfang selbst so ein Reset machen könnte, nur weis ich nicht wie.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Synaser - RS232 ansprechen
Hallo zusammen,
danke für die Hilfe. Wollte das ganze nun mal Versuchen, bekomme aber ständig die Fehlermeldung
project1.lpr(18,53) Error: Identifier not found "TStartseite1"
in der project1.lpr. Kann mir jemand sagen was ich falsch mache?
Danke vorab.
danke für die Hilfe. Wollte das ganze nun mal Versuchen, bekomme aber ständig die Fehlermeldung
project1.lpr(18,53) Error: Identifier not found "TStartseite1"
in der project1.lpr. Kann mir jemand sagen was ich falsch mache?
Danke vorab.
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
ComCtrls, StdCtrls, ExtCtrls, Synaser;
type
{ TStartseite1 }
TStartseite1 = class(TForm)
ButtonEinwage: TButton;
ImageList1: TImageList;
MainMenu1: TMainMenu;
menuHilfeDrucken: TMenuItem;
menuHilfeProtokoll: TMenuItem;
menuHilfeEinwaage: TMenuItem;
menuProtokollAnzeigen: TMenuItem;
menuProtokollDrucken: TMenuItem;
menuWiegenSpeichern: TMenuItem;
menuWiegenNeu: TMenuItem;
menuWiegen: TMenuItem;
menuProtokoll: TMenuItem;
menuHilfe: TMenuItem;
Text1: TStaticText;
StatusBar1: TStatusBar;
procedure ButtonEinwageClick(Sender: TObject);
procedure menuHilfeDruckenClick(Sender: TObject);
procedure menuHilfeEinwaageClick(Sender: TObject);
procedure menuHilfeProtokollClick(Sender: TObject);
procedure menuProtokollAnzeigenClick(Sender: TObject);
procedure menuProtokollDruckenClick(Sender: TObject);
procedure menuWiegenNeuClick(Sender: TObject);
procedure menuWiegenSpeichernClick(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Text1: TStartseite1;
ser: TBlockSerial;
ch: string;
implementation
{$R *.lfm}
{ TStartseite1 }
procedure TStartseite1.ButtonEinwageClick(Sender: TObject); // RS232 Schnittstelle
begin
ser:=TBlockSerial.Create;
Sleep(1000); // Wartezeit 1000ms
ser.Connect('COM1');
ser.config(9600, 8, 'N', SB1, False, False); // Port initialisierung
Text1.Caption := ser.RecvTerminated(1000, ch[13]+ ch[10]); // Wenn nichts empfangen wurde, blockiert hier das Programm 1000ms!!
ser.free; // Spätestens am Programmende die Schnittstelle wieder freigeben.
end;
end.
Code: Alles auswählen
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms, Unit1, laz_synapse
{ you can add units after this };
{$R *.res}
begin
RequireDerivedFormResource := True;
Application.Initialize;
Application.CreateForm(TStartseite1, Startseite1);
Application.Run;
end.
Re: Synaser - RS232 ansprechen
Warum hast du Startseite1 in Text1 umbenannt?
Re: Synaser - RS232 ansprechen
Gute Frage. War eher unbeabsichtigt. Aber auch wenn ich die Zeile lösche bekomme ich die Fehlermeldung.theo hat geschrieben:Warum hast du Startseite1 in Text1 umbenannt?
Lösungsvorschlag?
Re: Synaser - RS232 ansprechen
Wieso löschen? Mach es einfach so wie es war:
Code: Alles auswählen
var
Startseite1: TStartseite1;
Re: Synaser - RS232 ansprechen
Haste recht
Dann geht es.
Hab das ganze jetzt mal probiert (Kompiliert). Sobald ich den Button drücke (Anschließend soll der Wert eingelesen werden) bekomme ich eine Fehlermeldung. Habe es jetzt mal ans Anhang angefügt.
Wenn ich die .exe im Verzeichnis ausführe kommt ein Berechtigungsfehler. Auch wenn ich die Datei als Administrator ausführe.

Hab das ganze jetzt mal probiert (Kompiliert). Sobald ich den Button drücke (Anschließend soll der Wert eingelesen werden) bekomme ich eine Fehlermeldung. Habe es jetzt mal ans Anhang angefügt.
Wenn ich die .exe im Verzeichnis ausführe kommt ein Berechtigungsfehler. Auch wenn ich die Datei als Administrator ausführe.

- Dateianhänge
-
- Als .EXE ausgeführt
- Unbenannt1.PNG (12.11 KiB) 3186 mal betrachtet
-
- In Lazarus ausgeführt
- Unbenannt.PNG (12.11 KiB) 3186 mal betrachtet
Re: Synaser - RS232 ansprechen
Das hat so keinen Sinn.
Willst du nicht lieber mal mit was einfachem beginnen?
So auf diesem Level: http://www.delphi-treff.de/tutorials/gr ... tutorials/
Willst du nicht lieber mal mit was einfachem beginnen?
So auf diesem Level: http://www.delphi-treff.de/tutorials/gr ... tutorials/
Re: Synaser - RS232 ansprechen
Wieso macht das keinen Sinn?theo hat geschrieben:Das hat so keinen Sinn.
Willst du nicht lieber mal mit was einfachem beginnen?
So auf diesem Level: http://www.delphi-treff.de/tutorials/gr ... tutorials/
Sobald ich den Button drücke, wird der Wert an der RS232 Schnittstelle eingelesen.
Alles weitere möchte ich dann programmieren wenn das funktioniert.
Hat keiner eine Idee warum ich diese Fehlermeldungen bekomme?
Danke und Gruß
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Synaser - RS232 ansprechen
Versuche mal das hier:
So wie es aussieht, ist dein String ch leer und mit ch[13]+ ch[10] gibt es dann eine Speicherverletzung.
Mit TStaticText hast du auch etwas komische genommen.
Nimm doch einen ganz normalen String.
Code: Alles auswählen
Caption := ser.RecvTerminated(1000, #13#10);
Mit TStaticText hast du auch etwas komische genommen.
Nimm doch einen ganz normalen String.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 174
- Registriert: Do 3. Mär 2011, 21:34
- OS, Lazarus, FPC: WinXp/7/10 Opensuse13.2/Leap15.3 (L 2.2.0 FPC 3.2.2 )
- CPU-Target: Intel 32/64Bit, ARM9
- Wohnort: Ulm
Re: Synaser - RS232 ansprechen
ich seh grad daß das nicht Text1.Caption := ser.RecvTerminated(1000, ch[13]+ ch[10]);
sondern Text1.Caption := ser.RecvTerminated(1000, chr(13)+ chr(10)); heißen müßte.
Entspricht dann dem := ser.RecvTerminated(1000, #13#10);
Wenn wie hier eine Variable ch als string definiert ist, greift man mit ch[10] auf die zehnte Stelle
vom String ch zu. Wenn der String leer ist gibt's die Stelle aber nicht.
Dem ser.RecvTerminated sollen aber die beiden Steuerzeichen CR und LF übergeben werden.
Wenn das mit einem string gelöst werden soll, müßte man dem string ch vorher die beiden Zeichen zuweisen
ist für mich aber nicht so übersichtlich wie wenn ich das direkt mit #13#10 stehen sehe
NoCee
sondern Text1.Caption := ser.RecvTerminated(1000, chr(13)+ chr(10)); heißen müßte.
Entspricht dann dem := ser.RecvTerminated(1000, #13#10);
Wenn wie hier eine Variable ch als string definiert ist, greift man mit ch[10] auf die zehnte Stelle
vom String ch zu. Wenn der String leer ist gibt's die Stelle aber nicht.
Dem ser.RecvTerminated sollen aber die beiden Steuerzeichen CR und LF übergeben werden.
Wenn das mit einem string gelöst werden soll, müßte man dem string ch vorher die beiden Zeichen zuweisen
Code: Alles auswählen
ch := chr(13)+ chr(10)); // entspricht := #13#10
//dann
Text1.Caption := ser.RecvTerminated(1000, ch);
NoCee
Re: Synaser - RS232 ansprechen
Hi!
Danke für eure Hilfe, es will aber immer noch nicht so wie ich
Bekomme ständig die angefügte Fehlermeldung
Grüßle!!
Danke für eure Hilfe, es will aber immer noch nicht so wie ich

Bekomme ständig die angefügte Fehlermeldung

Grüßle!!
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
ComCtrls, StdCtrls, ExtCtrls, DbCtrls, DBGrids, Synaser, SdfData, BufDataset,
db, sqlite3conn, sqldb, dbf;
type
{ TStartseite1 }
TStartseite1 = class(TForm)
ButtonEinwaage: TButton;
DataSource1: TDataSource;
Dbf1: TDbf;
DBGrid1: TDBGrid;
DBNavigator1: TDBNavigator;
ImageList1: TImageList;
MainMenu1: TMainMenu;
menuHilfeDrucken: TMenuItem;
menuHilfeProtokoll: TMenuItem;
menuHilfeEinwaage: TMenuItem;
menuProtokollAnzeigen: TMenuItem;
menuProtokollDrucken: TMenuItem;
menuWiegenSpeichern: TMenuItem;
menuWiegenNeu: TMenuItem;
menuWiegen: TMenuItem;
menuProtokoll: TMenuItem;
menuHilfe: TMenuItem;
TextAktuellerWert: TStaticText;
StatusBar1: TStatusBar;
TextWertA: TStaticText;
TextWertB: TStaticText;
TextWertC: TStaticText;
private
{ private declarations }
public
{ public declarations }
end;
var
ser: TBlockSerial;
ch: string;
Startseite1: TStartseite1;
implementation
{$R *.lfm}
{ TStartseite1 }
procedure TStartseite1.ButtonEinwaageClick(Sender: TObject); // RS232 Schnittstelle
begin
ch := chr(13)+ chr(10); // entspricht := #13#10
ser:=TBlockSerial.Create;
Sleep(1000); // Wartezeit 1000ms
ser.Connect('COM1');
ser.config(9600, 8, 'N', SB1, False, False); // Port initialisierung
TextAktuellerWert.Caption := ser.RecvTerminated(1000, ch); // Wenn nichts empfangen wurde, blockiert hier das Programm 1000ms!!
ser.free; // Spätestens am Programmende die Schnittstelle wieder freigeben.
end;
end.
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Synaser - RS232 ansprechen
Kann du dein Project mal als Zip-Anhang hochladen ?
Vielleicht sieht man dann mehr.
Vielleicht sieht man dann mehr.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot