Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Daten vom Com4 lesen (https://www.delphipraxis.net/25882-daten-vom-com4-lesen.html)

SirThornberry 14. Jul 2004 11:19


Daten vom Com4 lesen
 
Hallo,

ich benutze die "SynaSer Serial Port Library v.5.0 "-Komponente um daten an COM4 zu schicken und auch zu lesen.
Ich öffne das Port per
Delphi-Quellcode:
  SynaSerCompo.Connect(ACom, 19200,8,'N',1,false,false);
und lese die Daten per
Delphi-Quellcode:
  SynaSerCompo.RecvBufferEx(@LBuffer, 200, ATimeout);
Das Problem ist jetzt dass, das lesen nur fehlerfrei funktioniert wenn ich vorher mit "ZOC" diesen anschluss einmal öffne und schließe. Danach kann ich "ZOC" beenden und mein programm funktioniert ohne fehler bis zum nächsten Rechnerneustart. Führe ich "ZOC" nicht aus bekomme ich falsche Werte beim Lesen von COM4. Das gleiche Problem hatte ich auch schon als ich einen Barcodescanner über COM1 ansprechen wollte. Auch dies hat erst funktioniert nach dem ich das dazugehörige Programm einmal ausgeführt hab.

Muss man den COM-Port erst irgendwie initialisieren damit die Daten im richtigen Format gelesen werden?

Robert Marquardt 14. Jul 2004 11:44

Re: Daten vom Com4 lesen
 
Klingt verdaechtig danach als ob du die Kommunikationsparameter nicht setzt (Bits, Baudrate etc).
Wahrscheinlich wollen die Geraete mit Parametern arbeiten, die nicht Default sind fuer den entsprechenden COM Port.

Udo 14. Jul 2004 12:48

Re: Daten vom Com4 lesen
 
Scheint ja ne ziemlich schrottige Componente zu sein. *hier müsste der Kotz-Smiley rein*
Du könntest vor dem Connect das Port öffnen, die Parameter setzen und wieder schließen:
Delphi-Quellcode:
procedure TMC4000.Open(PortNr: byte);
var
  DCB: TDCB;
  ComName: string;
  ComHandle: THandle;
begin
  ComName := 'COM' + IntToStr(PortNr);
  ComHandle := CreateFile(PChar(ComName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
  if ComHandle <> INVALID_HANDLE_VALUE then
  begin
    GetCommState(ComHandle, DCB);
    // Werte anpassen
    DCB.BaudRate := CBR_19200;
    DCB.Flags := $2005;
    DCB.Parity := NOPARITY;
    DCB.StopBits := 2;
    DCB.ByteSize := 8;
    DCB.XonLim := 50;
    if not SetCommState(ComHandle, DCB) then
      raise ECommError.Create('Could not configure communication device COM'
        + IntToStr(PortNr));
  end
  else
      raise ECommError.Create('Could not open Port COM' + IntToStr(PortNr));
  CloseFile(ComHandle);
end;
Alternative: Selber machen und in einen Thread packen. (ClearCommError, ReadFile)
Wenn Daten da sind nen Event auslösen.


Udo

SirThornberry 14. Jul 2004 15:59

Re: Daten vom Com4 lesen
 
Die Connectmethode macht genau das.
GetCommState liefert auch das gleiche unabhängig davon ob das Terminalprogramm vorher aktiv war oder nicht, also scheint es mit irgendwas anderem zusammen zu hängen

@Robert Marquard: Doch, die Bitrage etc. wird ja der Connectmethode mitgegeben und diese setzt diese auch mit SetCommState.

Nuclear-Ping 14. Jul 2004 19:16

Re: Daten vom Com4 lesen
 
War vor kurzem auch auf der Suche nach einer passenden Komponente, um mit COM-Ports zu kommunizieren. Hatte ein paar probiert gehabt, jedoch bin ich bei "TurboPower Async Professional" (http://sourceforge.net/projects/tpapro/) geblieben.

Also wie schon erwähnt wurde: Falls es irgendwie paradox streikt, probier mal eine andere Komponente, bei mir hats jedenfalls Abhilfe geschafft. ;)

Grüße,
Mario

SirThornberry 15. Jul 2004 12:16

Re: Daten vom Com4 lesen
 
Ich hab den Fehler gefunden.
Nach dem Rechnerneustart (bzw. nach dem das gerät neu erkannt wurde) muss mindestens einmal "SetCommState" mit Stopbits = 0 aufgerufen werden. Danach kann man so oft man will Stopbits = 1 verwenden....


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz