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 wizualizować dane z uC po RS232 w Delphi? Temperatury i przyciski

treker 05 Kwi 2008 14:25 2177 19
REKLAMA
  • #1 4995964
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Witam,
    nie mam doświadczenia w pisaniu programów na uC i PC, które komunikują się po rs232, więc mam parę problemów.
    Sprawa wygląda tak, mam uC który zbiera parę informacji z otoczenia niech dla przykładu będą to 3 temperatury plus 2 przyciski.
    Program w uC (Bascom) wygląda tak ze co jakiś czas procek daje np
    Print 'temp1=50'
    Print 'temp2=30' //przykładowe wartości
    Print 'temp3=4'
    Print 's1=0' //przycisk jeden wył
    Print 's1=1' //przycisk dwa on

    I teraz mój problem jak napisać w delphi używając comporta program który będzie te dane wizualizował w taki sposób:
    gdy dostanie 'temp1=50' rozpozna i odrzuci wartość 'temp1=', a '50' umieści na np progreesbar1, temp2 na progressbar2 itd itp.
    Nie wiem czy ktoś mnie zrozumiał z góry dziękuje za pomoc :D
  • REKLAMA
  • #2 4996922
    Konto nie istnieje
    Konto nie istnieje  
  • #3 4997099
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    Rozumiem że kontroler wysyła text 'temp1=50' oraz/lub 's1=0'? A program go odbiera i ustawia odpowienio progressbary i checkboxy?
    Masz już zrobioną komunikację i trzeba to tylko przetworzyć?
  • #4 4997197
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Fyszo, tak dokładnie uC wysyła coś takiego:
    temp1=5|temp2=20|temp3=0|s1=0| itd itd
    i trzeba teraz taki ciąg przetworzyć.
  • REKLAMA
  • Pomocny post
    #5 4997458
    Konto nie istnieje
    Konto nie istnieje  
  • #6 4997469
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Wszystko przychodzi jednym ciągiem tak jak w moim przykładzie | jest separatorem.
  • Pomocny post
    #7 4997691
    Konto nie istnieje
    Konto nie istnieje  
  • #8 4998347
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Cytat:
    Nie wiem jak dlugi jest ten ciag

    Na razię też nie wiem wszystko wyjdzie w trakcie budowy, przykłąd który dałeś działa świetnie, ale dla wartości 0-99 przy 100 nie działa a w praktyce będą przesyłane tam też wartości od 0-255. Da rade jakoś temu zaradzić?

    Dobra już sobie trochę radze z dodawaniem np nowych progresów itd.
    Mógłbyś mi tylko pokazać jeszcze jak dodać wykrywanie np 3 przycisków przycisk wciśnięty = checkbox zaznaczony itd?

    Dodano po 1 [godziny] 11 [minuty]:

    Dobra trochę po robiłem, uporałem się z tym przez niesamowite kombinacje bo mam ustawioną prędkość transmisji tylko na 1200 i zanim sie cały string załadował to już go zaczynało kasować. Teraz w programie w delphi dałem timer który sprawia że po starcie dotyczy czeka parę ms i dopiero zaczyna robotę .
    Gdyby tylko działało to na tych liczbach 3 -cyfrowych.
  • REKLAMA
  • Pomocny post
    #9 4998758
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    Wułuskuj liczbe pomiędzy znakami '=' i '|'.
    np.
    
    var 
    st:string;
    i,pos1,pos2:byte;
    temp:array[0..3] of byte;
    begin
     st:='temp1=5|temp2=20|temp3=2|temp4=15|s1=1|';
     pos2:=0;
     //powtórz 4x
     for i:=0 to 3 do begin
       //zacznij szukac znaku '=' od  pozycji znaku '|'
       pos1:=pos2;
       //poszukaj znaku'='
       while st[pos1]<>'=' do inc(pos1);
       //poszukaj znaku'|' zaczynajac od pozycji znaku'='
       pos2:=pos1;
       while st[pos2]<>'|' do inc(pos2);
       //wyluskaj i zapisz liczbe
       temp[i]:=lo(strtoint(copy(st,pos1+1,pos2-pos1-1)));
     end;
    
  • #10 4998870
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Dzięki Fyszo, działa, ale z uC idzie kiepsko:/
    Chyba trzeba zrobić coś takiego odebrane znaki zapisywać np w jakiejś zmiennej czekać parę ms aż się zapiszą i w tedy dopiero robić cokolwiek z nimi.
  • Pomocny post
    #11 4998984
    Konto nie istnieje
    Konto nie istnieje  
  • #12 4999344
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Cytat:
    if length(st)>0 then.... wtedy st bedzie przetwarzane,jezeli nie bedzie puste

    Właśnie tu jest problem, bo string zostaje przetwarzany, gdy nie doszedł jeszcze cały i w tedy robią się błędy. Chyba zmienia moją ramkę informacji na coś takiego :
    |ilość separatorów |temp1=5|temp2=20|temp3=2|temp4=153|s1=1|s2=1|s3=0|
    w 'Ilość separatorów będę wpisywał ilość | póki i program będzie czekał póki nie będzie wszystkich. Co o tym myślicie?

    Dodano po 24 [minuty]:

    Bez opóźnienia 600ms przez timer nie daje sobie rady :/
  • #13 4999787
    Konto nie istnieje
    Konto nie istnieje  
  • #14 5000255
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Dziwna sprawa uC wysyła całą "ramkę", ale komputer szybciej zaczyna na niej już coś robić zanim cała dojdzie gdy wprowadzę opóźnienia jest ok.
    Z tymi pętlami i ilością separatorów sobie i tak nie dam rady moje delphi jest na niskim poziomie :/
    Na razie i tak zdecydowałem się na propozycje Fysza, później będzie łatwiej operować na takiej tablicy.
  • #15 5000288
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    Można zrobić coś takiego, że tuż przed znakiem '=' jest liczba określająca nr tempx - można ją przerobić na byte i wpisać to tablicy pod tym samym indeksem. Czyli nie trzeba wysyłać całej ramki, tylko to co uległo zmianie (np. temp13=45). Program automatycznie wyłuska nr temp (13) i wpisze do tablicy temp[13] liczbę 45. Takie rozwiązanie uniezależnia program od długości ramki, bo uC może wysyłać tylko to co uległo zmianie (nawet jedną daną). Ilość przesyłanych danych również znacząco spadnie.
  • #16 5000307
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    To nawet nie musi być temp.
    może być:
    1=20
    10=199
    itd, tylko żeby dobrze działało to gdy wartość będzie 0-255 oraz gdy indeks będzie czasami 1cyfrowy a czasami 2 cyfrowy.
    Pomoże mi ktoś tak to zrealizować, w zamian mogę trochę pkt podarować.
    Pozdrawiam i dziękuje za pomoc
  • #17 5000472
    Fyszo
    Poziom 37  
    Posty: 3987
    Pomógł: 223
    Ocena: 115
    Proponuję poprawić całą komunikację. Interpretacja przychodzących danych to mniejszy problem. Zapoznaj się dokładnie z API windowsa dotyczącego rs232 lub zaopatrz się w książkę (nawet ebooka) 'RS 232C - praktyczne programowanie'. Z nią zrobisz wszystko.
  • REKLAMA
  • #18 5000486
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Już tam lookałem, tam nic do mnie nie przemawia.
    To chociaż daje jakąś podpowiedź jak to wszystko zrealizować mogę zmieniać program w uC i PC
  • #19 5000548
    Konto nie istnieje
    Konto nie istnieje  
  • #20 5000569
    treker
    Poziom 25  
    Posty: 969
    Pomógł: 31
    Ocena: 250
    Ok jutro będę próbował dalej.
    Kod w bascomie to coś takiego:
    Print "temp1=" ; S ;"|temp2=" ; A ; "|";
    Itd itp

Podsumowanie tematu

✨ Dyskusja dotyczy problemu wizualizacji danych przesyłanych z mikrokontrolera (uC) do komputera przez interfejs RS232 w środowisku Delphi. Mikrokontroler, programowany w Bascom, wysyła okresowo ciągi tekstowe zawierające wartości temperatur (np. temp1=50) oraz stany przycisków (np. s1=0). Użytkownik potrzebuje sposobu na odbiór i przetworzenie tych danych w Delphi, aby wartości temperatur wyświetlać na progressbarach, a stany przycisków na checkboxach. Wskazano, że dane mogą być przesyłane jako pojedyncze krótkie stringi lub jako jeden długi ciąg rozdzielany separatorem '|'. Zaproponowano metody parsowania tekstu za pomocą funkcji stringowych (Copy, Pos) oraz konwersji na liczby (StrToInt). Omówiono problem obsługi wartości trzycyfrowych (0-255) oraz konieczność opóźnień i buforowania danych, aby uniknąć przetwarzania niepełnych ramek. Sugerowano także alternatywne formaty transmisji, np. wysyłanie tylko zmienionych wartości z numerem indeksu, co ułatwia aktualizację i zmniejsza ilość przesyłanych danych. Podkreślono znaczenie synchronizacji odbioru danych i wykorzystania timerów w Delphi. Wskazano, że poprawne parsowanie i obsługa RS232 wymaga znajomości API Windows lub literatury specjalistycznej. Przykładowe fragmenty kodu Delphi pokazują iteracyjne dzielenie ciągu na podciągi, wyłuskiwanie numerów i wartości oraz przypisywanie ich do elementów GUI (progressbary, checkboxy).
REKLAMA