[gelöst] Synaser - RS232 ansprechen

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

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Also das senden von Daten funktioniert. Super!

Allerdings möchte ich jetzt der Waage bei "Button Click" den Befehl "D08" schicken. Die Waage wartet dann bis der Wägewert einen sicheren Zustand angenommen hat und sendet erst dann den Wert. Das kann aber bis zu 10sek dauern (Also keine Autoprint-Funktion mehr, die Waage sendet den Wert nur einmal!).

Hab das mal mit der Funktion "WaitingData" funktioniert. Funktioniert aber nicht :(
Also bekomme ich das ganze nur mit diesem "MSEgui" hin? Ich kenne mich damit leider überhaupt nicht aus.....
Mir fehlt eben diese OnResponse Eventproperty.

Code: Alles auswählen

 
procedure TForm1.btnEwAClick(Sender: TObject);
var
 ch: string;
begin
 
 Counter1:= 100;
 
 //Delimiter initialisierung
 ch := chr(13);
 //Ausgabe des Werts wenn Wägewert stabil
 ser.sendstring('D08'+ch);
 Timer1.Enabled:=True;
 
 
  end;
 
 
 
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 //Eine ganze Zahl abwärts zählen
 dec (Counter1);
 LabelIstwertA.Text:= ser.RecvPacket(100);
 
 
 if ser.WaitingData=13 then
 begin
  Timer1.Enabled:=False;
 end;
 
 If Counter1=0 Then
 begin
  Timer1.Enabled:=False;
 end;
 
end; 
 

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Synaser - RS232 ansprechen

Beitrag von mse »

l0lhaxx hat geschrieben: Hab das mal mit der Funktion "WaitingData" funktioniert. Funktioniert aber nicht :(
Also bekomme ich das ganze nur mit diesem "MSEgui"
hin? Ich kenne mich damit leider überhaupt nicht aus.....
Natürlich geht es auch ohne MSEgui.
Mir fehlt eben diese OnResponse Eventproperty.
Da musst du etwas entsprechendes nachbauen. Entweder in einem separaten Thread (nicht ganz trivial) oder in deinem Timer event entweder mit RecvTerminated() (empfohlen) oder RecvPacket(). Bei letzterem muss EOR selber gesucht werden.

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 »

wenn du ...:= ser.RecvPacket(xx).. aufrufst wird der Puffer ausgelesen und ist dann natürlich leer.
Wenn du danach auf die WaitingData auf 13 abfrägst, wird das natürlich nie erreicht weil der Puffer ja
vorher geleert wird.
Da mußt du erst abfagen ob was da ist und dann auslesen.
Wenn nichts da ist, auch nichts auslesen.
Schau dir mal das Zippfile von Mathias an. Da ist das so gemacht.
Allerdings liest er ein bischen komplizierter aus. Und zwar stückenweise und setzt das dann zusammen.
Wenn man nicht weis, was genau empfangen wird, muß man das in der Art machen.
Wenn du z.B. nicht weißt, ob die Länge (mit CR) 13 ist oder die Waage ein LF mit sendet.
Dann wären es ja 14.

Außerdem solltest du nicht auf genau 13 abfragen. Wenn da z.B. 2 Telegramme empfangen wurden
oder was bei RS232 schon mal vorkommt, Datenmüll der dann im Puffer kürzer oder länger als Datensatz
auftaucht, haut das nie hin auch wenn dann schon 100 gute Werte da sind.
Also die Abfrage auf =>13 (also gleich 13 oder größer) wäre da sinnvoller.

NoCee

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Synaser - RS232 ansprechen

Beitrag von mse »

NoCee hat geschrieben: Außerdem solltest du nicht auf genau 13 abfragen.
Natürlich nicht. Man liest mit RecvTerminated() alles bis zu EOR, wertet die erhalteten Daten aus und verwirft ungültige Telegramme. Der Timeout ist dabei relativ klein, damit die GUI nicht einfriert. Etwa:

Code: Alles auswählen

 
const
 eor = #13;   //oder #13#10
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
 str1: string
begin
 while true do begin
  str1:= ser.RecvTerminated(10,eor);
  if ser.LastError = 0 then begin //OK
   //hier antwort in str1 auswerten
  end
  else begin
   break;         //timeout oder fehler
  end;
 end;
end;
 
Ungeprüft!

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

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

hat funktioniert. Hab es jetzt so gemacht, funktioniert prima!

Code: Alles auswählen

 
procedure TForm1.Timer1Timer(Sender: TObject);
var
 Wert1: string;
const
 eor = #13;
begin
 
 
 if ser.WaitingData>=13 then
 begin
 Wert1:= ser.RecvTerminated(100, eor);
 
 Delete(Wert1, Length(Wert1), 4); //Funktioniert nicht...
 LabelIstwertA.Text:= Wert1;
 
 Timer1.Enabled:=False;
 end
 else begin
  dec (Counter1);
 end;
 
 If Counter1=0 Then begin
  Timer1.Enabled:=False;
 
 end;
end; 
 
Ich möchte die letzten vier stellen noch abschneiden. Hab es jetzt wie im Quelltext zusehen versucht, klappt aber nicht... Was mache ich da noch falsch?


15,451<5>g --> 15,451

Danke mal wieder!

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Synaser - RS232 ansprechen

Beitrag von baumina »

Entweder

Code: Alles auswählen

delete(w, length(w)-3, 4);

oder

Code: Alles auswählen

w := copy(w, 1, length(w)-4);
oder

Code: Alles auswählen

w := LeftStr(w, length(w)-4);
.

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

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Funktioniert das auch mit Leerzeichen vor der Zahl entfernen?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Synaser - RS232 ansprechen

Beitrag von mse »

l0lhaxx hat geschrieben:hat funktioniert. Hab es jetzt so gemacht, funktioniert prima!
Aber vermutlich nicht immer. ;-)
Software zur Auswertung von RS-232 Daten muss absolut robust sein, man muss mit allem Möglichen rechnen. Bitte schau dir nochmal mein Beispiel an.
etwa:

Code: Alles auswählen

 
...
  if ser.LastError = 0 then begin //OK
   //hier antwort in str1 auswerten
   if (length(str1) = 13) then begin
    //weitere auswertung
    if <allesok> then begin
     timer1.enabled:= false;
    end;
   end;
  end
 
Den timeout bei misslungener Kommunikation würde ich mittels Zeitstempel lösen.
Ich möchte die letzten vier stellen noch abschneiden. Hab es jetzt wie im Quelltext zusehen versucht, klappt aber nicht... Was mache ich da noch falsch?
delete() ist hier dokumentiert:
http://www.freepascal.org/docs-html/cur ... elete.html
Die letzten Stellen abschneiden kann man auch mit

Code: Alles auswählen

 
setlength(str1,length(str1)-4);
 

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Synaser - RS232 ansprechen

Beitrag von baumina »

Zum Leerzeichen entfernen bietet sich trim() an.
.

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

Re: Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

mse hat geschrieben: Aber vermutlich nicht immer. ;-)
Software zur Auswertung von RS-232 Daten muss absolut robust sein, man muss mit allem Möglichen rechnen
Danke für den Tipp. Werde mir das ganze nochmal ausführlich anschauen.

Vielen Dank auch nochmal an alle die hier etwas beigetragen haben!

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

Re: [gelöst] Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Hallo,
ich muss das Thema leider wiederbeleben. Hab die Software jetzt auf einen PC mit Windows XP aufgespielt. Die Software funktioniert, allerdings die Datenübertragung mit der RS232 nicht.... Wieso das? Hab die Schnittstelle mit Hyperterminal mal getestet....an der liegt es nicht. Also am Programm? Jemand eine Idee?

Danke!

Mathias
Beiträge: 6918
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: [gelöst] Synaser - RS232 ansprechen

Beitrag von Mathias »

Die Software funktioniert, allerdings die Datenübertragung mit der RS232 nicht....
Was geht nicht ?
Geht gar nichts, oder kommen fehlerhafte Daten an ?
Was hattest du für ein Betriebssystem, bevor du es auf WinXP laufen lassen hast ?
Evt. Com-Nr anders.
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: [gelöst] Synaser - RS232 ansprechen

Beitrag von l0lhaxx »

Es kommen gar keine Daten mehr an der Waage an...
Auf Windows 7 Service Pack 1 hat es geklappt.

Nun versuche ich es mit dem gleichen Softwarestand auf einem Laptop mit Windows XP Service Pack 3.
Hab die Schnittstelle mit Hyperterminal überprüft. Hat Funktioniert allerdings heißt der COM am Laptop COM3, dies wurde aber in der Software bereits abgeändert (Funktioniert dann immer noch nicht...).

Die Treiber sind aber auf dem neusten Stand.
Muss man bei Windows XP die Schnittstelle anders ansprechen?

Danke vorab

EDIT: Mit Hyperterminal empfange ich Daten von der Waage.
Auch nachdem die Software geöffnet ist und eigentlich die Schnittstelle "reservieren" müsste, funktioniert der Verbindungsaufbau mit Hyperterminal....

EDIT2: Ich empfange Daten mit der Software sobald ich manuell mit der Waage sende. Es funktioniert also ausschließlich das senden mit....

Code: Alles auswählen

 
    ch := chr(13);
    ser.sendstring('D08'+ch);
 
nicht....

Antworten