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



Teraz jest 28 mar 2024, o 13:04


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 ]
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 ]
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 ]
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