[gelöst] Synaser - RS232 ansprechen

Für Fragen von Einsteigern und Programmieranfängern...
l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

[gelöst] Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

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.
Zuletzt geändert von l0lhaxx am Di 23. Feb 2016, 14:03, insgesamt 1-mal geändert.

NoCee
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

Beitrag von NoCee »

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

Mathias
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

Beitrag von Mathias »

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.

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

Mathias
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

Beitrag von Mathias »

ser.free;// Spätestens am Programmende die Schnittstelle wieder freigeben.
Sonst bleibt die bis zum Restart vom OS belegt.
Bei mir reicht es ein fremdes Terminal-Programm aufzurufen und anschliessend zu beenden.
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

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

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.

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.
 
 
 

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Synaser - RS232 ansprechen

Beitrag von theo »

Warum hast du Startseite1 in Text1 umbenannt?

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

theo hat geschrieben:Warum hast du Startseite1 in Text1 umbenannt?
Gute Frage. War eher unbeabsichtigt. Aber auch wenn ich die Zeile lösche bekomme ich die Fehlermeldung.
Lösungsvorschlag?

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Synaser - RS232 ansprechen

Beitrag von theo »

Wieso löschen? Mach es einfach so wie es war:

Code: Alles auswählen

 
var
 Startseite1: TStartseite1;

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

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. :evil:
Dateianhänge
Als .EXE ausgeführt
Als .EXE ausgeführt
Unbenannt1.PNG (12.11 KiB) 3186 mal betrachtet
In Lazarus ausgeführt
In Lazarus ausgeführt
Unbenannt.PNG (12.11 KiB) 3186 mal betrachtet

Benutzeravatar
theo
Beiträge: 10872
Registriert: Mo 11. Sep 2006, 19:01

Re: Synaser - RS232 ansprechen

Beitrag von theo »

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/

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

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/
Wieso macht das keinen Sinn?
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ß

Mathias
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

Beitrag von Mathias »

Versuche mal das hier:

Code: Alles auswählen

Caption := ser.RecvTerminated(1000, #13#10);     
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.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

NoCee
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

Beitrag von NoCee »

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

Code: Alles auswählen

ch := chr(13)+ chr(10)); // entspricht :=  #13#10
//dann
Text1.Caption := ser.RecvTerminated(1000, ch);
ist für mich aber nicht so übersichtlich wie wenn ich das direkt mit #13#10 stehen sehe

NoCee

l0lhaxx
Beiträge: 89
Registriert: Di 8. Dez 2015, 09:20

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Hi!
Danke für eure Hilfe, es will aber immer noch nicht so wie ich :(
Bekomme ständig die angefügte Fehlermeldung :oops:

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.
 
 
Dateianhänge
Fehlermeldung
Fehlermeldung

Mathias
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

Beitrag von Mathias »

Kann du dein Project mal als Zip-Anhang hochladen ?
Vielleicht sieht man dann mehr.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten