com1 jako wejście

0

W jaki sposób wykryć, czy na jakimś wyjściu (np. pin 1) com1 lub 2 jest sygnał?

0

Odczytać wartość z com i następnie sprawdzić czy n-ty bit jest jedynką czy zerem.

0

to będę musiał poszukać jakiegoś kody, który będzie działał pod xp.

0

userport, dlportio, porttalk się powinny przydać.

0

Spróbuj wmontować ten kod, u mnie pod xp działa. Wstawia do memo wszystko co pojawi się na wybranym porcie com. Do formy wstaw timer, memo i buttona jeśli chcesz coś wysłać np literę 'a'.
Resztę musisz sam dostosować do własnych wymagań.

var
  Form1: TForm1;
  port_com:pchar;
  c:char;
  hcommport:thandle;
  ctmocommport:commtimeouts;
  dcbcommport:dcb;
  dwcount:dword;
  buf:string;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
c:='a'; // znak do wysłania
writefile(hcommport,c,1,dwcount,nil);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
readfile(hcommport,c,1,dwcount,nil);
if (dwcount=1) then
begin
if c<>#13 then
        begin
        IF c<>#10 then
        begin
         buf:=buf+c;
        end;
        end
    else
        begin
        Form1.Memo1.Lines.add(buf);// info
        buf:='';
        end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
port_com:='com1'; // tu wpisz który port chcesz obsługiwać
hcommport:=createfile(port_com,generic_read+generic_write,0,
           nil,open_existing,file_attribute_normal,0);
ctmocommport.readtotaltimeoutmultiplier:=1;  
setcommtimeouts(hcommport,ctmocommport);
dcbcommport.dcblength:=sizeof(dcb);
getcommstate(hcommport,dcbcommport);
dcbcommport.BaudRate:=cbr_9600; // prędkość
setcommstate(hcommport,dcbcommport);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
closehandle(hcommport);
end;

Powodzenia.

0

Podstawowa sprawa - RS232 jest portem szeregowym, więc nie wystarczy sprawdzić n-tego bitu, bo z założenia zwarcie linii transmisyjnej RX do masy lub poziomu napięcia powoduje, że wszystkie bity mają wartość taką samą. Wyjątkiem są tu linie równoległe portu (linie modemowe RTS, DTR, itp). Tym bardziej, że w RS232 tylko określone piny są sygnałami wejściowymi. Przyjrzyj się dokładnie użytej powyżej funkcji GetCommState.

0

moze lepiej wez po prostu wez te komponenty:
http://sourceforge.net/project/showfiles.php?group_id=71007
komponentow w paczce jest duzo ale tobie powinien wystarczyc TApdComPort
masz w nim metody putchr, putblock, getchar, getblock i nic Cie zadne piny nie beda oobchodzily!
No chyba ze je lubisz - ale w takim wypadku Delphi chyba nie jest najlepszym srodowiskiem do Twoich problemow...

1 użytkowników online, w tym zalogowanych: 0, gości: 1