Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[Delphi] Tcomport - odczyt danych

wicy 17 Sep 2008 20:51 2929 4
  • #1
    wicy
    Level 22  
    Piszę program obsługi RS232 z wykorzystaniem Tcomport.
    Problem jest tego typu:
    Po naciśnięciu guzika w procedurze Tform.buttonclick wysyłam 3 dane do urządzenia.
    Code:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      cp.write(bufor_danych,3);
    end;

    Urządzenie odpowiada paczką 2 danych odczytywaną w zdarzeniu Tcomporta OnRxChar.
    Code:

    procedure TForm1.cpRxChar(Sender: TObject; Count: Integer);
    var i:integer;
    begin
     for i:=1 to 12 do bufor_wejsciowy[i]:=0;
     cp.Read(bufor_wejsciowy[1],count);
     instr:='';
     for i:=1 to count do instr:=instr+' '+inttostr(buf_in[i]);

     Memo1.Lines.Add(instr);
    end;

    Odbiór z wyświetleniem danych do okna Memo działa bez zarzutu. Problem jednak jak przekazać dane odebrane spowrotem procedurze obsługi guzika? Jeśli guzik trzy razy wysyła dane do urządzenia
    Code:

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      cp.write(bufor_danych,3);
      cp.write(bufor_danych,3);
      cp.write(bufor_danych,3);
    end;

    a w procedurze odbioru chcę odczytać dane np. do oddzielnej tablicy, procedura odbioru nie wyrabia z zapisaniem tablicy. Wykonywana jest kolejna instrukcja zanim dane zostaną odebrane;
    Jak zatrzymać więc działanie obsługi guzika po pierwszej instrukcji cp.write(bufor_danych,3); do czasu odczytania wszystkich danych w innej procedurze?
    [/code]
  • Helpful post
    #2
    KeinXor
    Level 24  
    Witam,
    ja bym to rozwiązał w nieco inny sposób, mianowicie:
    stworzył bym wątek który by wysyłał dane na com, po wysłaniu w pętli bezczynności oczekiwał na wywołanie zdarzenia OnRxChar przekazywał bym je do wątku a w nim odpowiednio na nie reagował, czyli zapis/przetworzenie/wyświetlenie (w memo) odebranych danych i wysłanie kolejnej paczki danych na com.
    Pozdrawiam
  • #3
    wicy
    Level 22  
    Dzięki, to mi chyba trochę rozjaśniło.
    W wątku OnRxChar powinienem chyba ustawiać flagę po odebraniu danych i przypisaniu ich do zmiennej pomocniczej. Ponieważ różne przychodzące dane winny być przypisane do wielu różnych zmiennych, opracowanie danych odbędzie się po "wyjęciu" ich zmienną pomocniczą z wątku OnRxChar. Obsługa guzika może mieć pusta pętlę czekającą na zmianę flagi.
    Oddzielny wątek ma się tak do wątku OnRxChar jak wątek główny, więc chyba nie ma co kombinować z tworzeniem nowych wątków. Program i tak musi poczkać na dane, bo całe jego działanie to przetworzenie tego co przychodzi i reakcja na to bezpośrednio po przyjściu a nie wykonywanie innych czynności.
    Nie wiem czy dobrze kombinuję?
  • #4
    KeinXor
    Level 24  
    Hej,
    cieszy mnie fakt że kombinujesz po swojemu i to sie ceni ! ale nie do końca o to mi chodziło ;) już tłumaczę... otóż po pierwsze dla jasności zdarzenie OnRxChar nie jest wątkiem, pisząc o stworzeniu wątku miałem na myśli aby dziedziczyć po klasie TThread takie rozwiązanie jest nazwijmy to bardziej "profesjonalne". Możesz też zrobić to tak jak piszesz poprzez flagi i zmianę ich stanów. Próbuj kombinuj zdobyta praktyka nie pójdzie w las.
    Pozdrawiam
  • #5
    wicy
    Level 22  
    Może niefortunnie nazwałem obsługę zdarzenia watkiem, ale wydaje mi się, że zasadniczo obsługa UART jest quasi wątkiem. Dane w buforze odbioru buforowane są niezaleznie od działania programu. Między wysłaniem żądania przesłania danych do urządzenia, ich przysłaniem i odczytaniem może zostać zrealizowanych wiele kolejnych instrukcji w procedurze, w której pierwsze żądanie zostało wysłane. Dlatego własnie program "nie wyrabia" mi z obiorem danych po kilku nastepujących po sobie żądaniach ich przysłania przez urządzenie zewnętrzne.
    Przyznam, że jestem słabym programatorem i wątki (thredy) mnie przrażają :) Chcę raczej jedną procedurę, by działała tak by krok po kroku wysłać-odebrać-wysłać-odbrać. Czas przetworzenia i inne czynności w "międzyczasie" nie są istotne.