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



Teraz jest 18 mar 2026, o 15:06


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 11 gru 2013, o 21:16 
Offline
Użytkownik

Dołączył(a): 22 lis 2013
Posty: 55
Pomógł: 0

Witam serdecznie,

Temat wałkowany milion razy, jednak myślę, że dołożę swoje 5 groszy. Napisałem program na uC (atmega8a) i do tego swój "terminal" w c# do dobierania danych i wyświetlania na wykresie. Wszystko działa jak należy gdy działam w układzie np. uC razem z RealTerm - przesyła dane prawidłowo (w formacie hex, wysyłam najpierw 0xFF potem zaś zależnie od tego co sobie wybiorę w terminalu, wysyła jedną liczbę lub ciąg 10 liczb i potwierdzenie w postaci liczby 0xFF od PC i tutaj jest ok). Jednak na moim "terminalu" to nie działa jakby nie odbierał danych. Chciałem aby odbierał pojedyncze bajty zamiast popularnego rozwiązania w postaci stringów. Chyba coś zawaliłem więc wklejam kod z uC:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

oraz kod C#. Proszę o sprawdzenie zwłaszcza funkcji odbioru.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Najbardziej jednak zależy mi na wyjaśnieniu jak to dokładnie działa, jak interpretować bufory w PC i jak te dane są przyjmowane, generalnie jak to wygląda z komunikacją szeregową.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2013, o 09:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2013
Posty: 79
Lokalizacja: Rybnik
Pomógł: 2

Moim zdaniem po pierwsze powinieneś wykorzystać klasę Thread, czyli rozbudować program o wielowątkowość. Wystarczy jeden wątek odpowiedzialny za pobieranie danych i ich wyświetlanie oraz główny wątek który odpowiada za wszystkie pozostałe funkcje twojego programu. Możesz też trochę inaczej przesyłać dane z mikrokontrolera do PC, zakładasz sobie ramkę danych powiedzmy x,x,x /n i taką ramkę wysyłasz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W twoim programie wykorzystujesz metodę klasy serialPort ReadTo("/n"). Następnie odebrane dane sobie formujesz za pomocą metody Split klasy string.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Teraz dostęp masz do każdego elementu ramki danych. Istotne jest też wykonanie "synchronizacji" danych odbieranych. W przypadku gdy włączysz program w chwili w której został już wysłany np. pierwszy element ramki to wywali Ci błąd, dlatego najlepiej zrobić pierwszy pusty odbiór.
Nie rozumiem tego fragmentu. Jeżeli chcesz zdefiniować port COM to możesz użyć metody GetPortNames (o ile się nie mylę) i zwróci ci ona jako string podłączone porty COM. Następnie możesz je przypisać do jakieś zmiennej.
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
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 gru 2013, o 13:03 
Offline
Użytkownik

Dołączył(a): 22 lis 2013
Posty: 55
Pomógł: 0

Dziekuję za odpowiedź. Proszę potwierdź mój tok myślenia. Tworzę nowy wątek (wkładam to do metody form1() razem z initialize() tak jak niżej):
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


następnie tworzę sobie nową metodę SerialData:
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jak wydobyć dane które potrzebuję ze zmiennej dane ? Ja wysyłam bajty z uC jako liczby i chciałbym je też odebrać tak samo. Pytam się bo niestety pisać proste programy umiem w C# (naprawdę proste) jednak tutaj już jest gorzej. Może jeszcze potrzebuje małego wytłumaczenia jak działa c# zwłaszcza WindowsForm w nim bo nie widzę tutaj main() etc. i trochę się gubię.

Co do tego niezrozumiałego fragmentu, to jest wycinek starego kodu - nie działa on w żaden sposób w tym programie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2013, o 19:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2013
Posty: 79
Lokalizacja: Rybnik
Pomógł: 2

Dostęp do poszczególnych elementów "zmiennej" dane uzyskujesz poprzez indeksowanie, czyli gdy chcesz pierwszy element to piszesz dane[0], kolejny dane[1]. Jak widzisz do każdego elementu możesz się dostać jak do tablicy. Tylko musisz zauważyć że ty twoje dane z mikrokontrolera wysyłasz trochę inaczej niż ja Ci pokazałem. Nie rozumiem za bardzo jak to działa...
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dlaczego wysyłasz takie dziwne dane? W pierwszej kolejności wysyłasz 255 potem 1, do czego to ma służyć? Potem rozumiem że robisz jakąs transmisje znaków w zależności od odebranej flagi (wysłanej z PC) i transmisje kończysz wysłaniem 254... dlaczego to robisz w ten sposób? Czy jest to jakoś uwarunkowane?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 gru 2013, o 20:40 
Offline
Użytkownik

Dołączył(a): 22 lis 2013
Posty: 55
Pomógł: 0

Kod w C napisałem kontrolnie, chciałem po prostu oderbać i wysłać dane miedzy uC a PC i to nie działało. Teraz mam taki kod:
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


To jednak się sypie. Gdy wysyłam jedną daną to jest ok. Gdzie robię błąd ? ( nawiasem mówiąc to tylko taki kod u mnie działa - jeżeli wysyłam jeden znak 8 bitów).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 gru 2013, o 14:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2013
Posty: 79
Lokalizacja: Rybnik
Pomógł: 2

W programie PC masz zdefiniowany pewien bufor odbiorczy, posiada on 10 elementów.
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 z mikrokontrolera wysyłasz dane
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tylko że gdy od i=0 do i=9, gdy i=9 wykonuje się usart_putc(wysylka[i]); oraz usart_putc(254); (ponieważ warunek if jest spełniony).
Wykonujesz odbiór danych i twoje 254 przypisuje się do do indata pod zerowym elementem nadpisując to co się tam znajduje. Najlepiej jakbyś przedstawił co konkretnie chcesz osiągnąć. Jak już wcześniej napisałem najlepiej jak ustalisz sobie jakąś stałą ramkę danych którą przesyłasz do PC z oznaczonym zakończeniem. Rób to etapami, wysyłaj z mikrokontrolera najprostsze dane i je interpretuj. Następnie rozbuduj twój program. Dobrze też by było jak zamieszczasz jakiś kod programu to dodaj również błędy jakie Ci wyskakują podczas kompilowania programu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 gru 2013, o 22:17 
Offline
Użytkownik

Dołączył(a): 22 lis 2013
Posty: 55
Pomógł: 0

Może osoba znająca się w temacie DDS-ów może mi pomóc, mianowicie mam AD9833, którego ni da się w żaden sposób zaprogramować. Zmieniłem płytkę pcb (zrobiłem nową - projekt wyżej) a na poprzedniej płytce wszystko hulało. Sprawdziłem połączenia i oscyloskopem sprawdzałem czy atmega8 coś robi, i robi :) więc wykluczam (nie)działanie uC. Jednak zauważyłem dziwną rzecz: na wyjściu DDS-a Multimetrem obserwuje napięcie ok 230 mV i powoli spada do zera (oscyloskop pokazuje przebieg stały o potencjale masy) wcześniej (przed zmianą płytki PCB) nie zauważyłem czegoś takiego. Czy to może być objaw uszkodzonego DDS-a ? Jak to zdiagnozować ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 gru 2013, o 17:03 
Offline
Użytkownik

Dołączył(a): 22 lis 2013
Posty: 55
Pomógł: 0

Dziekuje za wszelką pomoc. Co do DDS-a układ był się skończył :P w jakis tajemniczy sposób... Program na c# działa wystarczyło w metodzie Form1_Load(); dopisać linijkę odsługującą zdarzenie DataRecieved :) Układ sobie działa i radzi też dość dobrze. Temat zamykam.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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