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

[Delphi] Program do wyświetlania danych z RS.

Proteus76 25 Feb 2011 11:12 2373 18
  • #1
    Proteus76
    Level 10  
    Witam !

    Proszę o pomoc w wykonaniu programu w Delphi.
    Do tej pory zajmowałem się głównie programowaniem mikrokontrolerów w asemblerze.
    Projekt który obecnie wykonuję wymaga jednak aplikacji PC wyświetlającej wynik wysłany z mikrokontrolera przez RS.
    Calość wygląda mniej więcej tak:
    1. Mikronotroler zlicza impulsy z enkodera
    2. Po stosownych obliczeniach mikrokontroler w przerywaniu co 0,1 s wysyła
    wynik obliczeń w postaci string na RS.
    Zmienna tekstowa wysyłana do bufora to liczba 5 cyfrowa w postaci 000.00
    3. Aplikacja Delphi odczytuje bufor RS (korzystam z komponentu Comport) i wyświetla go w komponencie Memo.

    Aplikacja teoretycznie działa (oparta jest o procedury dostępne w helpie) ale mam następujące problemy których nie potrafię rozwiązać:

    1. Jak usunąć wpis Memo1 widoczny po uruchomieniu aplikacji
    2. Zmienna jest błędnie wyświetlana w oknie Memo. Centralnie
    wyświetlany jest pierwszy znak liczby a na jego tle pozostala część
    np przy liczbie 123,89 widoczne w memo jest 23,89 na tle 1.
    W związku z tym liczba w oknie ciągle migocze co powoduje problemy z
    odczytem.
    3. Chciałbym dodatkowo w aplikacji umieścić suwak zmieniający swoje
    położenie (a może i kolor) w zależności od wartości odczytanej z RS.

    Z góry dziękuję za pomoc.

    Listing programu:

    Code: pascal
    Log in, to see the code

    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • #2
    xanio
    Level 27  
    ad 1. na początku programu (może być w TForm1.FormCreate) daj Memo1.Clear; ewentualnie w properties tego menu znajdź Lines i tam możesz edytować początkową wartość.

    ad 2. źle robisz. Jeżeli jesteś pewien, że liczba składa się z 5 cyfr (6 znaków) to zapamiętaj ile znaków już pobrałeś i po 6 znakach dopiero wstawiaj to do Memo1.Text. Podstawienie do Memo1.Text automatycznie czyści poprzednią zwartość memo, dlatego masz objaw nakładania się liczb na siebie: raz wyświetlana jest część napisu, za chwilę znika i pojawia się druga część.

    ad 3. Jak już zrobisz poprzednie punkty to pomożemy z tym.
  • #3
    Proteus76
    Level 10  
    Dane na RS wysyła komenda print (program napisany jest w BASCOMIE). W przypadku terminala wszystko dziala ok i dane nie nadpisują się. Jak rozumiem każdy
    ze znaków składający się na string jest wysyłany na RS osobno. Czyli odbiór powinien wyglądać tak że`czekam na sześć znaków po wystąpieniu zdarzenia i dopiero zapisuję wszystko do RevS. Jeżeli to możliwe to bardzo proszę o jakiś
    wzorcowy fragment kodu.
  • #4
    xanio
    Level 27  
    Hmm.. teraz to już nie wiem, możliwe, że palnąłem głupotę.
    Sprawdź kilka kolejnych odczytów portu pod kątem długości zwróconego stringa.

    Możesz to zrobić np tak:

    Code: pascal
    Log in, to see the code


    w pliku port.txt, który jest w tym samym katalogu co program, powinien zawierać kolejne odczyty (100 pozycji). Pokaż co tam będzie. Mam nadzieję, że nie ma błędów w programie gdyż piszę w notatniku :)
  • #5
    krru
    Level 33  
    Proteus76 wrote:
    Dane na RS wysyła komenda print (program napisany jest w BASCOMIE). W przypadku terminala wszystko dziala ok i dane nie nadpisują się. Jak rozumiem każdy
    ze znaków składający się na string jest wysyłany na RS osobno. Czyli odbiór powinien wyglądać tak że`czekam na sześć znaków po wystąpieniu zdarzenia i dopiero zapisuję wszystko do RevS. Jeżeli to możliwe to bardzo proszę o jakiś
    wzorcowy fragment kodu.


    Wykorzystaj kropkę do do synchronizacji odczytu - jeśli na odpowiedniej pozycji nie ma kropki, to czytasz i ignorujesz dane aż spotkasz krokę, potem ignorujesz kolejne dwa znaki (o ile są to cyfry) i zaczynasz liczenie od zera.
  • #6
    Proteus76
    Level 10  
    Sprawdzę wszystkie sugestie i odezwę się w poniedziałek jakie przyniosły wyniki.
  • #7
    Proteus76
    Level 10  
    Witam !

    Oto zawartość pliku wygenerowanego przez program w wersji Xanio,

    Code:

    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.2 dlugosc: 3
    odczytalem: 0m
    0.2 dlugosc: 7
    odczytalem: 0m
     dlugosc: 4
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
    0.20m
     dlugosc: 13
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20 dlugosc: 4
    odczytalem: m
    0.20m
     dlugosc: 9
    odczytalem:
     dlugosc: 1
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
    0.20m
     dlugosc: 13
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m dlugosc: 5
    odczytalem:
    0.20m
     dlugosc: 9
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 6
    odczytalem:
     dlugosc: 1
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0 dlugosc: 1
    odczytalem: .20m
     dlugosc: 6
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7
    odczytalem: 0.20m
     dlugosc: 7

    Jak widać odczyt nie jest prawidłowy. Pytanie jak to skorygować.
  • #8
    xanio
    Level 27  
    spróbuj to:
    Code: pascal
    Log in, to see the code


    nadal piszę w notatniku więc mogą być błędy.
  • #9
    Proteus76
    Level 10  
    Ostatni program działa w ten sposób że wyświetla tylko pierwszy stan licznika po włączeniu portu. Myślałem nad tym trochę i nie wiem czy nie zastosować takiego triku że łańcuch zaczyna się i kończy na jakimś charakterystycznym znakiem, które umownie zamykają klamrą właściwy string. Delphi czyta bufor i wyświetla w memo
    dane tylko wtedy kiedy w buforze zapisana jest całość zmiennej string. Oczywiście jakimś sposobem trzeba przed wyświetleniem usunąć znaki transmisji.
  • #10
    xanio
    Level 27  
    Takie znaki charakterystyczne już masz: to 'm' oraz znaki końca linii: #13#10.

    Code: pascal
    Log in, to see the code
  • #11
    Proteus76
    Level 10  
    Teraz program bardzo ładnie chodzi. Wyświetla wszystko tak jak powinien. Wielkie dzieki Xanio :!:. Mam teraz następujące pytania. Czy w momencie kiedy wysyłany string przyjmie postać kolejno 0.00 - 00.00 - 000.00 (licznik liczy w zakresie od 0.00 do 200.00 i od 0.00 do -200.00 ) ten sposób zliczania się sprawdzi. Widzę że przejście w zakres minus zero nie sprawia problemów i działa ok. Czy możesz mi krótko opisać algorytm tzn. rozumiem że koniec jest wykrywany przez znak m ale co stanie jeżeli string wydłuży się jeszcze o dwie pozycje czyli 000.00.
    Do szczęścia brakuje mi jeszcze by przestało wyświetlać w oknie memo1 po uruchomieniu programu.
  • #12
    xanio
    Level 27  
    Działa to tak, że na początku obcinamy to co znalazło się przed pierwszym 'm' (możliwe, że były tam niepełne dane) a potem cyklicznie pobieramy wszystko od początku łańcucha aż do 'm', przy czym po odczycie danych, są one najpierw doklejane do tymczasowego łańcucha (obcinamy przy okazji znaki końca linii), dzięki czemu możliwe jest odczytanie wartości, które podzieliły się na dwa (lub więcej) odczyty. Nie powinno być problemu z większą ilością pozycji.
  • #13
    Proteus76
    Level 10  
    Rozumiem. Muszę dokładnie przeanalizować listing programu. Jak pozbyć się tego nieszczęsnego napisu memo1 w oknie przed pierwszym odczytem ?
  • Helpful post
    #14
    xanio
    Level 27  
    Odnośnie napisu 'memo1' już pisałem wcześniej.
  • #15
    Proteus76
    Level 10  
    Witam !

    w którym miejscu dokładnie ma się znaleźć wpis resetujący okno memo1 ?
  • Helpful post
    #16
    xanio
    Level 27  
    Na przykład w zdarzeniu OnCreate dla formy. Kliknij 2x w okno formy w miejscu gdzie nie ma żadnego komponentu, otworzy się kod tego zdarzenia, tam wpisz Memo1.Lines.Clear;

    Za chwilę wpadnie tu moderator i skasuje cały temat za brak inicjatywy.
  • #17
    Proteus76
    Level 10  
    Rozumiem już nie będę więcej marudził. Dziękuję za pomoc i mam nadzieję że będzie ona przydatna również dla innych zainteresowanych tematem. Co do braku inicjatywy to w sytuacji gdy wymagane są szybkie rezultaty a brak czasu na naukę Twoja pomoc okazała się nieoceniona. Czeka mnie jeszcze kwestia paska i zrzutu zawartości ekranu więc będę miał spore pole do popisu i dużo materiału do przerobienia w temacie Delphi. Mam nadzieje że moderator okaże się wyrozumiały.
  • #18
    xanio
    Level 27  
    Możesz też usunąć początkową wartość w tym polu. Kliknij na memo, następnie F11 i znajdź tam właściwość (property) Lines.
  • #19
    treker
    Level 25  
    Witam, mam podobny problem, jednak po części poradziłem sobie dzięki zamieszonym tutaj kodom.

    Muszę przesłać 15 liczb o zmiennej długości jedna mieści się w byte, reszta w integerach.

    Nie wiedziałem jak to zbytnio ugryźć, więc wysyłam całą ramkę jako sklejone liczby w zapisie dwójkowym, taka ramka waży 184bity. I później wycinam sobie 8 lub 16 bitów z odpowiedniego miejsca i przeliczam.

    Czy nie dałoby rady jakoś wysyłać tego bez zamiany na system dwójkowy? Nie chciałbym używać też żadnych znaków łączących liczby. Poziom mojego programowania w Delphi jest bardzo niski, może nie wiem o jakiś sprytnych funkcjach pomocnych w tej sytuacji?

    I czy w ogóle jest sens wysyłać ramke nie jako system dwójkowy, czy przypadkiem nie wyjdzie mi na to samo?

    Druga rzecz, to wysyłam takich ramek 25 na sek, z nich rysuje wykres i do tego wpisuje odpowiednie wartości do label'i, trochę to trwa, jednak komputer wyrabia się oczywiście bez problemu. Denerwuje mnie ciągłe miganie kursora (kursor/klepsydra/kursor etc.) Można z tym coś zrobić?