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 COM i wykres czasowy

mgrems 20 Lip 2011 00:59 3049 14
  • #1 20 Lip 2011 00:59
    mgrems
    Poziom 10  

    Witam i proszę o radę.

    Odczytuję temperaturę z COM-a, mam to umieszczone w zdarzeniu OnTimer. Co 1000ms jest odczytywana wartość temperatury. To jest OK. Mam problem z przedstawieniem tego na wykresie temperatury w czasie. W przedostatniej linijce kodu powinienem wstawić do wykresu wartości X(czyli czas) i Y(czyli temperaturę). Temperatura się zmienia, ale nie wiem co wstawić za czas (???), aby również zmieniał się od 0 co 1 sekundę. Proszę o radę...


    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0 14
  • #2 20 Lip 2011 02:59
    krru
    Poziom 32  

    Sama idea czytania COMa na timerze wydaje mi się dziwna. Dane z COMa czyta się kiedy są dostępne, jeśli przychodzi ich za dużo po prostu można część pomijać, albo uśredniać albo wyznaczać min-max w danych czasie.
    A jeśli chodzi o właściwe pytanie to naprawdę w Delhi nie ma funkcji udostępniającej aktualny czas?
    Nie ma gettime?

    0
  • Pomocny post
    #3 20 Lip 2011 07:05
    Dżyszla
    Poziom 42  

    Nie, to błedne rozwiązanie, co przedstawiłeś. Przesyłane dane trafiają do bufora najpierw portu COM, a potem systemowego. Wówczas funkcja ReadStr może odczytać dane z tego bufora. W przeciwnym razie będzie czekać.
    Po prostu w jednym wątku zrób "nieskończoną" pętlę czytającą, która po odczycie wstawi zarówno czas jak i wartość np do listy dynamicznej. Drugi wątek niech odczytuje co jakiś czas (w sumie może to być i timer) te dane i na ich podstawie sporządza wykres. Czas możesz łatwo przedstawić w postaci UNIXowej, czyli w formie liczby całkowitej - to będzie twój X na wykresie. Labela osi X dobierzesz zgodnie z czasem w formacie czytelnym.

    Pamiętaj o zastosowaniu sekcji krytycznych przy takim rozwiązaniu!

    0
  • #4 21 Lip 2011 10:55
    mgrems
    Poziom 10  

    Dzięki za szybką reakcję.

    Pomiar temperatury jest dokonywany przez mikrokontroler (Arduino) i on wysyła dane co 1 sekundę. Dlatego dane z COM-a też odczytywane są co sekundę (stąd Timer). Wynik ma być wyświetlany na ekranie komputera co sekundę w postaci wykresu ponieważ chodzi tu o obserwację zjawiska fizycznego. Nie interesuje mnie czas bieżący tylko upływający...

    ...może jeszcze jakaś sugestia z Waszej strony ?

    0
  • Pomocny post
    #5 21 Lip 2011 17:40
    Dżyszla
    Poziom 42  

    Pozbądź się tego timera. Timer nie ma gwarancji uruchomienia procedury obsługi zdarzenia idealnie co zadany czas. W efekcie możesz z czasem doprowadzić do przepełnienia bufora.

    Jeśli chodzi Ci o deltę czasu, to po prostu odejmij od bieżącego pierwszy czas i wsio.

    Kod: delphi
    Zaloguj się, aby zobaczyć kod

    0
  • #6 22 Lip 2011 12:00
    mgrems
    Poziom 10  

    Przedstawiam dotychczasowy efekt moich zmagań

    [delphi] Odczyt COM i wykres czasowy

    Mam jeszcze problem z wartością początkową odczytywanej temperatury (widać na powyższym obrazku) oraz z gubieniem niektórych wartości temperatury. Zdarza się to sporadycznie, ale jednak.
    Cały czas korzystam z Timera. Chciałem się go pozbyć, ale coś mi nie wychodzi. Co robię nie tak ? Mikrokontroler nadaje z prędkością 9600b/s i co 1 sek wysyła wartość temperatury i tak mam ustawiony ComPort w programie.

    Kod: delphi
    Zaloguj się, aby zobaczyć kod


    Liczę na kolejne sugestie, pozdrawiam wakacyjnie...

    0
  • #8 27 Lip 2011 12:09
    mgrems
    Poziom 10  

    Nie daję rady...
    Nie wiem dlaczego odczyt z com-a działa z Timer-em...

    [delphi] Odczyt COM i wykres czasowy

    a nie działa bez niego...

    [delphi] Odczyt COM i wykres czasowy

    Mikrokontroler wysyła cały czas (co sekundę) wartość temperaury:

    [delphi] Odczyt COM i wykres czasowy

    jeszcze raz proszę o jakieś wskazówki.

    0
  • Pomocny post
    #9 27 Lip 2011 16:14
    Slkkk
    Poziom 14  

    Bardzo dawno Delphi nie używałem, ale mam pewne podejrzenie. Odczyt pewnie działa, ale że nie zrobiłeś czytania w osobnym wątku, to blokujesz cały program w tej pętli i nie ma on kiedy narysować sobie okienka. Jeśli nie umiesz zrobić wątków i ich prawidłowo synchronizować, to dodaj po prostu Application.ProcessMessages; po ustawieniu etykiety, chyba pomoże.

    0
  • #11 27 Lip 2011 18:11
    mgrems
    Poziom 10  

    Wstawienie Application.ProcessMessages nic nie pomogło.

    Cały kod odczytu wstawiłem dwa posty wyżej. Co jeszcze mogę podać, żeby bardziej naświetlić problem ?

    0
  • Pomocny post
    #12 27 Lip 2011 18:15
    Slkkk
    Poziom 14  

    A jest kolega pewien, że w dobrym miejscu umieścił ten kod? Może ona się nigdy nie wykonuje? Niech kolega spróbuje na przykład dodać jakiś przycisk i całą tę pętle umieścić w procedurze obsługującej jego zdarzenie onClick.

    0
  • #13 27 Lip 2011 18:37
    mgrems
    Poziom 10  

    Slkkk - BINGO !!!

    To nie startowało. Teraz powalczę i dam znać jak mi coś wyjdzie...

    pozdrawiam

    0
  • Pomocny post
    #14 27 Lip 2011 18:44
    Slkkk
    Poziom 14  

    Tak sobie obejrzałem instrukcję obsługi do ComPort i widzę, że kolega chyba go źle używa. Po wykonaniu ComPort.Open; on sam będzie wywoływał (jak mniemam obejrzawszy dołączone do komponentu przykłady) ComPortRxChar za każdym razem, gdy pojawią się nowe dane. Parametr Count tej procedury to liczba bajtów, które są gotowe do odczytania. Tak więc ComPort.Open niech się wykona po naciśnięciu przycisku lub w OnCreate głównego okna, zaś w ComPortRxChar należy tylko odczytać Count bajtów i ustawić Caption -- żadnej pętli.

    0
  • #15 27 Lip 2011 21:51
    mgrems
    Poziom 10  

    Wielkie DZIĘKI

    Na dzień dzisiejszy wygąda to tak:
    [delphi] Odczyt COM i wykres czasowy

    Pewnie będę miał jeszcze jakieś wątpliwości to pozwolę sobie na kolejne pytania...

    0