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



Teraz jest 11 sty 2025, o 13:58


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 25 lut 2014, o 11:47 
Offline
Użytkownik

Dołączył(a): 08 cze 2012
Posty: 28
Pomógł: 0

Witam, chcę stworzyć sobie funkcję, która będzie sprawdzała, ile odbiorników i z jakimi adresami jest podłączonych do magistrali RS485. Wszystko jako tako działa, jednak mam problem z zapisaniem adresów i ilości podłączonych odbiorników np. do tablicy. Nie wiem jak wyciągnąć przesłany adres, z odebranego stringa, tzn. gdzie zaczyna się ciąg znaków odpowiadających adresowi w postaci int, wiem tyle, że następuje po znaku w, ale nie wiem jak to wykorzystać :(
Poniżej fragment programu "Master-a" sprawdzającego podłączone urządzenia:

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


A tu fragment programu zgłaszających odpowiedź odbiorników

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


Prosiłbym o pomoc, w wyciągnięciu i zapisaniu adresów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2014, o 12:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 06 maja 2012
Posty: 233
Lokalizacja: Gdynia
Pomógł: 15

Może tak:

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


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2014, o 03:51 
Offline
Użytkownik

Dołączył(a): 08 cze 2012
Posty: 28
Pomógł: 0

Witam ponownie. Przepraszam za odgrzebywanie tematu, ale mam podobny problem. Jestem w trakcie tworzenia funkcji do obsługi transmisji w której potrzebuję sprawdzić czy argument przekazywany do funkcji to wyraz "value". Przeglądając tematy natknąłem się na pomysł:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i mam pytanie, czy będzie działać to poprawne, chociaż nie wydaje mi się, bo command to wskaźnik do string-a, jak na razie zrealizowałem to 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.

ale chciałbym, sprawdzać czy wystąpił cały ciąg znaków.

Mam jeszcze pytanie odnośnie funkcji strcnmp ponieważ działa podobnie jak funkcja strcmp, jednak można podać ilość znaków do porównania. W warunku
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
chciałbym sprawdzić czy na pierwszym miejscu odebranego ciągu znaków znajduje się adres (liczba od 1 do 16) jednak używając tej funkcji muszę podać liczbę znaków do porównania, w przypadku liczb od 1 do 9 jest to jeden znak a dla liczb od 10 do 16 są to dwa znaki. Przyszedł mi do głowy pomysł, żeby sprawdzić czy w danym momencie adres jest liczbą <10 i odpowiednio do tego podawać odpowiednią ilość znaków do porównania. Tylko co w przypadku kiedy np. liczba 9 nie będzie na pierwszym miejscu a gdzieś dalej w ciągu znaków? Zastanawiam się czy nie wykorzystać buf jako tablicy i nie sprawdzać jej pierwszych elementów? i jeszcze jedno pytanie, czy ta pętla ma sens? Zrealizowałem ją z myślą o tym, żeby odczekać chwilę, aby zdążyć odebrać odpowiedź przed wysłanie kolejnej prośby
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


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


Ciało funkcji:

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: 19 gru 2014, o 10:39 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

...kuba... napisał(a):
czy będzie działać to poprawne, chociaż nie wydaje mi się, bo command to wskaźnik do string-a

A dlaczego nie miało by działać poprawnie? Bardzo dobrze, że wskaźnik, nic innego tam nie może być: http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#ga46f3cbd2de457c0fb340a1f379fc33ba

Co do dalszej części: pokaż jaki konkretnie ma być string wejściowy a coś się może wymyśli. Pokaż wszystkie możliwe warianty pod względem dlugości, części skladowych i separatorów.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2014, o 13:44 
Offline
Użytkownik

Dołączył(a): 08 cze 2012
Posty: 28
Pomógł: 0

No to jeden problem z głowy ;)
Co do reszty stworzyłem taką pętlę która na początku programu "skanuje" magistralę RS485 w poszukiwaniu ilości podłączonych odbiorników (Innych Atmeg) i kolejno zapisuje ich adresy (wartości od 1 do 16) do tablicy slave_adres.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zastanawiam się czy to dobre rozwiązanie, żeby sprawdzać odpowiedzi odbiorników (odbierać dane z UART) w funkcji
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
a nie w programie głównym. Robiąc to w ten sposób chciałem, żeby funkcja zwracała mi już gotową odebraną wartość. dane wysyłane są w postaci:

[Adres|action|command/data|\r\n]

Adres - liczba od 1 do 16
action - rozkaz w postaci znaku 'r'-czytaj dane z odbiornika, 'w' - zapisz dane do odbiornika
command/data - jest to ciąg dwóch znaków ( "pp"- czytaj adres, "pt" - odczyt temperatury, ) lub wartość wypełnienia PWM (od 1000 do 3000);
\r\n - znaki końca danych
zastanawiałem się nad zrobieniem sumy kontrolnej, ale najpierw chciałem uporać się z tymi problemami.

Kolejne wywołania wyglądają w ten sposób, ale jak wyświetlę sobie temp_slave i PWM_slave na wyświetlaczu, to wartości zamieniają się miejscami, czyli w miejscu temp raz jest temp, a raz wartość PWM i na odwrót, więc stąd moje wątpliwości co do poprawnego działania.
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: 19 gru 2014, o 15:00 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

W funkcji nie stąd ni zowąd pojawia się ascii_line. Co to właściwie za zmienna?
W linii 23:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nie wiem co właściwie zwraca funkcja uart_get_str w razie braku znaków do wczytania? Jeżeli wskaźnik na bufor (który nb. zawiera pewnie śmieci) to jeszcze pół biedy (w tym wypadku), ale jeżeli NULL to strncmp raczej niezbyt dobrze to przyjmie. (Na marginesie: funkcja itoa pożarła tu ostatni argument strncmp).
We wzorcu ciągu pomiędzy polami ciągu pokazujesz separator (znak '|'), w funkcji jego nie ma, w końcu separator jest czy nie? (Na marginesie: w opisach formalnych zwykło się używać znaku '|' jako oznaczenie alternatywy dla pola, podobnie w regexpach). Jeżeli nie ma separatora, to rozważ jego użycie bo ułatwi to parsowanie stringa (jest taka fajna funkcja pt. strtok).
Alternatywą do parsowania stringów funkcjami z biblioteki string.h jest użycie sscanf. Z tą funkcją to są już niemal nieograniczone możliwości parsowania i (jednoczesnej) konwersji, ale za to kod puchnie ;-)

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 gru 2014, o 15:57 
Offline
Użytkownik

Dołączył(a): 08 cze 2012
Posty: 28
Pomógł: 0

Odnośnie ascii_line sygnalizuje obecność kolejnej linii w buforze cyklicznym - do którego trafiają dane odebrane z bufora sprzętowego, czyli jej wartość zwiększana jest po odbraniu znaku \r (dziesiętnie = 13) który kończy przesłaną ramkę, korzystam z biblioteki MKUART autorstwa mirekk36 i raczej nie mogę publikować jej na forum.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

a jej wartość zmniejszana jest po pobraniu danych w funkcji służącej do odbierania danych, :

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


xor napisał(a):
(Na marginesie: funkcja itoa pożarła tu ostatni argument strncmp).
Faktycznie tu wyskoczył mi błąd podczas kompilacji, ale zapominałem poprawić go na forum.

A separatora w funkcji nie ma;/ Użyłem go tylko na forum przedstawiając ramkę danych w celu wydzielenia pól.

A mogę np. w funkcji Transmit korzystać z bufora buf[] jak z tablicy? czyli sprawdzić jej pierwszy element, czy zawiera się w nim interesujący mnie adres? Chodzi mi o to, czy po pobraniu danych funkcją uart_get_str(buf), będą one trafiać na początek tablicy buf? czyli czy na zerowej pozycji tablicy znajduje się początek pierwszy element ramki danych jakim jest adres?
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  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 11 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