Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Problem z Rs-232 w Delphi 6

unnamed 14 Lis 2005 12:15 4376 9
  • #1 14 Lis 2005 12:15
    unnamed
    Poziom 13  

    Witam
    Prosze o pomoc z wiazana z nastepujacym problemem .
    Pisze program w delphi ktorego glownym zadaniem jest komunikacja z zewnetrznym urzadzeniem przez rs-232.
    znalazlem komponent cport do tego
    http://delphi.icm.edu.pl/ftp/d30share/comport.zip
    narazie chce tylko otworzyc port i procedura moja mala wyglada tak :

    unit Main;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
    StdCtrls, ComCtrls, CPort;//Z tego korzystamy
    type
    TMainFrm = class(TForm)
    ComPort: TComPort;
    BtnOtworz: TButton;
    procedure BtnOtworzClick(Sender: TObject);
    private
    { Private declarations }
    public
    { Public declarations }
    end;

    var
    MainFrm: TMainFrm;

    implementation

    {$R *.dfm}
    procedure TMainFrm.BtnOtworzClick(Sender: TObject);
    begin
    if ComPort.Connected then//jezeli CPort jest polaczony to..
    begin
    ComPort.Close;//zamknij
    BtnOtworz.Caption:='Otwórz';
    end else begin//jezeli nie jest to..
    ComPort.Open; //otworz..
    BtnOtworz.Caption:='Zamknij';
    end;
    end;

    end.

    Problem polega na tym ze podczas proby kompilacji wyskakuje komunikat

    Field MainFrm.ComPort does not have a corresponding component.
    Remove the declaration?

    Jak dam "No" to przekompiluje ale w momencie jak wcisne buton jest error access voliation xxxxxxxxxxxx
    Wie ktos moze jak sobie z tym poradzic ?
    POzdrawiam

    0 9
  • #2 14 Lis 2005 18:26
    Jaca
    Poziom 28  

    Prawdopodobnie:
    - masz błędnie zainstalowany komponent;
    - nie wpisałeś ścieżki do źródeł komponentu w Library path (Tools->Environment Options->Library).

    Pozdrawiam...

    0
  • #4 16 Lis 2005 13:29
    unnamed
    Poziom 13  

    No wiec zminilem zdanie co do gotowego komponentu i zabralem sie od poczatku do tematu wykozystujac winapi .
    Tyle ze po napisaniu wszystko jest ok ale zame zera mi wracaja .
    Dodam tylko ze program komunikuje sie s karta sim przez phoenixa
    a ja staram sie odebrac ATR .
    oto procedura ktora otfiera oraz konfiguruje port , resetuje sima i prubuje odebrac 16 bajtow ATR.

    procedure TForm1.Button2Click(Sender: TObject);
    var
    DCB: TDCB;
    dana:byte;
    count:cardinal;
    lone:integer;
    OverLapped: TOverLapped;
    begin

    lone:=0;
    portnumber:=combo1.text;
    ComHandle := OpenPort ( portnumber );

    if ( ComHandle = 0 ) then
    status.Caption:='ERROR: Port '+PortNumber+' Zajęty..';
    if ( ComHandle <> 0 ) then status.Caption:='Port '+portnumber+' Otwarty..';
    DCB.BaudRate:= CBR_9600;
    SetCommState(ComHandle, DCB);
    DCB.ByteSize:= Databits_8;
    SetCommState(ComHandle, DCB);
    DCB.Parity:= EVENPARITY;
    SetCommState(ComHandle, DCB);
    DCB.StopBits:= ONESTOPBIT;
    SetCommState(ComHandle, DCB);
    EscapeCommFunction(ComHandle, SETRTS);
    Sleep(50);
    EscapeCommFunction(ComHandle, CLRRTS);
    Sleep(250);
    repeat
    Readfile(ComHandle, dana, 1, Count, @OverLapped);
    edit1.text:=edit1.text+inttostr(dana);
    inc(lone);
    until lone=16;
    end;


    Wie ktos moze gdzie zrobilem blad ?
    Pozdrawiam.

    0
  • #5 16 Lis 2005 18:34
    elektryk
    Poziom 42  

    Jeśli używasz trybu overlaped to musisz sprawdzać czy są jakiekolwiek dane, sprawdzając zmienną count.

    0
  • #6 16 Lis 2005 19:12
    unnamed
    Poziom 13  

    niestety caly czas zmienne dana i cout = 0

    0
  • #7 19 Lis 2005 22:17
    ostrytomasz
    Poziom 22  

    unnamed napisał:

    repeat
    Readfile(ComHandle, dana, 1, Count, @OverLapped);
    edit1.text:=edit1.text+inttostr(dana);
    inc(lone);
    until lone=16;


    Witam, z tego co zauważyłem:
    1) sprawdzaj czy jakiekolwiek dane zostały odebrane - nie wczytałem się jakie masz ustawione timeouty, ale możliwe jest że pętla zostanie wykonana 16razy zanim cokolwiek przyjdzie; innymi słowy inkrementuj lone tylko gdy Count>0
    2) edit1.text:=edit1.text+inttostr(dana);
    nie mam pewności jak to zadziała gdy pierwszym odebranym znakiem będzie np. +,- czy chociażby jakieś zakłócenie; uzupełnij cały bufor danymi a dopiero później próbuj to parsować

    Żeby nie "zamrozić" interfejsu użytkownika taki kod fajnie byłoby umieścić w osobnym wątku.

    Supersedes: korzystasz oczywiście z terminala przy debuggowaniu - to urządzenie na pewno ma kontrolę parzystości?

    0
  • #8 27 Gru 2007 13:38
    Patol
    Poziom 22  

    Witam ja chciałbym odświerzyc trochę temat bo nie ma sensu zakładac takiego samego, mianowicie również próbuje uzyskac ATR karty ale trochę w inny sposób :

    procedure TForm1.Button3Click(Sender: TObject);
    var x : integer;
    begin
    if comport.connected = true
    then begin
    ComPort.SetRTS(True); // set RTS to high
    ComPort.SetRTS(False); // lower RTS signal
    x := 1; ATR.text :='';
    ComPort.Read(bufor,16);
    repeat
    ATR.text := ATR.text + INTTOHEX(bufor[x],2)+' ';
    x := x +1
    until x = 17;
    sleep(250);
    bufreset;
    end;

    ale cały czas mam same zera tzn. "00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 "
    za to jak odczytuje dane bezposrednio z portu tzn przy uzyciu :

    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    var
    RevS: string;
    begin
    ComPort1.ReadStr(RevS, Count);
    Memo1.Text :=Memo1.Text +Revs;
    end;

    wtedy otrzymuję odpowiedź: ;÷@-ppl¶Ö_
    czy ktoś może mi pomóc co robię źle, bo w koncu jakies dane wracają od karty tylko czemu wyzej pokazuja mi się same zera? proszę o pomoc
    Pozdrawiam.

    0
  • #9 27 Gru 2007 13:52
    KeinXor
    Poziom 24  

    Witam,
    do odczytu z ComPort-a proponuje wykorzystać event OnRxChar lub OnRxBuf ( nie testowałem ), cos w ten deseń:

    Code:

    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    var
     bufor : array [0..1023] of char;
    begin
     ComPort1.Read(bufor,Count);
     Label1.Caption:=bufor;
    end;

    Pozdrawiam

    0
  • #10 27 Gru 2007 14:24
    Patol
    Poziom 22  

    Nie wiem o co chodzi ale procedura:
    procedure TForm1.Button3Click(Sender: TObject);
    var x : integer;
    begin
    if comport.connected = true
    then begin
    ComPort.SetRTS(True); // set RTS to high
    ComPort.SetRTS(False); // lower RTS signal
    x := 1; ATR.text :='';
    ComPort.Read(bufor,16);
    repeat
    ATR.text := ATR.text + INTTOHEX(bufor[x],2)+' ';
    x := x +1
    until x = 17;
    sleep(250);
    bufreset;
    end;
    jest w porządku ale ATR wyskakuje dopiero po 2 wcisnięciu przycisku tzn. najpierw pokazuja się same zera a kiedy wcisnę jeszcze raz przycisk pokazuje się poprawny ATR, więc o co chodzi?

    0