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



Teraz jest 3 gru 2024, o 00:04


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 22 lip 2020, o 18:47 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Witam, zwracam się do was drodzy forumowicze o pomoc.

Jestem w trakcie pisania pracy inżynierskiej. W skrócie muszę odebrać dane z urządzenia "A", przefiltrować je i następnie wyświetlić gotowe nazwy, które będą bazowały właśnie na odebranych informacjach. Urządzenie korzysta z bardzo dziwnej magistrali bo jest z branży AGD. Z tego co zauważyłem jest to połączenie CAN'a, one wire i uart'a. Ogólnie na wyjściu urządzenia wykorzystywane są RX i TX. Struktura ramki podstawowa - 8n1. Mikrokontroler jaki wykorzystuje to ATmega8. Jako posiadacz bluebooka wspieram się książką w pisaniu programu.

Niestety mam problem z filtracją otrzymanych ramek :/. Do obsługi UART'u wykorzystuję program oparty na buforach cyklicznych (z bluebook'a). Ogólnie mój pomysł na przefiltrowanie danych jest następujący:

- Wykorzystując funkcje uart_getc w loopie pobieram sobie jeden bajt z bufora cyklicznego UART_RxBuf
- Następnie w ifie sprawdzam czy pobrany bajt, to koniec ramki danych (tutaj mam problem, ponieważ nie mam pojęcia w jaki sposób kończy się ramka. Chodzi mi o to, ze nie znam jej fizycznej wartości, po której mógłbym "uciąć" daną ramkę, więc nie sugerujcie się wartością 0xFF). Postanowiłem to zrobić na takiej samej zasadzie, jak jest opisana w bluebooka w temacie o tablicach znakowych. Czy istnieje jakiś sposób na znalezienie fizycznej wartości ? Sprawdzałem dokumentację, jednak tam nic nie znalazłem ;/
- Po wykryciu końca ramki, chcę użyć funkcji strCopy(), która ma za zadanie przepisanie wartości bufora Rx do nowej tabilcy. Żeby ta funkcja mi zadziałała, to tablicę do której przepisuję dane, musiałem dać również jako volatille. W tym przypadku również wykorzystałem wiedzę z tematu o tablicach znakowych
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, chce wyświetlić odebraną ramkę (już uciętą po znaku kończącym ją) na LCD. Pomyślałem, ze warto byłoby wykorzystać funkcję lcd_hex(), jednak wykorzystuje ona itoa, więc potrzebuję tablicy typu int (chyba, że się mylę) a moja tablica, ta do której kupuję zawartość bufora cyklicznego RX jest typu volatille char, bo inaczej nie zadziała mi funkcja kopiująca. Pewnie musze jakoś ją zmienić właśnie na int, jednak nie wiem jak to zrobić.

Tutaj wrzucam kod z mojego main.c

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


Dodatkowo wrzucam schemat układu, którym odbieram dane prosto do atmegi. (Schemat jest nie zaktualizowany, ponieważ sygnał nie trafia do Arduino, a do czystej ATmegi. Wcześniej właśnie próbowałem to zrobić na arduino, ale zrezygnowałem bo czyste C lepsze :D.

Obrazek

Czy opisane przeze mnie rozumowanie jest poprawne? Inaczej nie mam pomysłu jak to rozwiązać, pomijając fakt, że to aktualnie zaproponowane przeze mnie mi nie działa. Macie jakiś pomysł jak to zrobić? Może własne rozwiązania odbioru takich danych? Myślę, ze małe nakierowanie mnie dużo pomoże w tym temacie.
Liczę na waszą pomoc! :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lip 2020, o 20:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lis 2015
Posty: 219
Pomógł: 20

Fajnie by bylo jakbyś wiedział jak zakończone są te ramki. Moze najpierw podlacz sie przejściówka do PC i zobacz co wysyla. Albo wepnij się nią w rx uc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lip 2020, o 20:15 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

A czy moje rozumowanie jest dobre? Zastanawiam się, czy dalej w to brnąć czy nie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lip 2020, o 20:51 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2587
Pomógł: 128

Na początek to wstaw kilka przykładowych ramek.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lip 2020, o 20:57 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Jedyne co udało mi się znaleźć na komputerze na ten moment, to zdjęcie z oscyloskopu.

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2020, o 08:28 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 230
Pomógł: 26

Cześć.
Mam wrażenie że zaczynasz rozwiązywać problem "od środka".
Zobacz że nie wiesz jaki jest format danych.
A co będzie gdy nie ma "końca ramki" w formie jakiegoś bajtu.
Taki przypadek przecież może nastąpić.
Końcem ramki może być czas ciszy na magistrali.
Narobisz się jak koń, a okaże się że to wszystko nie działa bo rzeczywistość jest zupełnie inna.
Spróbuj jak koledzy wcześniej sugerowali przeczytać co tak naprawdę lata na linii RX.

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lip 2020, o 13:40 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2587
Pomógł: 128

Zgraj to porządnie jak człowiek z 30 sekund logic analyzerem (nawet najprostszym). Można wtedy coś więcej powiedzieć. A tak to działanie po omacku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lip 2020, o 21:15 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Hej, chciałem odświeżyć ten temat. Na ten moment udało mi się znaleźć bajty, które sygnalizują koniec ramek. Ku mojemu zdziwieniu ramki wysyłane są w dwóch formatach. Jedna z bajtem końcowym 1A, a druga z 2A. Korzystam z biblioteki Mirka "mkuart" oraz programatora AVR ATB-USB-RS232, więc mam super fajny podgląd na odbierane bajty z bufora cyklicznego UART_RxBuf. Podglądam je w ten sposób:

Obrazek

Zauważyłem, że kiedy bufor zapełni się ramkami, to pomimo otrzymania kolejnej ramki, która pojawia się cyklicznie co 2 sekundy, bufor nie zmienia swojej wartości. Jakby te bajty zapisywały się nie wiadomo gdzie. Natomiast bo wykonaniu akcji na urządzeniu typu przekręcenie enkodera, bufor dostaje dużą porcję danych, które już zapisuje po kolei. Nie mam pojęcia z czego to wynika... Myślałem, żeby dodać jakieś czyszczenie się bufora cyklicznego, ale nie umiem tego wykonać. Macie jakiś pomysł?

Moim kolejnym zamysłem jest skopiowanie danych z bufora do zupełnie nowej tablicy. Następnie dokonywałbym porównania, jej z inną stałą zdefiniowaną z kodami hex. Najprawdopodobniej wykorzystam funkcję strcmp() z biblioteki string.h. Przy kopiowaniu wykorzystuję własną funkcję. Jej głównym problemem jest to, że trochę gubi dane, oraz nie ucina kopiowania w miejscu wystąpienia znaku 1A. Nie mam pomysłu jak to inaczej zrobić. Strcpy() wymaga podania tablicy typu const, które odpadają w tym przypadku, bo obie są dynamiczne. Szukałem coś na necie i wyczytałem o użyciu funkcji typu mem(). Mam jednak małe problemy z zastosowaniem jej - niezbyt to rozumiem :P. Czy macie jakiś pomysł jak rozwiązać te przypadki? Z góry dziękuję za każdą odpowiedź i wcześniejsze odpowiedzi.

Do kopiowania
Obrazek

Mój głowny kod
Obrazek

Setup
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 lip 2020, o 22:56 
Offline
Moderator
Avatar użytkownika

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

wiesz co? już dostałeś kilka podpowiedzi o analizator stanów logicznych a ty wciąż się przed nim bronisz nogami i rękami ;)

mówię ci obejrzyj to:



i ew to, żeby zobaczyć mały wycinek zastosowań


_________________
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: 17 sie 2020, o 18:00 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Hejka, obejrzałem owe filmiki i ruszyłem do przodu z projektem. Aktualnie moim zadaniem jest wykonanie parsowania otrzymanych danych. Greenbooka kupiłem, ale jeszcze nie przyszedł, więc zająłem się rozgryzaniem biblioteki z książki razem z serią filmików o WiFi232. Wszystko wygląda super i zrozumiale, ale owe parsowanie jest skuteczne w momencie, w którym otrzymane dane są zapisane za pomocą ASCII. A co w przypadku, kiedy z urządzenia dostaje dane w hex np. : 3F E0 05 CA A8 1A (1A to wartość, która określa koniec ramki). Ową ramkę nie jestem w stanie przetłumaczyć na kod ASCII. Używałem kalkulatorów hex to ascii i dostawałem taką odpowiedź "?àʨ". Czy mógłbym prosić o pomoc w owej kwestii?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sie 2020, o 19:03 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2587
Pomógł: 128

Masz dostęp do urządzenia?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sie 2020, o 19:20 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Tak, cały czas na nim pracuję. Jutro rano w pracy będę miał fizyczny dostęp do niego.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sie 2020, o 19:28 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2587
Pomógł: 128

To bierz w łapki najprostszy analizator logiczny, na usb (przyda Ci się do wielu innych prac) zgraj nim transmisję i wstaw plik na forum. Jest to o tyle istotne bo taki grab zawiera wiele cennych informacji, prędkość parametry transmisji, odstęp pomiędzy znakami oraz pomiędzy ramkami.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sie 2020, o 19:48 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Prędkość transmisji to 9600. Jedyny podgląd robiłem za pomocą oscyloskopu. Niestety nie mam analizatora :/. Dodam, że mam profesjonalny sprzęt do odbioru danych z urządzenie na którym mogę zobaczyć w formie hex jaka ramka za co jest odpowiedzialna. Ja robię własną wersję tego urządzenia i właśnie mam problem z parsowaniem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sie 2020, o 19:56 
Offline
Moderator
Avatar użytkownika

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

Morales napisał(a):
A co w przypadku, kiedy z urządzenia dostaje dane w hex np. : 3F E0 05 CA A8 1A (1A to wartość, która określa koniec ramki).

W naszym sklepie jest zaawansowana biblioteka Mk MULTI UART w dwóch wersjach i obsługuje komunikację binarną, więc spokojnie .... tego typu ramki będzie lizała jak przysłowiowy pies chudy boczek ;)

https://sklep.atnel.pl/pl/p/MK-MULTI-UA ... eka-C-/271

https://sklep.atnel.pl/pl/p/MK-MULTI-UA ... teka-C/273

obejrzyj poradniki wideo do tych bibliotek

_________________
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: 17 sie 2020, o 21:10 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

No właśnie obejrzałem serie poradników do tej biblioteki. Nie ukrywam, że obsługa komunikacji binarnej, to to co potrzebuję. Mam ramki różnej długości, ale wspominał Pan na filmach, że to nie będzie problem :D. Zastanawiam się jeszcze nad jednym... Czy posiadając bibliotekę z greenbook'a do UART'a oraz książkę ( mam nadzieję, że już jutro :P) ciężko będzie samemu stworzyć taką komunikację binarną? Bardzo tego potrzebuję a w czwartek już od Pana kupiłem greenbooka, więc będę musiał poczekać na następny zakup :P.

Dziękuję za pomoc :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sie 2020, o 21:42 
Offline
Moderator
Avatar użytkownika

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

Wydaje mi się, że absolutna PODSTAWA to opanowanie komunikacji ASCII ... jak to zrozumiesz i już nie będziesz miał z tym problemów to myślę że nadejdzie czas aby zabrać się za binarkę, która wbrew pozorom jest trudniejsza od komunikacji ASCII szczególnie jak chodzi o binarkę opartą na timeoutach bazujących na wielkrotności czasu trwania pojedynczej ramki.

Po drugie - np wspominałeś wcześniej że masz np ramki HEX, ale każda z nich kończy się pewną konkretną sekwencją dwóch bajtów, więc np najmniejszym problemem będzie przerobienie biblioteki z Greenbooka tak aby zamiast badać na końcu znak ENTER badała ten twój ogranicznik - i wtedy uda ci się to obsłużyć w ASCII - a taki trop miałeś zdaje się.

_________________
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: 17 sie 2020, o 21:59 
Offline
Użytkownik

Dołączył(a): 10 cze 2020
Posty: 29
Pomógł: 0

Dokładnie. Każda ramka kończy się albo bajtem '1A', który w dec jest równy 26, albo '2A', który w dec jest równy 42. Właśnie jutro będę próbował przerobić bibliotekę z greenbook'a. Myślałem po prostu o zmianie wartości w funkcji switch case z 13 (enter) na własnie 26 oraz 42. Mówię tutaj o switch case, który jest zawarty w przerwaniu USART_RXC_vect. Jak to zadziała to dalej tylko to jakoś sparsować... Najgorsze jest to, że funkcję typu strcmp() czy strtok() wymagają jako argumentów zmiennych typu char, przez co nie moge ich wykorzystać ;/. Ogólnie po obejrzeniu Pana poradników z biblioteki MK_Multi_Uart wpadłem na pomysł, żeby wszystkie wskaźniki przerobić na typ void. To powinno mi pomóc.

Jeżeli przegram z tym zadaniem, to teraz dzięki Panu mam ten komfort psychiczny z tyłu głowy, że zawsze mogę skorzystać z Pana bilbioteki, która na pewno w 100% będzie działać. :D



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


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