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



Teraz jest 23 kwi 2024, o 09:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 25 wrz 2014, o 13:56 
Offline
Nowy

Dołączył(a): 02 lip 2013
Posty: 19
Pomógł: 0

Witam!

Buduje samochód zdalnie sterowany na pracę inżynierską i już jeździ, sterowanie przez IR oraz Bluetooth. Program napisany w C# do sterowania też mi działa natomiast chciałem jeszcze mierzyć napięcie zasilania i wyświetlać je na bieżąco w programie.
Pomiar napięcia już mam zaprogramowany w uC i działa pozostaje pytanie jak przesyłać te wartości do C# żeby to mogło sobie przemielić i wyświetlić w labelku albo w textBoxie.

Program w uC wygląda tak:
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.


Ustawienia ADC i PWM nie są dla nas teraz istotne.

Zdarzenie Measure_EVENT();
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 ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Tyle z uC a teraz program napisany w C#
Widok programu:
Obrazek

Mam takie zdarzenie odbioru danych z portu szeregowego:
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Potrafię odebrać jeden znak i po naciśnięciu labelka wyświetlić go ale jak zrobić żeby program C# który otrzymuje co jakiś czas dwie wartości(cz_d i cz_u) wyświetlał je automatycznie aktualizując aktualne napięcie zasilania?
Problem też z tym że nie mogę aktualizować tego bezpośrednio w tym zdarzeniu bo jest wtedy konflikt wątków.

Staram się coś samemu nauczyć tego programowania a ta praca miała mnie przymusić żebym posiedział przy tym :D

Proszę o pomoc w rozwiązaniu tego problemu, ewentualnie naprowadzenie mnie na właściwy tor myślenia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 14:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Hey ,

Wiec ja pewnie wyslalbym wartosc pomiaru bez "obrabiania" na serial port zamieniajac to na ascii z uzyciem funkcji itoa()

Co do wysylania nie wiem czy korzystasz z bibliotek Mirka do obslugi UART ?

W programie C# pozniej moglbys opracowac wynik i na biezaco mozesz wyswietlac.

Jesli natomiast chodzi o otrzymywanie danych to popatrz tutaj http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived(v=vs.110).aspx - masz tam przyklad z odczytaniem danych , a metody masz opisane tu http://msdn.microsoft.com/en-us/library/system.io.ports.serialport_methods(v=vs.110).aspx

To powinno dac Ci cos do wyprobowania :)

PS -> Co do watkow (bo teraz doczytalem ze zrozumieniem) to nie wiem z jakiej wersji .Net korzystasz ale musialbys albo skorzystac z np async i zrobic to w tle ... albo np zainetersowac sie delegatami :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 15:30 
Offline
Nowy

Dołączył(a): 02 lip 2013
Posty: 19
Pomógł: 0

Korzystam z Mirkowych bibliotek. Jeśli miałbym wysyłać w kodzie ASCII to muszę zapewne użyć void uart_putint(dane do wysłania, 16)? Tylko mam dwie zmienne...bo część dziesiętną i ułamkową napięcia.
Korzystam z tych stron co mi podałeś(tyle że w wersji językowej polskiej bo jestem cienias i ciężko jest mi zrozumieć po angielsku :roll: ) i już próbowałem różnych ReadByte, ReadChar, ReadTo i udaje mi się odebrać jedną wartość ale mam problem z odebraniem dwóch zmiennych od razu. Z tym to coś pokombinuje i coś wymyśle. Powiedz mi, bo z tym mam największy problem jak zrobić żeby te dane były cały czas aktualne a labelku?
Jeszcze jedno pytanie: Czym się różni ReadByte od ReadChar? Przecież ReadByte odczytuje jeden bajt czyli 8 bitów a ReadChar odczytuje jeden znak a char też jest 8-mio bitowy...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 16:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 maja 2012
Posty: 174
Lokalizacja: Gliwice
Pomógł: 19

Ja bym zrobił podobnie jak radzi kolega RafPe. Ze zmiennych które chcesz wysłać zrobiłbym prostą ramkę np "123,456\r\n" a w C# .ReadTo('\n'). Zaraz napisze przykłady jak ja to widzę.


edit: w sumie kolega niżej już wszystko napisał



Ostatnio edytowano 25 wrz 2014, o 16:12 przez sz4t4n, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 16:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Martinas1324 napisał(a):
Czym się różni ReadByte od ReadChar


No bo albo odbierasz dane binarne albo nie :) Mirek pisze o tym w BB w rozdziale o UART.

Martinas1324 napisał(a):
to muszę zapewne użyć void uart_putint(dane do wysłania, 16)?


Dokladnie! i w ten oto sposob wysles swoje dane.

Martinas1324 napisał(a):
Tylko mam dwie zmienne...bo część dziesiętną i ułamkową napięcia

No ale przeciez to nie problem ... wysylasz to Mirko sposobem gdzie kiedy masz np 7,5 to mnozysz przez 10 -> czyli masz powiedzmy 75 a w Twoim docelowym programie odbierasz sobie i odpowiednio dzielisz przez 10 i sprawdzasz reszte z dzielenia ? :)

Martinas1324 napisał(a):
jak zrobić żeby te dane były cały czas aktualne a labelku

No kurcze tutaj musisz pewnie troszeczke poczytac o.Net np pod tym linkiem jest ciekawy sposob http://stackoverflow.com/questions/661561/how-to-update-the-gui-from-another-thread-in-c

No i sprawdzony u mnie na szybko na zestawie ATB + VS 2013 + win 8 dziala superniascie :)
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 16:46 
Offline
Nowy

Dołączył(a): 02 lip 2013
Posty: 19
Pomógł: 0

Możesz mi trochę objaśnić te linijki kodu:
Składnia: [ Pobierz ] [ Ukryj ]
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

C# to potrafię ale takie podstawowe rzeczy i trochę się w nim gubię :(

------------------------ [ Dodano po: 24 minutach ]

Ja wysyłam z uC tak:
uart_putint(23,16);
To wysyłam w kodzie ASCII 0x32(2) i 0x33(3)
Ale znowu w C# odbieram data = port.ReadByte(); data musi być typu int(32bity) bo inaczej się typy nie zgadzają. Odczytując z Debugera to w data mam 49 i 55. Dlaczego tak jest? O czym ja zapomniałem?

Wysyłanie temperatury to można prosto zrobić bo tak jak kolega RafPe słusznie zauważył wyśle z uC zmienną wynik(czyli przed podziałem na część dziesiętną i ułamkową) za pomocą uart_putint(wynik,16); Tylko dlaczego nie mogę otrzymać ten wartości w C#? :x



Ostatnio edytowano 25 wrz 2014, o 17:21 przez Martinas1324, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 17:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Widzisz :) ze mnie taki nauczyciel jak "projektant elektronicznych komponentow" :)

Ogolnie jest to jeden ze sposobow w jakie mowisz w C# co ma sie stac gdy zostanie wywolany event i przekazujesz wtedy dalej obiekt oraz argumenty

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


Mozna tez tak

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


W obu przypadkach masz obiekt i argumenty do eventa ktory nastapil. Chcialbym Ci to bardziej dokladnie opisac ale pewnie zrobilbym magiczne spagetti z tego postu zamiast w jasny sposob cos podpowiedziec.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 17:31 
Offline
Nowy

Dołączył(a): 02 lip 2013
Posty: 19
Pomógł: 0

RafPe-> Dzięki wielkie, mniej więcej rozumie o co chodzi. Do dogłębnego zrozumienia to jeszcze daleko ale nie wszystko na raz. Już zastosowałem u siebie i ładnie cyka :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 17:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

To super ze Ci sie udalo to zrobic!

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 wrz 2014, o 18:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 paź 2011
Posty: 8583
Pomógł: 337

A ja ze swojej strony powiem fajnie , tylko tym razem przeniosę , następnym razem radzę czytać
takie coś jak zasady działu w którym się pisze post.

_________________
[b]San Escobar! Patria mia! Tu eres como la salud.[/b]



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

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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO