Avatar billede geek Nybegynder
26. marts 2002 - 19:14 Der er 8 kommentarer og
1 løsning

Læsning af com-port

Jeg har fået fat i en fjernbetjening til min computer (RealMagic - Sigma design)
Men da jeg har en extern dvd har jeg ikke nogen jeg kan bruge fjernbetjeningen til.
Derfor vil jeg så programmere et eller andet som kan styres via fjernbetjeningen...
Men for at kunne det har jeg brug for at vide hvad der bliver sendt til com porten når man trykker på en bestemt knap.

Nogen der har en stump kode, eller et plugin som kan læse hvad der bliver sendt til com-porten ??

Geek
Avatar billede hlj Nybegynder
26. marts 2002 - 19:20 #1
Du kan jo starte med at prøve Hyperterminal i Windows
Avatar billede geek Nybegynder
26. marts 2002 - 19:43 #2
Øhhh.. Hyperterminal ???
Avatar billede doc404 Novice
26. marts 2002 - 19:56 #3
start,programs,accessories,communication....
Avatar billede geek Nybegynder
26. marts 2002 - 21:30 #4
Øøøh kan jeg ikke lige finde ud af at bruge !!
men den hjælper mig jo heller ikke specielt, da jeg har brug for at vide hvad der bliver sent og hvornår, altså i delphi...
Avatar billede doc404 Novice
26. marts 2002 - 21:52 #5
Dette her er flået ud af et større program - men kig på det....

unit CommDrv;

interface
uses
  Windows,SysUtils;
const
  COMERRWRITE = 1;
  COMERRREAD  = 2;
  COMERROPEN  = 3;
  COMERRECHO  = 4;

type
  EComError = class(Exception);

  EComDrv = class(TObject)
    private
      PortName  : string;
      MyDCB    : DCB;
      Hnd      : THandle;
      ErrorCode : integer;
    public
      Error    : boolean;
      ErrorText: string;
      KillEcho : boolean;
      function  OpenPort(Port,BaudRate : integer) : boolean;
      procedure ClosePort;
      procedure WriteCh(ch : Char);
      procedure WriteStr(s : string);
      procedure WriteBytes(const Bytes : array of byte);
      function  ReadCh : Char;
      function  ReadStr(Count : integer) : string;
      procedure ComError(Reason : integer);
      procedure WriteWord(w : integer);
      function  ReadWord : integer;
  end;

var
  ComDrv : EComDrv;

implementation
uses
  Dialogs;

procedure EComDrv.ComError(Reason : integer);
var
  s : string;
begin
  ErrorCode := Reason;
  case ErrorCode of
    COMERRREAD  : s := 'ComDriver Error : Reading';
    COMERRWRITE : s := 'ComDriver Error : Writing';
    COMERROPEN  : s := 'ComDriver Error : Opening port';
    COMERRECHO  : s := 'ComDriver Error : Echo different';
  else
    s := 'ComDriver : Unknown error';
  end;
  ErrorText := s;
  Raise EComError.Create(s);
end;

function EComDrv.OpenPort(Port,BaudRate : integer) : boolean;
var
  tms : TCommTimeOuts;
begin
  KillEcho := False;
  PortName := 'COM' + IntToStr(Port);
  Hnd := CreateFile(PChar(PortName),GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);
  GetCommState(Hnd,MyDCB);
  MyDCB.BaudRate := BaudRate;
  MyDCB.StopBits := ONESTOPBIT;
  MyDCB.Flags := DTR_CONTROL_ENABLE;
  SetCommState(Hnd,MyDCB);
  EscapeCommFUnction(Hnd,SETDTR);
  tms.ReadIntervalTimeout := 0;
  tms.ReadTotalTimeoutMultiplier := 1;
  tms.ReadTotalTimeoutConstant := 5000;
  tms.WriteTotalTimeoutMultiplier := 0;
  tms.WriteTotalTimeoutConstant := 0;
  SetCommTimeOuts(Hnd,tms);
end;

procedure EComDrv.ClosePort;
begin
  CloseHandle(Hnd);
  Hnd := 0;
end;

procedure EComDrv.WriteCh(ch : Char);
var
  n : cardinal;
  Echo : Char;
begin
  WriteFile(Hnd,ch,1,n,nil);
  if n <> 1 then ComError(COMERRWRITE);
  if KillEcho then
    begin
      Echo := ReadCh;
      if Echo <> Ch then
        ComError(COMERRECHO);
    end;
end;

procedure EComDrv.WriteStr(s : string);
var
  i : integer;
begin
  for i := 1 to Length(s) do
    WriteCh(s[i]);
end;

procedure EComDrv.WriteBytes(const Bytes : array of byte);
var
  i : integer;
begin
  for i := Low(Bytes) to High(Bytes) do
    WriteCh(Char(Bytes[i]));
end;

function EComDrv.ReadCh : char;
var
  n : cardinal;
  b : char;
begin
  ReadFile(Hnd,b,1,n,nil);
  if n <> 1 then ComError(COMERRREAD);
  Result := b;
end;

procedure EComDrv.WriteWord(w : integer);
var
  i : integer;
begin
  WriteCh(Char(LOBYTE(w)));
  WriteCh(Char(HIBYTE(w)));
end;

function  EComDrv.ReadWord : integer;
begin
  Result := Ord(ReadCh) + Ord(ReadCh) shl 8;
end;

function EComDrv.ReadStr(Count : integer) : string;
begin
  Result := '';
  while Length(Result) <> Count do
    Result := Result + ReadCh;
end;

Initialization
  ComDrv := EComDrv.Create;
  ComDrv.Hnd := 0;
 
Finalization
  if ComDrv.Hnd <> 0 then ComDrv.ClosePort;
  ComDrv.Free;

end.
Avatar billede doc404 Novice
26. marts 2002 - 21:53 #6
skulle have været et svar...
Avatar billede geek Nybegynder
27. marts 2002 - 00:18 #7
Jeg kalder den HELT sikkert forkert. men jeg for heletiden en "ComDriver error : Reading" når jeg prøver at læse fra porten.
Avatar billede doc404 Novice
27. marts 2002 - 08:42 #8
Du får fejlen enten fordi du ikke har åbnet porten eller pga. en timeout fordi der ikke kommer noget...


Sådan skal du bruge den:

if not ComDrv.Open(1,19200) then  // for COM1 med 19200bps
  Exit; // ups...kunne ikke åbne

x := ComDrv.ReadCh;

ComDrv.Close;

Er du sikker på COM porten og baudraten er korrekt?

Hvis du har et program, der kan snakke med din remote, så kan du downloade portmon fra www.sysinternals.com og "se" hvordan de snakker sammen
Avatar billede geek Nybegynder
27. marts 2002 - 17:31 #9
Kan stadig ikke få koden til at fungere som jeg vil. den står bare og lytter og laver så ikke mere.

Men programmet portmon er rigtig godt. vil se om jeg kan bruge nogle af de oplysninger den spytter ud.

Tusind tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester