Witam,
Przeczytałem wiele stron z podobną tematyką, próbowałem wielu różnych algorytmów, jednak nie udało mi się osiągnąć tego co chciałem.
Założenie:
Komunikacja aplikacji napisanej w visual c++ 2010 express z atmega16/32.
1. Wysyłka 5 liczb z komputera: (parametr1, parametr2, parametr3, parametr4,
parametr5) na atmegę.
Sprawa wydawałoby się prosta, jednak z opisu SerialPort class wynika, że można wysłać albo stringa, albo array'e char/byte (tych array'i do końca nie rozumiem).
Chciałem wysyłać te 5 liczb w odpowiedniej postaci char (dla ułatwienia niech będzie to pięć jedynek w rozumieniu dziesiętnym) na atmegę i na atmedze odbierać w odpowiednią tablicę charów z której potem odpowiednie elementy są wyciągane i dalszy algorytm je analizuje.
2. Odbiór danych z atmegi
Tutaj sprawa trochę prostsza. Odbieranymi danymi ma być temperatura z ds18b20 (typ danych float). Mam biblioteki znalezione dawno temu na tym forum, porównane z innymi znalezionymi w internecie więc jestem prawie pewien, że są poprawne (jednak prosiłbym o link do sprawdzonych bibliotek - może jednak gdzieś jest błąd którego nie zauważyłem). Problem polega na tym, że visual c++ 2010 nie może odbierać floatów lecz stringi, chary, byte'y i array'e byte/char.
W jaki sposób zmienić float na char na atmedze? Albo w jaki sposób odebrać float w visualu (może jednak się da pomimo tego co napisali w opisach)
Ustawienia SerialPort w visualu:
http://imageshack.us/photo/my-images/220/visualserial.jpg/
Kod wykonywany po wciśnięciu buttona:
1. atmega -> PortName = "COM" + Nr; (numer jest wartością bloku NumericUpDown)
Ta linijka kodu ustawia nazwę portu na taki jaki wybraliśmy blokiem.
2. atmega -> Open();
Otwarcie wybranego portu
3. char odebrane = atmega -> ReadChar();
Tutaj tworzona jest zmienna odebrane do której zapisywane są chary wysłane z atmegi
4. Blok1 -> Text = odebrane.ToString();
W polu tekstowym Blok1 wyświetlana jest zawartość zmiennej charowej odebrane w postaci stringa.
postać całkowita:
atmega -> PortName = "COM"+Nr;
atmega -> Open();
char odebrane = atmega -> ReadChar();
Blok1 -> Text = odebrane.ToString();
Wysyłki niestety nie mam zrobionej, ponieważ każdy sposób z listy http://msdn.microsoft.com/en-us/library/5109k29x.aspx nie działał prawidłowo.
Ustawienie USARTA na atmedze:
8bit, 1stop, parity:even, baud 9600, przerwanie od odbioru, włączenie odbioru, wysyłki
Funkcja wysyłająca wzięta z datasheeta:
void wysylka(char data)
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
Odbiór w przerwaniu najprostszy:
ISR(USART_RXC_vect)
{
odebrana = UDR; //tutaj też podejrzewam powinna być przeróbka ze stringa na tablice charów albo jakby odbiór był charów to można zrobić
odebrana2 = odebrana; // i dalej operować na poszczególnych elementach tablicy odebrana2
}
Proszę o pomoc w rozwiązaniu problemu, mianowicie:
1. W jaki sposób wysłać 5 liczb (pięć jedynek) na atmegę w postaci charów bądź jak string "11111" na atmedze odebrać jako tablice char=[1, 1, 1, 1, 1]
2. W jaki sposób przerobić float na tablice charów na atmedze bądź jak odebrać float w visual c++ 2010 (może się da pomimo informacji, że nie)
Proszę o zrozumienie początkującego i o jak najprostsze (jak krowie na granicy) wytłumaczenie co, jak, gdzie i po co.
Przeczytałem wiele stron z podobną tematyką, próbowałem wielu różnych algorytmów, jednak nie udało mi się osiągnąć tego co chciałem.
Założenie:
Komunikacja aplikacji napisanej w visual c++ 2010 express z atmega16/32.
1. Wysyłka 5 liczb z komputera: (parametr1, parametr2, parametr3, parametr4,
parametr5) na atmegę.
Sprawa wydawałoby się prosta, jednak z opisu SerialPort class wynika, że można wysłać albo stringa, albo array'e char/byte (tych array'i do końca nie rozumiem).
Chciałem wysyłać te 5 liczb w odpowiedniej postaci char (dla ułatwienia niech będzie to pięć jedynek w rozumieniu dziesiętnym) na atmegę i na atmedze odbierać w odpowiednią tablicę charów z której potem odpowiednie elementy są wyciągane i dalszy algorytm je analizuje.
2. Odbiór danych z atmegi
Tutaj sprawa trochę prostsza. Odbieranymi danymi ma być temperatura z ds18b20 (typ danych float). Mam biblioteki znalezione dawno temu na tym forum, porównane z innymi znalezionymi w internecie więc jestem prawie pewien, że są poprawne (jednak prosiłbym o link do sprawdzonych bibliotek - może jednak gdzieś jest błąd którego nie zauważyłem). Problem polega na tym, że visual c++ 2010 nie może odbierać floatów lecz stringi, chary, byte'y i array'e byte/char.
W jaki sposób zmienić float na char na atmedze? Albo w jaki sposób odebrać float w visualu (może jednak się da pomimo tego co napisali w opisach)
Ustawienia SerialPort w visualu:
http://imageshack.us/photo/my-images/220/visualserial.jpg/
Kod wykonywany po wciśnięciu buttona:
1. atmega -> PortName = "COM" + Nr; (numer jest wartością bloku NumericUpDown)
Ta linijka kodu ustawia nazwę portu na taki jaki wybraliśmy blokiem.
2. atmega -> Open();
Otwarcie wybranego portu
3. char odebrane = atmega -> ReadChar();
Tutaj tworzona jest zmienna odebrane do której zapisywane są chary wysłane z atmegi
4. Blok1 -> Text = odebrane.ToString();
W polu tekstowym Blok1 wyświetlana jest zawartość zmiennej charowej odebrane w postaci stringa.
postać całkowita:
atmega -> PortName = "COM"+Nr;
atmega -> Open();
char odebrane = atmega -> ReadChar();
Blok1 -> Text = odebrane.ToString();
Wysyłki niestety nie mam zrobionej, ponieważ każdy sposób z listy http://msdn.microsoft.com/en-us/library/5109k29x.aspx nie działał prawidłowo.
Ustawienie USARTA na atmedze:
8bit, 1stop, parity:even, baud 9600, przerwanie od odbioru, włączenie odbioru, wysyłki
Funkcja wysyłająca wzięta z datasheeta:
void wysylka(char data)
{
while ( !( UCSRA & (1<<UDRE)) );
UDR = data;
}
Odbiór w przerwaniu najprostszy:
ISR(USART_RXC_vect)
{
odebrana = UDR; //tutaj też podejrzewam powinna być przeróbka ze stringa na tablice charów albo jakby odbiór był charów to można zrobić
odebrana2 = odebrana; // i dalej operować na poszczególnych elementach tablicy odebrana2
}
Proszę o pomoc w rozwiązaniu problemu, mianowicie:
1. W jaki sposób wysłać 5 liczb (pięć jedynek) na atmegę w postaci charów bądź jak string "11111" na atmedze odebrać jako tablice char=[1, 1, 1, 1, 1]
2. W jaki sposób przerobić float na tablice charów na atmedze bądź jak odebrać float w visual c++ 2010 (może się da pomimo informacji, że nie)
Proszę o zrozumienie początkującego i o jak najprostsze (jak krowie na granicy) wytłumaczenie co, jak, gdzie i po co.