AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ESC Sequence über COM Port

Ein Thema von Computerbabalulu · begonnen am 11. Nov 2009 · letzter Beitrag vom 11. Nov 2009
Antwort Antwort
Benutzerbild von Computerbabalulu
Computerbabalulu

Registriert seit: 26. Sep 2003
233 Beiträge
 
#1

ESC Sequence über COM Port

  Alt 11. Nov 2009, 19:44
Hallo ihr lieben.

Es gibt ein Problem bei dem ich grade nicht weiter komme.

Ich muss aus meiner Anwenung heraus (Delphi 2007), über den COM Port
einen Barcode Scanner umprogrammieren von EAN auf Codabar.

Bezüglich der Scannerprogrammierung habe ich sogar die Beschreibung,
welche Befehle an den Scanner gesendet werden müssen (komplette Beschreibung im Anhang):

Zitat:
HOST MODE PROGRAMMING – SW VER. 2.60
An alternative method of programming the DS2100 is by sending command strings over one of the serial
interfaces.
These strings take the form of ESCAPE sequences and are transmitted from the host system to the DS2100
on either the auxiliary RS232 or main serial interface. This is called Host Mode programming.
If Host Mode programming is performed over the RS485 polled main interface, MUX32 Protocol must be used.
Once the programming session has started on one of the interfaces, the other is disabled until programming is
over.

PROGRAMMING COMMANDS
DESCRIPTION HOST COMMAND DS2100 REPLY MESSAGE
ENTER HOST MODE ESC [ C ESC H CR LF
After entering this command, the DS2100 responds with the reply message and then waits for one of the following commands.
ENTER PROGRAMMING MODE ESC [ B ESC P CR LF ….... ESC K CR LF
After entering this command, the DS2100 responds with the first reply message and then waits for one or more escape sequences
as shown in par. “Programming strings”.
The last escape sequence defines whether the configuration will be saved in RAM or EEPROM: ESC I A space or any other
character (see par. “Save and Restore Commands” on p. 13).
If the programming is correct, the DS2100 updates the configuration and confirms with the second reply message.
If programming contents are wrong (i.e. a typing error in the file) or due to a transmission error, DS2100 replies with an error
message and programming data will not be updated in this case.
STATUS MESSAGE REQUEST ESC [ D ESC L CR LF ….... CR LF
DS2100 interprets this command as a programming data request and responds with the reply message followed by the list of data
configuration values in the same format as they are entered in programming mode. A CR LF is added at the end of the list.
RETURN PROGRAM NAME ESC [ E Information regarding the scanner’s configuration
Information about the scanner’s hardware and software configuration will be returned over the selected serial interface.
STORE VERIFIER CODE ESC [ H ESC V CR LF
After reading the desired verifier code, this command stores that code in the EEPROM memory of the scanner.
EXIT HOST MODE ESC [ A ESC X CR LF
This message must always be transmitted to end the programming session. On exit from Host Mode, DS2100 is initialized with the
new programming already saved in RAM and/or EEPROM.
NOTE
A status request is advised to verify the accuracy of the programmed data before terminating
the connection with the host.

Nur stehe ich hier grade etwas auf dem Schlauch. Ich hab keine Idee wie ich das im Programm umsetzen könnte.
Als Componenten für die kommunikation hätte ich Async Professional installiert.

Hat von euch jemand vielleicht soetwas schon einmal gemacht und kann mich wieder auf den Weg bringen


Gruß Baba
Frank

Geändert von Computerbabalulu (29. Dez 2011 um 02:34 Uhr)
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#2

Re: ESC Sequence über COM Port

  Alt 11. Nov 2009, 23:30
Zitat von Computerbabalulu:
Hallo ihr lieben.

Es gibt ein Problem bei dem ich grade nicht weiter komme. :gruebel:

Ich muss aus meiner Anwenung heraus (Delphi 2007), über den COM Port
einen Barcode Scanner umprogrammieren von EAN auf Codabar.

Bezüglich der Scannerprogrammierung habe ich sogar die Beschreibung,
welche Befehle an den Scanner gesendet werden müssen (komplette Beschreibung im Anhang):
....
Nur stehe ich hier grade etwas auf dem Schlauch. Ich hab keine Idee wie ich das im Programm umsetzen könnte.
Als Componenten für die kommunikation hätte ich Async Professional installiert.

Hat von euch jemand vielleicht soetwas schon einmal gemacht und kann mich wieder auf den Weg bringen :wall:


Gruß Baba
Hallo,

ich kann dir hier nur beschreiben, wie ich bei ähnlichen Projekten verfahre, vielleicht kannst du für dich was draus entnehmen. Eine solche Kommunikation ist nicht ganz trivial, aber in manchen Punkten kann man den nötigen Umfang einschränken.

1. Die Kommunikation verläuft immer nach dem Schema Befehl senden - Warten auf Antwort - Antwort analysieren. Die COM-Port-Komponente muss also nach aussen nur eine einzige Arbeitsfunktion zur Verfügung stellen, die heisst bei mir RequestAnswer, exakt müsste sie heissen SendCommandAndGetAnswer. Natürlich kommt noch eine Menge Verwaltungsarbeit dazu zum Initialisieren, Fehlerbehandlung usw.

2. Die Komponente TStation ist das Modell der angesprochenen Messstationen. Hier ist definiert, wie die Station auf Befehle reagiert (Statusänderungen) und welche Antworten sie zurücksendet - sozusagen der semantische Teil des Pflichtenhefts. Hier werden insbesondere die empfangenen Antworten logisch ausgewertet und der Zustand der Sation entsprechend geändert (bei Fehler z.B. auf "Offline").

3. Die Komponente IPRecord definiert die einzelnen Messages, der syntaktische Teil des Pflichtenhefts. Die Funktion BuildStatusRequest z.B. liefert den String zurück, der an eine Station zu senden ist, um den Status zu prüfen. Ebenso werden die Antworten dekodiert, d.h. alle Befehlsdefinitionen und alle Formatierungen von Zahlen usw. sind hier definiert. Muss man nicht so machen, ich habe das aber der Übersichtlichkeit in eine eigene Unit ausgelagert.

4. Die Komponente Transaction stellt die übergelagerten Abläufe auf Benutzereingaben usw. zur Verfügung. Die TransAction ist zunächst abstrakt formuliert, davon wird jede konkrete Transaction abgeleitet. Die Transaction GetStatus besteht bloss aus den Schritten Befehl senden und Antwort empfangen, das Starten einer Messung mit Anlegen von Dateien hat natürlich mehr Schritte.

5. Die Komponente TConnection stellt die eigentliche Verbindung zur Verfügung, diese kann COM oder Sockets oder USB sein und mit oder ohne Threads. Unbedingt notwendig sind Threads nicht, die Software kann in der Zeit, in der sie Befehl und Antwort abwickelt, sowieso nichts sinnvolles tun, auch die meisten Usereingaben sind nicht zulässig. Fertige Komponenten für COM verwende ich übrigens nicht.

Für einen Befehl an die Station ist also eine neue Transaction abzuleiten und in IPRecord sind die Strings dafür zu definieren. Drückt z.B. der User bei einer "Offline"-Station auf "Connect", erzeugt die Station eine Transaction "StatusRequest" und startet sie. Läuft die Transaction ohne Fehler durch, ändert sich der Stationsstatus auf "Online" und weitere Statusdaten werden angezeigt.

Ein paar Schnipsel:
Delphi-Quellcode:
type

  TBPMTransAction = class (TObject)
      TAStation : TBPMStation;
      TAConnection : TBPMConnection;
      TAString : ShortString;
      TADecodedAnswer : TBPLMessage;
      TASuccess : boolean;
      TAFinished : boolean;
      TAWaiting : boolean;
      TAStepNo : integer;
      TAErrorRepeat : integer;
      TASuccessRepeat : integer;
      constructor Create (OStation : TBPMStation);
      destructor Destroy; override;
      procedure Cancel (errortxt : ShortString);
      procedure NoSuchStep;
      procedure StepDone;
        { a step may start a long operation or do it directly.
          the message WM_TACONTINUE loops to DoNextStep
          the message WM_TAFINISHED loops back to the station loop }

      procedure Step1; virtual;
      procedure Step2; virtual;
      procedure Step3; virtual;
      procedure Step4; virtual;
      procedure Step5; virtual;
      procedure Step6; virtual;
      procedure Step7; virtual;
      procedure Step8; virtual;
      procedure DoNextStep;
      procedure Start;
      procedure AllDone;
      end;

  TBPMTransAction_GetStatus = class (TBPMTransAction)
      constructor Create (OStation : TBPMStation);
      procedure Step1; override; { send status request }
      procedure Step2; override; { receive status }
      end;

{**************}

  { GetStatus }

constructor TBPMTransAction_GetStatus.Create (OStation : TBPMStation);
begin
inherited Create (OStation);
TAErrorRepeat := 2;
TASuccessRepeat := 1;
end;

  { send StatusRequest }
procedure TBPMTransAction_GetStatus.Step1;
begin
BPLSndRcvRecord.Build_StatusRequest (TAStation.NodeNo);
TAString := BPLSndRcvRecord.GetRequestMessage;
TAConnection.PutSendString (TAString);
TASuccess := TAConnection.RequestAnswer; { lengthy task }
if TASuccess then StepDone else
  begin
  TAStation.Process_StatusNoAnswer;
  AllDone;
  end;
end;

  { send StatusRequest }
procedure TBPMTransAction_GetStatus.Step2;
begin
TAConnection.GetReceivedString (TAString);
BPLSndRcvRecord.PutAnswerMessage (TAString);
TASuccess := BPLSndRcvRecord.VerifyAnswerType;
if TASuccess then TASuccess := BPLSndRcvRecord.DecodeAnswer;
if TASuccess then TADecodedAnswer := BPLSndRcvRecord.GetDecodedMessage;
if TASuccess then
  TASuccess := TAStation.Process_StatusAnswer;
AllDone;
end;
Natürlich kann man alles ganz anders einteilen und überhaupt alles anders machen, dazu bekommst du sicher noch jede Menge Meinungen. Ist aber mal eine mögliches Gerüst.

Gruss Reinhard

PS du kannst sicher manches einfacher rein linear abarbeiten - die obige Software soll bis zu 64 Messstationen verwalten und jederzeit Eingriffe zulassen, aber notfalls auch wochenlang allein im Hintergrund arbeiten, das ist bei dir ja nicht nötig.
  Mit Zitat antworten Zitat
Benutzerbild von Computerbabalulu
Computerbabalulu

Registriert seit: 26. Sep 2003
233 Beiträge
 
#3

Re: ESC Sequence über COM Port

  Alt 11. Nov 2009, 23:44
Hallo Reinhard,

danke für den Denkanstoß

Habe bereits selbst eine passende Lösung gefunden,
war wohl noch nicht ganz wach

Aber dein Beispiel Code geht schon in die richtung wie ich es umsetzen werde

Ich werde es mit den Async Pro Komponenten machen und
einfach mit ..

Delphi-Quellcode:
 ApdComPort1.PutString()
 if ApdComPort1.WaitForString()then xxx
.. die entsprechende Konfigurationshäppchen senden..


Herzlichen Dank für deine Hilfe!!

Gruß Frank
Frank
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz