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.

Delphi odczyt danych z bufora w ComPort

Adam_Z 04 Gru 2006 10:17 3087 10
  • #1 04 Gru 2006 10:17
    Adam_Z
    Poziom 10  

    Niestety jako początkujący użytkownik Deplhi mam pewne problemy z odebraniem danych z portu COM. Mój program działa na zasadzie wysyłania do mikrokontrolera znaku z PC z ilością odczytywanych komórek pamięci danych. Przykładowo jeśli wysyłam 'A' odczytywana jest jedna komórka, 'L' dwanaście komórek itd. Ta funkcja programu działa prawidłowo. Problem pojawia się przy odbiorze danych z bufora. Jeśli odbieram dane i bezpośrednio wyświetlam je w polu Edit wg kodu:

    Code:

    procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
    var
      Str: string;
    begin
      ComPort.ReadStr(Str,Count);
       Edit3.Text:=Edit3.Text+Str  ;
    end;


    to mam tyle bajtów ile chciałem otrzymać wyświetlone w polu Edit, 12 znaków odpowiadających zapisom w pamięci mikrokontrolera (czyli wszystko jest OK).

    Ale jeśli chcę wynik bądź bezpośrednio odczytać ze zmiennej Str bądź wpisać do zmiennej Pamiec wg kodu:

    Code:

    procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
    var
      Str: string;

    begin
      ComPort.ReadStr(Str,Count);
      Pamiec:=Pamiec+Str  ;
    end;


    to otrzymuje tylko 4 ostatnie znaki z odebranego ciągu.

    Co robię źle? Jak mam poprawić żeby w zmiennej Pamiec uzyskać to samo co w polu Edit. Pilnie proszę o odpowiedź

    0 10
  • #2 04 Gru 2006 13:43
    eit
    Poziom 17  

    Co to za zmienna Pamiec ?
    Nie konwertujesz czasem w którymś momentcie AnsiString do String lub odwrotnie ? Może tu jest problem

    0
  • #3 04 Gru 2006 16:32
    Adam_Z
    Poziom 10  

    Zapomniałem dodać deklaracji zmiennej Pamiec :
    var Pamiec:string;

    Konwersji żadnej nie robie. Z tego co czytałem to w Delphi domyślnie string odpowiada AnsiString. Dlatego wszystko deklarowałem jak widać.

    0
  • #4 05 Gru 2006 21:20
    Adam_Z
    Poziom 10  

    Udało się. Wystarczyło dać opóźnienie w postaci instrukcji Sleep (100) przed instrukcją odczytu (czytałem wcześniej o tym, ale nie wiedziałem jak i co zrobić). Teraz w zmiennej Pamiec mam cały zapis odczytany z mikrokontrolera. Zamykam temat.
    Pozdrawiam
    Adam_Z

    0
  • #5 06 Gru 2006 21:19
    NazwaUzytkownikaZajeta
    Poziom 10  

    czy moglbys wytlumaczyc do czego jest ten sleep? mam pewien problem i zastanawiałam sie czy to nie chodzi wlasnie o to

    0
  • #6 06 Gru 2006 21:41
    Szopler
    Poziom 21  

    Sleep(x) - zawiesza działanie programu na x [ms].

    0
  • #7 06 Gru 2006 21:45
    NazwaUzytkownikaZajeta
    Poziom 10  

    ja rozumiem co robi ;]
    chcialam sie tylko dowiedziec czemu spowodowala ze ten akurat program zadzialal
    tez odbieram dane z rs i wlasciwie nic do mnie nie dociera dlatego sie zastanawiam czy to opoznienie mi pomoze

    dziekuje

    0
  • #8 07 Gru 2006 08:49
    eit
    Poziom 17  

    Sleep to sztuczne opóźnienie w programie (zawiesza działanie). np Sleep(100) daje 100ms opóźnienia.
    Przydaje się to często przy transmisji z różnymi urządzeniami. Ja ostatnio używałem tego, aby nie zapchać sterownika- urządzenia czyli jak wyślę mu naraz masę poleceń to potrafi się zagubić, bo nie nadąży analizować nadchodzących danych. Wystarczyło 50ms opóźnienia po każdym rozkazie aby wszystko działało bez problemów

    0
  • #9 07 Gru 2006 09:09
    NazwaUzytkownikaZajeta
    Poziom 10  

    a czy zna ktos taka funkcje w vb?

    moge prosic o podeslanie kawalka kodu z tym sleepem do odbierania?
    obojetnie w jakim jezyku


    odpowiadam sama sobie;] w razie gdyby ktos potrzebowal w vb:
    System.Threading.Thread.Sleep(1000)
    nadal prosze o podeslanie tego kawalka kodu

    0
  • #10 21 Gru 2006 11:22
    eit
    Poziom 17  

    A co to za filozofia. U mnie nadawanie na RS do sterownika jest w stylu:

    nadaj coś tam
    sleep(50) ;
    nadaj
    sleep(50) ;
    nadaj;
    sleep(50) ; //itd

    0
  • #11 13 Lut 2007 10:35
    Adam_Z
    Poziom 10  

    Zamykam temat. Problem rozwiązany (patrz wcześniejsza odpowiedź).

    0