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 11 lip 2025, o 23:01


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
    Autor Wiadomość
    PostNapisane: 23 paź 2013, o 10:06 

    Pomógł: 0

    Od kilku dni walczę z widocznością zmiennych i w sumie nic nie wymyśliłem.
    Mam globalną strukturę
    w common.h
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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


    Następnie w common.c są funkcje które obsługują dane odebrane z UARTA przez system zdarzeń czyli
    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.


    Niestety pomiar.masa, jest już niewidoczne w funkcji wysli_mase, tzn, jest to pusta zmienna (same zera).
    Gdzie w wcześniejszych funkcjach wyświetlanie/przeliczanie etc. działa bez zarzutu, czyli po
    memcpy(&pomiar.masa, &mybuf, sizeof(mybuf));
    operujemu na pomiar.masa no i dlaczego po wyjściu z funkcji czytaj_dane_z_uart1 przestaje istnieć wartość w tej zmiennej?



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2013, o 12:02 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    czy ty nie robisz tu jakiejś strasznie niebezpiecznej rzeczy ? która może ci przy okazji "przeorać wszystko" jak radziecki traktor odrzutowy ?

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


    czy jesteś pewien że rozmiar twojego mybuf jest DOKŁADNIE równy z ....

    nie jeszcze gorzej .... :( myślałem że ty przekopiowujesz całą strukturę a tymczasem ty bez żadnego hmmmm no zastanowienia wkopiowujesz .... no właśnie żeby jeszcze wiadomo było co ? :) ... u ciebie w strukturze jest

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


    więc teraz spróbuj wytłumaczyć co w ogóle wg ciebie ma robić ta linijka ? tzn czego ty od niej oczekujesz ?

    i pomyśl co ona tak naprawdę robi ? to cię ciarki przejdą po plecach

    Podpowiedź: przecież u ciebie masa w tej strukturze to NIE ZAINICJALIZOWANY wskaźnik .... więc jak myślisz gdzie lecą dane po tej operacji memcpy() ??? tym bardziej, że operatorem & jeszcze na dodatek próbujesz pobrać wskaźnik z tego wskaźnika :(


    Autor postu otrzymał pochwałę

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2013, o 12:56 

    Pomógł: 0

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


    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.


    Czyli memcpy(&pomiar.masa, mybuf, sizeof(pomiar.masa));
    działa, co prawda co któryś raz dostaje głupoty hmmmm jak by if(*mybuf++ == '0') nie za każdym razem wyłapywał z przylatujących po uarcie
    0000.279CR4000.770CRLF to co jest po pierwszym zero, bo pokazuje się czasem 000,279400 na uarcie i na LCD, czyli ewidentnie jeszcze gdzieś coś po drodze się kaszani

    PS. Jest jakiś sposób na "dropowanie" niewłaściwych ramek?



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2013, o 13:43 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 07 lut 2013
    Posty: 600
    Pomógł: 47

    A czy nie powinno być czasem bez operatora &pomiar.masa
    czyli tak:
    memcpy(pomiar.masa, mybuf, sizeof(pomiar.masa));

    _________________
    https://www.instagram.com/myfirstquadcopter/



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2013, o 14:02 

    Pomógł: 0

    W sumie wzorowałem się na

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

    stąd ampersand.

    Nie wiem czy dobrze rozumiem, ale na jedno w sumie wychodzi przy zmiennej globalnej, i użycie w moim wypadku &pomiar.masa to takie trochę masło maślane ;)



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2013, o 14:03 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    rezasurmar napisał(a):
    PS. Jest jakiś sposób na "dropowanie" niewłaściwych ramek?


    Pewnie, że jest - tylko trzeba go sobie zrobić ... a ty na siłę od razu wrzucasz WSZYSTKO co przylatuje do bufora ... i dlatego masz kaszaneczkę ....

    Najpierw panie trzeba sparsować bufor, sprawdzić co w nim jest, a jak dane się zgadzają to dopiero wtedy te właściwe dane BACH i do memcpy() ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2013, o 14:10 

    Pomógł: 0

    Hahaha, haha, ha, h..... ;)

    no właśnie próbuję coś urzeźbić ;).

    tj.
    coś na zasadzie sizeof(mybuf)==ilość bajtów w ramce, ale nie bardzo mi to wychodzi

    Dokładniej mówiąc, nie bardzo mam pomysł jak sprawdzić że w mybuf jest właściwa ilośc bajtów, bo w sumie to powinno wystarczyć.

    No bo co tak naprawdę dostajemy w mybuf? no dostajemy wskaźnik na bufor gdzie bufor, jest zapełniany przez obsługę zdarzenia tak w uproszczeniu, no i co, przylatuje mi pierwsza część
    0000,279CR4000,771CRLF, gdzie if(*mybuf++ == '0') na dzieńdobry odrzuca mi po pierwsze, pierwsze zero, potem tylko gdy pierwsze 0 to następuje memcpy itp.
    Nie rozumiem tylko dlaczego "przecieka" nie właściwa ramka? z wagi zawsze przychodzi prawidłowa (sprawdzałem to), same biblioteki twoje Mirku też działają prawidłowo, bo jeżeli wrzucić do obsługi zdażenia ot wysyłanie po prostu na drugiego UARTA też zawsze przechodzi prawidłowa ramka. Coś się dzieje po drodze u mnie na tych "cholernych" ifach, program sie nie wykrzacza, z przepełnianiem bufora przez złe korzystanie z wskaźników już sobie poradziłem, tylko dla czego if puszcza te dodatkowe "400"?

    strlen(mybuf) ;).



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 23 paź 2013, o 19:48 

    Pomógł: 0

    Co masz na myśli mówiąc
    GwynBleidD napisał(a):
    (dlaczego używasz '0' zamiast '\0'?)
    ramka z urządzenia jest nie zmienna, co do początkowych 0 i 4 to jedyne co można ustawić jako "nagłowek" rozróżniający dwie zmienne, masę i tarę innej opcji nie ma.
    Co prawda kiedyś dawien, dawna, miałem podobny problem, a jak zacząłem grzebać w bibliotekach Mirka właśnie pod kątem wykrywania ilości danych dostałem tylko burę od Mirka to sobie odpuściłem grzebanie w bibliotece. No bo gdzie indziej, można by ograniczyć długość bufora, czy sprawdzać dokładnie ile przychodzi danych jak nie w samej bibliotece. Gdyż to ona rozdziela moją ramkę na dwie linijki.
    U Mirka jest niby wykrywanie kolejnych linii, ale niestety to sie nie sprawdzi, jedynie co mi przychodzi na myśl to liczenie przylatujących znaków (bo zawsze jest

    PS. w sumie głąb ze mnie bo wiedziałem, że wróci ten problem jak bumerang.

    Tak wygląda ramka
    30
    30
    30
    31
    2E
    35
    30
    35
    0D
    34
    30
    30
    30
    2E
    31
    35
    38
    0D
    0A

    Czyli wychodzi na to, że jest zawsze 8 bajtów, nie licząc kodów rozdzielających linie.
    Z tym, że interesujące jest to, że j/w już pisałem jeżeli zrobimy przekazywanie uart0 to uart1 czyli to co przylatuje na uart0 idzie na uart1, to nie ma błędów transmisji, mimo to że bufory dla uart0 i 1 są parzyste, a jak widać całkowita ilość bajtów dla uartów nie, chociaż w sumie analizując to co parsują biblioteki Mirka już na samym poziomie odbierania z bufora sprzętowego, tak naprawdę dostajemy tylko zapisywane jest tylko te 16bajtów bez kodów CR i LF

    HA, rozgryzłem, to nie debouce, czy moja część softu, to LCD po i2c miesza w sofcie, po wywaleniu obsługi LCD nic się nie wykrzacza.

    PS. coś się ewidentnie kaszani podczas obsługi SuperDebounce, tj. wpływa ona jakoś na błędne interpretowanie danych nadlatujących z bufora. Bo do puki nie nacisnę klawisza, dane przelatują bez zakłóceń ;).



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

    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