Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 19 maja 2025, o 16:44


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
    Autor Wiadomość
    PostNapisane: 24 paź 2014, o 10:17 
    Offline
    Nowy

    Dołączył(a): 11 wrz 2014
    Posty: 15
    Pomógł: 0

    Witam. Podłączyłem swój układ przez rs232 usb-ttl do komputera przez port COM6. Dane które odbieram przechowuję w zmiennej char i mi ładnie wyświetla na ekranie. Mam problem przy konwersji zmiennej typu char na liczbową np. int .
    Próbowałem:
    int i = (int)zmienna_char;
    cout<<i;
    printf ("%d", i);
    ale wyskakuje mi szereg liczb, które nie wiem co znaczą.
    Dołączam zdjęcie z dobrze wyświetlającymi danymi (zmienna char) oraz zdjęcie ze źle wyświetlającymi danymi (zmienna int).
    Program:

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    ObrazekObrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 14:46 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 03 mar 2014
    Posty: 580
    Lokalizacja: Jastrzębie-Zdrój
    Pomógł: 71

    Witam,

    Kolega tu masz rozwiązanie swojego problemu ;)

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Zamiast cstdlib może być stdlib

    Rzutowanie typów w tym przypadku nie zadziała ;)

    z Niebieskim pozdRowieniem,
    Doman89



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 17:04 
    Offline
    Nowy

    Dołączył(a): 11 wrz 2014
    Posty: 15
    Pomógł: 0

    Nadal coś jest źle :(
    Zmieniłem:
    16. char RS_buf[8]; //bufor danej
    58. RS_buf[0]='a';
    89. int i =atoi( RS_buf);
    90. cout <<i;

    printf ("%e", atof( RS_buf)); też nie działa :(

    Zamieszczam zdjęcie z tym co jest i tym co powinno być.

    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 17:17 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 03 mar 2014
    Posty: 580
    Lokalizacja: Jastrzębie-Zdrój
    Pomógł: 71

    megatron napisał(a):
    printf ("%e", atof( RS_buf)); też nie działa


    Kolega ale do stringów jest chyba znacznik %s, %e jest do zmiennoprzecinkowych.

    z Niebieskim pozdRowieniem,
    Doman89


    ------------------------ [ Dodano po: 3 minutach ]

    Sorki ty masz mieć int'a więc %d :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 17:41 
    Offline
    Nowy

    Dołączył(a): 11 wrz 2014
    Posty: 15
    Pomógł: 0

    Dużej zmiany nie ma.

    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 17:48 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 03 mar 2014
    Posty: 580
    Lokalizacja: Jastrzębie-Zdrój
    Pomógł: 71

    Kolega a Ty mu podajesz wartości 0.734 np? Czyli zmiennoprzecinkowe czy ja źle rozumuję?

    z Niebieskim pozdRowieniem,
    Doman89



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 17:54 
    Offline
    Nowy

    Dołączył(a): 11 wrz 2014
    Posty: 15
    Pomógł: 0

    Tak, ze swojego układu przesyłam wartość 0.734 przez RS232 i odczytuję ją w terminalu. Tak jest to liczba zmiennoprzecinkowa, dlatego użyłem %e.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 18:16 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 03 mar 2014
    Posty: 580
    Lokalizacja: Jastrzębie-Zdrój
    Pomógł: 71

    megatron napisał(a):
    Nadal coś jest źle :(
    Zmieniłem:
    16. char RS_buf[8]; //bufor danej
    58. RS_buf[0]='a';
    89. int i =atoi( RS_buf);
    90. cout <<i;

    printf ("%e", atof( RS_buf)); też nie działa :(

    Zamieszczam zdjęcie z tym co jest i tym co powinno być.

    Obrazek


    No to koleżko:
    89. int i = atoi (RS_buf); => float i = atof(RS_buf)

    printf ("%e", atof( RS_buf)) => printf("%f", i); lub printf("%f", atof(RS_buf);

    Spróbuj powyższego

    z Niebieskim pozdRowieniem,
    Doman89


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 18:31 
    Offline
    Nowy

    Dołączył(a): 11 wrz 2014
    Posty: 15
    Pomógł: 0

    Też nie działa. Może tu jest problem z całym kodem.

    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 19:09 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 04 lut 2014
    Posty: 164
    Pomógł: 3

    Wygląda to tak jakbyś zrobił przepełnienie stosu - albo raczej zakresu zmiennej.

    Składnia: [ Pobierz ] [ Ukryj ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Wrzuć to do innej tablicy zamiast RS_buf.

    _________________
    ::::::: C ::::::::::
    :::::: C++ :::::::::



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 19:44 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 maja 2013
    Posty: 568
    Zbananowany użytkownik

    Pomógł: 31

    megatron napisał(a):
    ale wyskakuje mi szereg liczb, które nie wiem co znaczą.

    Ta liczba to kod ASCII znaku.

    _________________
    Und schreien

    Spring
    Erlöse mich
    Spring
    ...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 22:09 
    Offline
    Nowy

    Dołączył(a): 11 wrz 2014
    Posty: 15
    Pomógł: 0

    Oboje macie racje ;)
    Ale nadal mam problem :(
    To co zauważyłem:
    Każdą zmienną odczytuję oddzielnie(za pomocą ReadFile) w postaci int np. Jak wyślę z mikrokontr. przez RS232 liczbę 0.734, to odczytam
    najpierw 0
    potem . i zapiszę to jako 0
    next 7
    next 3
    next 4
    next 0 // nie wiem skąd to się wzięło
    i next 0 // nie wiem skąd to się wzięło
    Całą liczbę zapisuję do RS_buf1 i ją wyświetlam, czyli mam liczbę 0073400 zamiast 0.734
    Nie wiem jak ten problem rozwiązać więc wrzucam zdjęcie i kod.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Obrazek



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 24 paź 2014, o 23:24 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 04 lut 2014
    Posty: 164
    Pomógł: 3

    Może się mylę, ale popatrz:

    zadeklarowałeś tablicę:
    Składnia: [ Pobierz ] [ Ukryj ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    //sześcioznakową

    i popatrz ile masz liczb w tablicy:
    0073400 = 6 (sześć) znaków (licz 0,1,2...). Nie sądzę aby to był przypadek.

    Pokombinuj z odczytem zmiennej. I najlepiej zaokrąglij (o ile się da) wynik.

    Pozdro.

    _________________
    ::::::: C ::::::::::
    :::::: C++ :::::::::



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 28 paź 2014, o 18:04 
    Offline
    Nowy

    Dołączył(a): 11 wrz 2014
    Posty: 15
    Pomógł: 0

    mokrowski napisał(a):
    No to albo decydujesz się na rozwiązanie w C++ albo w C! Mieszanie powoduje jedynie schizofrenię. Po co tam <stdio.h>, <stdlib.h> ?! Ja wiem że <windows.h> potrzebne bo otwierasz COM'a ale printf?!

    Masz rację. No i niestety w związku z tym pojawia się większy problem :(
    Używałem printf i myślałem, że przechowuję zmienną w tablicy o różnych indeksach, a tu jednak cały czas dana zapisywała mi się do tablicy pod indeksem '0'. Zauważyłem to dopiero gdy, użyłem: cout << ...<< endl; W jednym wierszu miałem 0, w drugim . , w trzecim 7 itp.
    Zacznijmy od początku, czyli jak zapisać pojedynczą daną do tablicy, dzięki waszej pomocy już wiem jak zamienić ją z char na float, więc sobie z tym poradzę.

    z mikrokontrolera wysyłam:
    daną, czyli np. 0.734 +
    usart_bufor[z] = 13; //znak powrotu karetki CR (Carrige Return)
    usart_bufor[z+1] = 10; //znak nowej linii LF (Line Feed)
    usart_bufor[z+2] = 0; //znak końca ciągu tekstu w tablicy
    dzięki temu każdą daną mam w kolejnej linijce.

    Kod po stronie komputera jest dobry ale w RS_buf przechowywana jest jedna zmienna :(
    Kod który wyświetli mi dobry wynik, ale nic mi nie daje:
    Składnia: [ Pobierz ] [ Ukryj ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Powyższy kod jest w pętli while(1){..., a więc czyta np 0.734 + Carrige Return + Line Feed+ znak końca ciągu tekstu w tablic
    Ja chce dane zapisywać w tablicy i tu się pojawiają problemy:
    1. Skąd wiem, że zaczynam odbierać kolejną liczbę, od początku(0.734), a nie od środka (734.0)?
    2. Nie wiem co robi break.
    3. Skąd wiem, że jest już koniec przechwytywanej danej?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 29 paź 2014, o 17:39 
    Offline
    Nowy

    Dołączył(a): 11 wrz 2014
    Posty: 15
    Pomógł: 0

    Dziękuję bardzo, wszystko działa jak należy :)
    Podaję kod z działającym programem. Wynikiem jest zmienna typu float :)

    Temat uważam za zamknięty.

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język cpp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO