logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak otworzyć port RS-232 w Delphi 6 za pomocą komponentu CPort?

unnamed 14 Lis 2005 12:15 4673 9
REKLAMA
  • #1 1987684
    unnamed
    Poziom 13  
    Posty: 127
    Pomógł: 1
    Ocena: 1
    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
  • REKLAMA
  • #2 1989095
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Prawdopodobnie:
    - masz błędnie zainstalowany komponent;
    - nie wpisałeś ścieżki do źródeł komponentu w Library path (Tools->Environment Options->Library).

    Pozdrawiam...
  • REKLAMA
  • #4 1995362
    unnamed
    Poziom 13  
    Posty: 127
    Pomógł: 1
    Ocena: 1
    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.
  • REKLAMA
  • #5 1996365
    elektryk
    Poziom 42  
    Posty: 11029
    Pomógł: 439
    Ocena: 241
    Jeśli używasz trybu overlaped to musisz sprawdzać czy są jakiekolwiek dane, sprawdzając zmienną count.
  • #6 1996499
    unnamed
    Poziom 13  
    Posty: 127
    Pomógł: 1
    Ocena: 1
    niestety caly czas zmienne dana i cout = 0
  • REKLAMA
  • #7 2006727
    ostrytomasz
    Poziom 25  
    Posty: 494
    Pomógł: 82
    Ocena: 218
    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?
  • #8 4627913
    Patol
    Poziom 22  
    Posty: 520
    Pomógł: 50
    Ocena: 31
    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.
  • #9 4627986
    KeinXor
    Poziom 24  
    Posty: 511
    Pomógł: 62
    Ocena: 63
    Witam,
    do odczytu z ComPort-a proponuje wykorzystać event OnRxChar lub OnRxBuf ( nie testowałem ), cos w ten deseń:
    
    procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
    var
     bufor : array [0..1023] of char;
    begin
     ComPort1.Read(bufor,Count);
     Label1.Caption:=bufor;
    end;
    

    Pozdrawiam
  • #10 4628089
    Patol
    Poziom 22  
    Posty: 520
    Pomógł: 50
    Ocena: 31
    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?

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy problemów z otwarciem i komunikacją przez port RS-232 w Delphi 6 przy użyciu komponentu CPort. Użytkownik próbuje nawiązać komunikację z zewnętrznym urządzeniem, m.in. kartą SIM przez Phoenix, i odebrać ATR (Answer To Reset). Wskazano, że często problemy wynikają z błędnej instalacji komponentu lub braku ścieżek do źródeł w Library path. Zalecane jest korzystanie z eventu OnRxChar do odczytu danych z portu, gdyż bezpośrednie wywołanie Read może zwracać same zera. Poruszono kwestie konfiguracji portu za pomocą struktur DCB i funkcji WinAPI, a także konieczność sprawdzania ilości odebranych danych (Count) w trybie overlapped. Zauważono, że ATR pojawia się dopiero po drugim wywołaniu odczytu, co może wynikać z opóźnień w transmisji lub nieprawidłowego buforowania. Sugerowano umieszczenie kodu odczytu w osobnym wątku, aby nie blokować interfejsu użytkownika. Wskazano również na konieczność poprawnej obsługi bufora i parsowania odebranych danych, uwzględniając kontrolę parzystości i sygnały RTS.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA