Einzelnen Beitrag anzeigen

Real-TTX

Registriert seit: 7. Mai 2008
Ort: Stuttgart / Wertheim
136 Beiträge
 
Delphi 2007 Enterprise
 
#1

COM (RS232 Schnittstelle) Lesen - Alternative?

  Alt 7. Mai 2008, 17:54
Hallo Gemeinde

Ich erweitere schon seit längerem mein Wissen mit dieser Seite. Nun ist es soweit, ich habe selbst eine kleine Frage

Ich baue eine Verbindung zu einem Messschieber über die RS232 Schnittstelle auf. Der Messschieber hat eine Taste "DATA". Mit dieser Taste werden 12 "Char"s an den Computer gesendet. Nun habe ich 2 Probleme. Ich nutze im moment eine OpenSource Package dass ich über SourceForge gefunden habe (Name: Async Pro). Ich würde lieber die Delphi eigenen Möglichkeiten dazu nutzen(THandle).

Ich bekomme es jedoch damit nicht hin Habe mir schon ein paar Bsp. Angeschaut. Doch - Kein Ergebnis Ich hoffe jemand kann mir da helfen..

Ein weiteres Problem ist, dass ich die Daten nicht auf einmal bekomme. Sondern die Komponente AsyncPro hat eine Procedure (OnTrigger..). Die wird 2mal ausgeführt. Beim ersten mal werden 8 Chars gesendet. Direkt darauf noch einmal die restlichen 4.

Nun habe ich das mit einer Not-Lösung hinbekommen. Dennoch erfüllt es nicht seinen Zweck....

Hier mein jetziger Code (Bsp - Zusammengefasst) :

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OoMisc, AdPort;

type
  TForm1 = class(TForm)
    ComPort: TApdComPort;
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure ComPortTriggerAvail(CP: TObject; Count: Word);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  i : integer;
  loop: boolean;
  Result : String;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
ComPort.Open := True;
i := 1;
end;

procedure TForm1.ComPortTriggerAvail(CP: TObject; Count: Word);
var
  I : Word;
  C : Char;
  S : String;
begin
  S := '';
  for I := 1 to Count do begin
    C := ComPort.GetChar;
    case C of
      #0..#31 : {Don't display} ;
      else S := S + C;
    end;
  end;
  //Memo1.Lines.Add(IntToStr(length(S)));
   if (length(S) = 8) then
   begin
    Result := S;
   end;
   if (length(S) = 4) then
   begin
    Result := Result + S;
    Memo1.Lines.Add(Result);
   end;

end;
Gruß, Real-TTX
  Mit Zitat antworten Zitat