Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Laserer
Beiträge: 12
Registriert: Mo 21. Jul 2008, 18:57

Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Beitrag von Laserer »

Da ich die Signale eines Gerätes mit RS232 Schnittstelle auslesen möchte, hab ich mich schonmal über Kommunikation mit einer seriellen Schnittstelle unter Free Pascal schlau gemacht und bin schließlich dank dieses Artikels im Free Pascal Wiki (http://wiki.freepascal.org/Hardware_Acc ... munication) auf Synaser gestoßen.

Das Problem ist nur folgendes: Das im Wiki beschriebene Code-Beispiel funktioniert nur einmal pro Session, sprich wenn ich Linux gestartet habe, funktioniert das Programm. Sobald ich es im Terminal mit STRG-C unterbreche und nochmal starte, bekomme ich nur eine endlos lange Schlange an

Code: Alles auswählen

00 00 00 00 00


Ich bekomme erst wieder eine brauchbare Ausgabe, wenn ich Linux neustarte. Dann funktioniert es wieder, allerdings eben nur einmal, dann fängt der ganze Spaß wieder von vorne an. Ich hab nun ein wenig Code hinzugefügt, um etwaige Fehlermeldungen zu erhalten:

Code: Alles auswählen

program serialtest;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,SysUtils,Synaser
  { you can add units after this };
 
var
  ser: TBlockSerial;
begin
  ser:=TBlockSerial.Create;
  sleep(1000);
  try
    ser.Connect('/dev/ttyUSB0');
    Sleep(1000);
    ser.config(1200, 7, 'N', SB1, False, False);
    Sleep(1000);
    Write('Device: ' + ser.Device + '   Status: ' + ser.LastErrorDesc +' '+
    Inttostr(ser.LastError));
    Sleep(5000);
    while True do
          Write(IntToHex(ser.RecvByte(10000), 2), ' ');
  finally
    ser.free;
  end;
 
end.


Im Falle der Fehlfunktion gibt mir die Console dabei folgendes aus:

Code: Alles auswählen

Device: /dev/ttyUSB0   Status: Bad file number 9


Für alle, die sich jetzt gerade fragen, weshalb da /dev/ttyUSB0 steht: Da mein Laptop leider keine serielle Schnittstelle hat, muss ich einen USB zu seriell Adapter von Digitus (die USB 1.1 Variante) verwenden. Als Linux ist bei mir Ubuntu 8.04.1 im Einsatz.

Apropos: GTKTerm hat keine Probleme mit der Schnittstelle. GTKTerm kann ich pro Session endlos oft aufrufen, es liest mir immer korrekt die serielle Schnittstelle aus.

Ich hoffe, ihr könnt mir helfen!

mfg

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

Re: Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Beitrag von theo »

Ich hab zwar keine Ahnung von Synaser, aber ich tippe mal drauf, dass das Beispiel nicht gut ist.
Du verlässt dich da auf das "abwürgen" der Anwendung ("while true...").
Dabei wird "finally" wahrsch. nicht mehr abgearbeitet. D.h. Destroy und damit CloseSocket wird nicht aufgerufen.
Deshalb wird wahrsch. die Ressource nicht wieder frei.
Das ist nur meine Vermutung.....

Laserer
Beiträge: 12
Registriert: Mo 21. Jul 2008, 18:57

Re: Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Beitrag von Laserer »

Vielen vielen Dank Theo! Mit folgendem Code kann ich die Anwendung nun mehrmals ohne Probleme ausführen:

Code: Alles auswählen

program serialtest;
 
{$mode objfpc}{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes,SysUtils,Synaser
  { you can add units after this };
 
var
  ser: TBlockSerial;
begin
  ser:=TBlockSerial.Create;
  sleep(1000);
  try
    ser.Connect('/dev/ttyUSB0');
    Sleep(1000);
    ser.config(1200, 7, 'N', SB1, False, False);
    Sleep(1000);
    Write('Device: ' + ser.Device + '   Status: ' + ser.LastErrorDesc +' '+
    Inttostr(ser.LastError));
    Sleep(5000);
    //while True do
    Write(IntToHex(ser.RecvByte(10000), 2), ' ');
  finally
    ser.free;
    Write('Programm beendet');
  end;
 
end.


hab einfach die while schleife auskommentiert. Natürlich erhalte ich nun immer nur einen Byte und muss das Programm dann nochmal von vorne ausführen, aber durch das Abbrechen im Terminal wurde offensichtlich nie ser.free aufgerufen (was irgendwie logisch ist, weil er nie aus der Schleife rauskommt, nachher ist man immer schlauer :mrgreen: ). Das heißt jetzt allerdings, dass ich mir irgendeine Abbruchbedingung überlegen werden muss, damit ich zwar weiterhin dauernd auslesen kann, aber es im Falle eines Abbruchs nicht wieder zu diesem lästigen Fehler kommt.

mfg

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

Re: Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Beitrag von theo »

Gut. Wenn du eine schlaue Lösung hast, kannst du vllt. den Wiki Artikel updaten, damit andere nicht in die selbe Falle tappen.

Laserer
Beiträge: 12
Registriert: Mo 21. Jul 2008, 18:57

Re: Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Beitrag von Laserer »

Werde ich gerne machen! Ich arbeite derzeit gerade daran, dass man das Programm einfach mit Q (oder irgendeiner anderen Taste) im laufenden Betrieb beenden kann (also nicht die Holzhammer-Methode der Console mit STRG-C) und bei Eingabe des "Beenden" - Buchstabens automatisch ser.free aufgerufen wird.

Laserer
Beiträge: 12
Registriert: Mo 21. Jul 2008, 18:57

Re: Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Beitrag von Laserer »

Okay, in diesem Zusammenhang hab ich gleich noch eine frage: Wie kann ich so eine Endlosschleife in einem durchlaufen lassen, und zusätzlich im Hintergrund überwachen, ob inzwischen eine Taste gedrückt wurde? Sowohl Read als auch Readkey unterbrechen die Anwendung bis zum Drücken einer Taste.

Wahrscheinlich ist das so trivial, dass die frage blöd klingt, aber irgendwie finde ich da keinen ansatz.

mfg


Laserer
Beiträge: 12
Registriert: Mo 21. Jul 2008, 18:57

Re: Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Beitrag von Laserer »

Okay, gerade so einen wichtigen Befehl wie keypressed findet man in den meisten Pascal-Tutorials nicht, und ich als Pascal Anfänger bin bis jetzt auch offensichtlich unbegabt, die richtigen Stichwörter zu googlen.

Vielen Dank jedenfalls. Das Beispielskript funktioniert jetzt jedenfalls einwandfrei und ich werde im Laufe der Woche noch im Wiki das angegebene Code-Beispiel so ergänzen, damit das keinem mehr passiert. Nur beim ersten Mal war ich trotzdem etwas geschockt, da es sehr lange gedauert hat, bis dass das Programm nach Drücken der Taste auch wirklich aus der Schleife rausgekommen ist (so ca. 5 sekunden).

Vielen Dank jedenfalls für deine Hilfe!

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

Re: Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Beitrag von theo »

Laserer hat geschrieben:. Nur beim ersten Mal war ich trotzdem etwas geschockt, da es sehr lange gedauert hat, bis dass das Programm nach Drücken der Taste auch wirklich aus der Schleife rausgekommen ist (so ca. 5 sekunden).


Du hast ja auch in RecvByte ein Timeout von 10000ms, damit wird natürlich wenn nix kommt während max. 10sek. blockiert, bis es auf keypressed reagieren kann.

Laserer
Beiträge: 12
Registriert: Mo 21. Jul 2008, 18:57

Re: Problem mit Synaser unter Linux (Ubuntu 8.04.1)

Beitrag von Laserer »

Stimmt, danke, da hat sich wohl eine null zuviel in den Code verirrt!

Hab jetzt jedenfalls den Artikel aus dem Freepascal - Wiki upgedatet. Bitte sagen oder am besten gleich selber ausbessern, sollten euch gravierende Fehler auffallen. Verzeiht mir mein Englisch, es ist schon länger her, dass ich was bezüglich Informatik auf Englisch geschrieben hab :mrgreen:

mfg

Antworten