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



Teraz jest 27 sty 2026, o 19:09


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
Autor Wiadomość
PostNapisane: 12 maja 2014, o 17:42 
Offline
Nowy

Dołączył(a): 26 cze 2013
Posty: 19
Pomógł: 0

Witam,
Wysyłam za pomocą uart kolejne bajty(szesnastkowo). NIe mogę sobie poradzić z wysyłem tablicy za pomocą funkcji.

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


_ramka(); to prosta funkcja która wysyła bajto po bajcie:

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


i to pięknie działa.

Natomiast funkcja frame_aaa(); wysyła tylko 2 pierwsze bajty tablicy:

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


Do wstawiania kodu używamy znacznika 'syntax', poprawiłem - Sonix

Gdzie zrobiłem babola?, poniżej zrzut ekranu:
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 18:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Aż tak dokładnie się nie znam ale--
jeśli nazwa tablicy to wskaźnik to sizeof tab
chyba (podkreślam chyba) poda Ci wilkość wskaźnika a nie
wielkość zajmowaną przez elementy tablicy .

ale dla pewności muszą się wypowiedzieć koledzy bardziej doświadczeni :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 18:27 
Offline
Użytkownik

Dołączył(a): 15 cze 2013
Posty: 599
Lokalizacja: Lubin
Zbananowany użytkownik

Pomógł: 35

Obejrzyj ostatni poradnik Mirka o tytule "Jak wysłać kilka bajtów przez SPI, I2C, RS232" :)
w skrócie jeśli działa wysyłanie bajtu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

Czyli wywołując ją przekazujesz jej bufor i jego długość a funkcja w pętli for po kolei wysyła pojedyncze bajty.

A co do sizeof to też dokładnie się nie znam ale wydaje mi się że ona zwraca wielkość wskaźnika na zerowy element tablicy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 19:00 
Offline
Nowy

Dołączył(a): 26 cze 2013
Posty: 19
Pomógł: 0

Ok, to ma sens, ale za każdym razem muszę znać długoś tablicy?(pzekazywanie do funkcji jako zmienna len)
Nie da się jakoś "na lenia"?
tablic mogę mieć wiele np:
_t1[]={0x01,0x02,0x03}
_t2[]={0x05,0x07,0x08,0x09}
itd...

Czy kotś zauwżyl jakoś bład?Myślę , myślę i nie mogę wymyślić dlaczego funkcja wysyła tylko 2 pierwsze bajty.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 19:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

O ile moja teoria jest prawdziwa to, wysyła Ci dwa bajty
dla tego że sizeof " wskźnika " równa się dwa bo wskaźnik w AVR-ach jest dwubajtowy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 20:00 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

tomavka napisał(a):
Myślę , myślę i nie mogę wymyślić dlaczego funkcja wysyła tylko 2 pierwsze bajty.
Rozmiar wskaźnika wynosi 2 bajty i dlatego wysyła Ci tylko 2 elementy tablicy.
tomavka napisał(a):
Ok, to ma sens, ale za każdym razem muszę znać długoś tablicy?
Nie musisz. Pamiętaj, że wisisz cioci kasę, pożyczyłeś w stanie wskazującym. Nikt Ci nie powie ile pożyczyłeś, a ciocia nic nie powie jak się pomylisz przy oddawaniu - od razu wyjmie kałacha ;)

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

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Ostatnio edytowano 12 maja 2014, o 20:01 przez barney, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 20:01 
Offline
Użytkownik

Dołączył(a): 22 gru 2013
Posty: 296
Lokalizacja: Szczecin
Pomógł: 47

Tutaj:http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#The-sizeof-Operator
jest przykład użycia operatora "sizeof":

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


z wyjaśnieniem dlaczego Ci nie działa:

There are two cases where this technique does not work. The first is where the array element has zero size (GCC supports zero-sized structures as a GNU extension). The second is where the array is in fact a function parameter (see Function Parameters).
Z powyższego wynika, że jednak musisz przed wywołaniem funkcji z tablicą jako argumentem, wyliczyć długość tablicy i ewentualnie podać ją jako drugi argument tej funkcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 21:17 
Offline
Użytkownik

Dołączył(a): 15 cze 2013
Posty: 599
Lokalizacja: Lubin
Zbananowany użytkownik

Pomógł: 35

Czyli wilkość tablicy obliczysz w ten sposób:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


przykład w c http://ideone.com/fork/ho4zSx mozna uruchomic online i wyrzuci 6 czyli ostatnim elementem tablicy jest wielkosc tablicy -1



Ostatnio edytowano 12 maja 2014, o 21:38 przez OdeOn, łącznie edytowano 4 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 21:20 
Offline
Użytkownik

Dołączył(a): 22 gru 2013
Posty: 296
Lokalizacja: Szczecin
Pomógł: 47

OdeOn -niekoniecznie tak.
W Twojej propozycji nadal obliczamy wielkość tablicy w funkcji, której argumentem jest ta tablica
-co wg. opisu jest błędem;
a z kolei
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


oblicza tylko ilość elementów tablicy
( w tym przypadku dla elementu jedno bajtowego:

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


-dzielenie to nie ma znaczenia, bo sizeof(tab[0]) będzie =1).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 21:27 
Offline
Użytkownik

Dołączył(a): 15 cze 2013
Posty: 599
Lokalizacja: Lubin
Zbananowany użytkownik

Pomógł: 35

krish napisał(a):
OdeOn -niekoniecznie tak.
W Twojej propozycji nadal obliczamy wielkość tablicy w funkcji, której argumentem jest ta tablica
-co wg. opisu jest błędem;
a z kolei
Składnia: [ Pobierz ] [ Ukryj ]
język c
sizeof(tab)/sizeof(tab[0])
GeSHi

powtórze się:
przykład w c http://ideone.com/fork/ho4zSx mozna uruchomic online i wyrzuci 6 czyli ostatnim elementem tablicy jest wielkosc tablicy -1

------------------------ [ Dodano po: 6 minutach ]

krish napisał(a):
-dzielenie to nie ma znaczenia, bo sizeof(tab[0]) będzie =1).

Nie zawsze będzie 1 bo to jest sprawdzenie wielkość zmiennej a ona może być 1, 2 czy 4 bajtowa.

------------------------ [ Dodano po: 13 minutach ]

tomavka napisał(a):
Nie da się jakoś "na lenia"?


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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 21:52 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 10 maja 2014
Posty: 24
Pomógł: 1

tomavka napisał(a):
Ok, to ma sens, ale za każdym razem muszę znać długoś tablicy?(pzekazywanie do funkcji jako zmienna len)
Nie da się jakoś "na lenia"?
tablic mogę mieć wiele np:
_t1[]={0x01,0x02,0x03}
_t2[]={0x05,0x07,0x08,0x09}
itd...

Czy kotś zauwżyl jakoś bład?Myślę , myślę i nie mogę wymyślić dlaczego funkcja wysyła tylko 2 pierwsze bajty.


czy te twoje ramki mają jakies znaczniki konca ?
np gdybyś wiedział kiedy sie ramka konczy to mógłbys napisać funkcje ktora wysyłą tak długo az nie napotaka koniec ramki

wtedy nie musiał byś znać rozmiaru tablicy

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

_________________
Kawczynski



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 22:02 
Offline
Użytkownik

Dołączył(a): 22 gru 2013
Posty: 296
Lokalizacja: Szczecin
Pomógł: 47

ad.1
Cytuj:
powtórze się:
przykład w c http://ideone.com/fork/ho4zSx mozna uruchomic online i wyrzuci 6 czyli ostatnim elementem tablicy jest wielkosc tablicy -1


Nie kłóćmy się, jeżeli ta funkcja nie działa, to proponuję aby autor spróbował testowo wysłać wartość sizeof dla kilku wariantów tej funkcji np. ( piszę "z ręki" mogą być błędy)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


ad2. Ależ ja piszę " w tym przypadku" a nie w ogólnym.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 22:03 
Offline
Użytkownik

Dołączył(a): 15 cze 2013
Posty: 599
Lokalizacja: Lubin
Zbananowany użytkownik

Pomógł: 35

łańcuch znaków ma na końcu 0 i chcąc taką zmienną wysłać np. przez uart można wykorzystać pętlę while która będzie się wykonywała dopóki nie napotka 0 bo to jest fałsz i koniec działania więc nawet nie potrzeba znać wielkości takiej tablicy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 22:18 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 10 maja 2014
Posty: 24
Pomógł: 1

wszyscy dają milion podpowiedzi rozwiazanie jest proste jak drut

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



wystarczy sizeof a raczej zmienną zadeklarować jako globalną a kompilator nie zrobi nie potrzebnej optymalizacji i wysle wszystkie bajty
zobacz na powyższy kod u mnie wysyła wszystkie bajty z tablicy ,
ale rowniez mozna by sie pokusic o wersje z znacznikami konca ramki o których pisałem wyzej


OdeOn napisał(a):
łańcuch znaków ma na końcu 0 i chcąc taką zmienną wysłać np. przez uart można wykorzystać pętlę while która będzie się wykonywała dopóki nie napotka 0 bo to jest fałsz i koniec działania więc nawet nie potrzeba znać wielkości takiej tablicy.


nie koniecznie , bo nie wiadomo czy to typowy cstring i jest zakonczony null '\0'

_________________
Kawczynski



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 22:25 
Offline
Użytkownik

Dołączył(a): 15 cze 2013
Posty: 599
Lokalizacja: Lubin
Zbananowany użytkownik

Pomógł: 35

To zadziała dla zmiennych 1 bajtowych.

http://ideone.com/fork/WK6Z2U tu zadeklarowałem te samo tablice jako zmienne 1, 2 i 4 bajtowe. Po uruchomieniu:
tab 1 - char
sizeof(tab1)= 6
sizeof (tab1[0]))= 1
sizeof(tab1)/sizeof (tab1[0]))= 6
tab 2 - short
sizeof(tab2)= 12
sizeof (tab2[0]))= 2
sizeof(tab2)/sizeof (tab2[0]))= 6
tab 3 - long
sizeof(tab3)= 24
sizeof (tab3[0]))= 4
sizeof(tab3)/sizeof (tab3[0]))= 6

i jak widać dla jednobajtowej zmiennej sizeof(tab1)= sizeof(tab1)/sizeof (tab1[0])) ponieważ sizeof (tab1[0]))= 1

------------------------ [ Dodano po: 15 minutach ]

Kawczynski napisał(a):
OdeOn napisał(a):łańcuch znaków ma na końcu 0 i chcąc taką zmienną wysłać np. przez uart można wykorzystać pętlę while która będzie się wykonywała dopóki nie napotka 0 bo to jest fałsz i koniec działania więc nawet nie potrzeba znać wielkości takiej tablicy.

nie koniecznie , bo nie wiadomo czy to typowy cstring i jest zakonczony null '\0'

niekoniecznie ? możesz wyjaśnić bo jestem przekonany że łańcuch znakowy ma zawsze na końcu zapisane 0 i tym różni się od innych tablic.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 08:43 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 10 maja 2014
Posty: 24
Pomógł: 1

wyjaśnienie jest proste , nie wiemy z jakiego zródla sa te ramki podawane , autor tego tematu nie napisał tego ,
gdyby były wysyłane z terminala np pc to oczywiście ze mógł by to być c-stringi i wtedy na pewno były by zakończone '\0'
ale również mogą pochodzić z jakiego innego urządzenia i nie ma pewności ze to sa c-stringi moze to być zwykła tablica porozrzucanych bajtów.

_________________
Kawczynski



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 09:46 
Offline
Nowy

Dołączył(a): 26 cze 2013
Posty: 19
Pomógł: 0

Witam, Dziękuje wszystkim za wkład, a w szczególnosci barney.
Po dodaniu:

#define USART_send_buf(x) _USART_send_buf(x, sizeof(x));

Wszystko ładnie śmiga.
Dla dociekliwych ramki wysyłane sa po uart z atmega 32 do terminala PC.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO