Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi CPort: Comport auslesen DOS-> Delphi (https://www.delphipraxis.net/166924-cport-comport-auslesen-dos-delphi.html)

Freiwilderer 6. Mär 2012 08:35

CPort: Comport auslesen DOS-> Delphi
 
hi,
ich habe ein DOS Programm, dass Daten über den ComPort von einem Windows CE Gerät runter lädt.
Das muss ich jetzt in Delphi umsetzen...
hier mal der Basic Code:
Code:
Close #96
Open "COM2:9600,N,8,1,CS,DS" As #96
ITry = 0
Do While ITry < 10 AND IFound = 0
    ITry = ITry + 1 
    Print #96, Chr$(6) + Chr$(13);
    Call WaitSec(0.5)
    If Not EOF(96) Then
        ATmp = Input$(1,#96)
        If ATmp = Chr$(6) Then IFound = 1
    end if
Loop
Es wird also erst der Comport als #96 geöffnet, anschließend Chr6 und Chr13 geschrieben und dann ausgelesen.
... leider funktioniert das in Delphi nicht.
Delphi-Quellcode:
   try
      iTry := 0;
      bFound := False;
      AComPort:=Concat('COM',Edit1.Text);
      tmpWeightString := '';
      FirstStart:= Now();

      ComPort := TComport.Create(fHandscannerCOM);
      ComPort.Port := AComPort;
      ComPort.BaudRate := br9600;
      ComPort.Parity.Bits := prNone;
      ComPort.DataBits := dbEight;
      ComPort.StopBits := sbOneStopBit;
           ComPort.Open;
      comport.WriteStr(CHR(6)+ CHR(13));
      sleep(500);

      i:=1;
      while (not bFound) and (i< 10) do
      begin
         AStr := '';
         inc(i);
                        ComPort.ReadStr(AStr,1);
         if Astr='' then
            Astr:=IntToStr(i);
         Memo1.Lines.Add(AStr);

         if AStr = CHR(6) then
            bFound := True;  
         sleep(10);
      end;
   finally
      FreeAndNil(ComPort);
   end;
Kann mir jemand da einen Tip geben?
bei einem anderen Gerät (einer Waage) habe ich das auslesen in ähnlicher form bereits hin bekommen ...
Interessant wäre auch, was CS und DS Bedeuten soll.

Über Hilfe würde ich mich sehr freuen.

Mfg

gammatester 6. Mär 2012 09:08

AW: CPort: Comport auslesen DOS-> Delphi
 
Zitat:

Zitat von Freiwilderer (Beitrag 1154702)
Interessant wäre auch, was CS und DS Bedeuten soll.

Erste Vermutung bei seriellen Schnittstellen ist doch CTS und DSR, und tatsächlich ergibt ein paar Sekunden Suche:
Zitat:

Zitat von FreeBASIC-Referenz
CSn Setze die CTS-Dauer (in ms) (n>=0), 0 = abschalten, Standard = 1000
DSn Setze die DSR-Dauer (in ms) (n>=0), 0 = abschalten, Standard = 1000

und auf http://www.elektronik-labor.de/RS232/RS232_3_2.htm
Zitat:

CS,DS,CD: ohne eine Zusatzangabe bewirken diese Parameter,dass die Eingangsleitungen CTS, DSR bzw. DCD nicht beachtet werden. Für jede dieser Eingangsleitungen kann eine Wartezeit n in ms angegeben werden, während der auf ein Signal eintreffen muss.

Beispiel: OPEN "COM1:9600,N,8,1,RS,CS,DS,CD" as #2

Beim Öffnen bleibt RS zurückgesetzt, und keine der Handshake-Eingangsleitungen wird beachtet.

Freiwilderer 6. Mär 2012 09:12

AW: CPort: Comport auslesen DOS-> Delphi
 
Naja, gedacht hatte ich mir das auch schon... Allerdings gibt es bei CPort scheinbar keine Möglichkeit diese Werte zu verändern. Weswegen ich mir über deren Bedeutung nicht sicher bin.

gammatester 6. Mär 2012 09:22

AW: CPort: Comport auslesen DOS-> Delphi
 
Zitat:

Zitat von Freiwilderer (Beitrag 1154706)
Naja, gedacht hatte ich mir das auch schon... Allerdings gibt es bei CPort scheinbar keine Möglichkeit diese Werte zu verändern. Weswegen ich mir über deren Bedeutung nicht sicher bin.

Also zumindest in meiner Uraltversion 2.01 kann man das im Objektinspektor/Flowcontrol sehr schön ein- und ausschalten; und mit der mitgelieferten Form sogar zur Laufzeit via Dialog. Was bei den neuen Schnickschnack-Versionen nicht mehr möglich ist kann ich nicht sagen.

Freiwilderer 6. Mär 2012 09:31

AW: CPort: Comport auslesen DOS-> Delphi
 
Ich glaub auch gar nicht mal unbedingt, dass es daran liegt, sondern vielleicht eher an der Art des auslesens ... Wie gesagt, die Waage, die ich hier stehen hab, kann ich ansprechen. (Auch ohne CS und DS vorher einzustellen.)

Klaus01 6. Mär 2012 09:36

AW: CPort: Comport auslesen DOS-> Delphi
 
CTS, DSR auch, wenn ich mich nicht täusche, unter HardwareHandshake bekannt.
Wenn der das Windows CE Gerät so eingestellt ist, dass HardwareHandshake verlangt wird sollte Dein Programm das auch unterstützen.

Grüße
Klaus

Wal 6. Mär 2012 10:28

AW: CPort: Comport auslesen DOS-> Delphi
 
Versuch mal ein crlf mitzusenden.
Delphi-Quellcode:
ComPort.WriteStr(#6#13#13#10);

Ok, durch das ; wird #13 beim Print-Befehl unterdrückt, crlf wird auch nicht funzen.

Da würde ich es mal so versuchen:

Delphi-Quellcode:
var
  Buffer: PACKED ARRAY[0..1] OF Byte;

  Buffer[0]:= $06;
  Buffer[1]:= $13;
  ComPort.Write(Buffer, SizeOf(Buffer));

Wal 6. Mär 2012 11:19

AW: CPort: Comport auslesen DOS-> Delphi
 
Hab' ich mal schnell zusammen gestellt :

Delphi-Quellcode:
unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, CPort, Vcl.StdCtrls;

type
  TfrmMain = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    ComPort: TComPort;
    procedure ComPortRxChar(Sender: TObject; Count: Integer);
  end;

var
  frmMain: TfrmMain;
  Buffer: PACKED ARRAY[0..1] OF Byte;

implementation

{$R *.dfm}

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ComPort.Close;
  ComPort.Free;
end;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  ComPort := TComPort.Create(Nil);
  ComPort.OnRxChar := ComPortRxChar;
  ComPort.Port := 'COM1';
  ComPort.BaudRate := br9600;
  ComPort.Parity.Bits := prNone;
  ComPort.DataBits := dbEight;
  ComPort.StopBits := sbOneStopBit;
  ComPort.Open;
end;

procedure TfrmMain.Button1Click(Sender: TObject);
begin
  Buffer[0]:= $06;
  Buffer[1]:= $13;
  ComPort.Write(Buffer, SizeOf(Buffer));
end;

procedure TfrmMain.ComPortRxChar(Sender: TObject; Count: Integer);
var
  A: String;
begin
  ComPort.ReadStr(A, Count);
  memo1.Text := memo1.Text + 'Daten: ' + A + #13#10;
end;

end.

Freiwilderer 6. Mär 2012 12:36

AW: CPort: Comport auslesen DOS-> Delphi
 
hi,
danke für die Ausführliche Antwort.

Also die Verbindung zu Windows CE und dem darauf laufenden Programm scheint zu funktionieren. Das Gerät zeigt jetzt nämlich immerhin an, dass es Daten sendet.
(Mit dem Buffer gings nicht. Mit WriteStr(CHR(6),CHR(13)) aber.)

Leider geht er nie in den ComPortRxChar Abschnitt rein.

Wal 6. Mär 2012 14:53

AW: CPort: Comport auslesen DOS-> Delphi
 
Zitat:

Zitat von Freiwilderer (Beitrag 1154763)
hi,
danke für die Ausführliche Antwort.

Also die Verbindung zu Windows CE und dem darauf laufenden Programm scheint zu funktionieren. Das Gerät zeigt jetzt nämlich immerhin an, dass es Daten sendet.
(Mit dem Buffer gings nicht. Mit WriteStr(CHR(6),CHR(13)) aber.)

Leider geht er nie in den ComPortRxChar Abschnitt rein.

Glaube ich nicht, das dein Gerät Daten sendet. Die Procedure wird angesprungen, sobald Daten empfangen werden, auch wenn's Schrott ist z.B. bei falscher Baudrate.

Ich denke, das dein Gerät anzeigt, das es Daten empfängt es sendet nur nichts zurück, da die Anfrage falsch sein wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:41 Uhr.
Seite 1 von 2  1 2      

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