logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jak wysłać liczby z Visual C++ do Atmega16/32 przez Serial Port?

kduchno 13 Lut 2012 17:09 1930 4
REKLAMA
  • #1 10540234
    kduchno
    Poziom 2  
    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.
  • REKLAMA
  • #2 10540674
    tmf
    VIP Zasłużony dla elektroda
    Problem tu był wielokrotnie dyskutowany. Masz do wyboru - albo wysyłać wszystko w formacie tekstowym., po konwersji na stringi - IMHO preferowana metoda, albo przesyłać binarnie. Ta druga metoda wykorzystuje np. unie - możesz zrobić unie float i char. Zakłada jednak, że reprezentacja float na AVR jest taka sama jak na PC - niekoniecznie tak musi być. Co gorsza na PC większość typów jest inna niż na AVR (np. na 64-bitowej maszynie int ma 64 bity, a na AVR tylko 16). Transmisja danych binarnych wymaga więc większego wtajemniczenia od programisty.
    Do konwersji na stringi możesz wykorzystać funkcje typu itoa, atoi, albo parę sprintf/sscanf.
    BTW. Do przesyłania temperatury z DS wcale nie potrzebujesz float.
  • REKLAMA
  • #3 10540862
    sweter_007
    Poziom 14  
    Zakładam, że masz prawidłowo podłączony układ(np. echo działa) oraz odblokowany dostęp do portów com. Mniej więcej chyba o to chodzi. Kod PC z VisualStudio C#.
    Atmega8:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Pozdr.
  • REKLAMA
  • #4 10542969
    Konto nie istnieje
    Konto nie istnieje  
  • #5 10554564
    kduchno
    Poziom 2  
    Dziękuję za odpowiedzi. Niedokładnie o to mi chodziło, ale nakierowało mnie częściowo na pożądane rozwiązanie.
REKLAMA