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? 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 9 lip 2025, o 18:44


    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 ] [ Zaznacz wszystko ]
    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 ] [ Zaznacz wszystko ]
    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 8 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