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

[Rozwiązano] Atitny1614 - dekodowanie ramki usart z string hex na int, printf - zmienne

kamil12239 14 Lut 2020 20:14 456 3
REKLAMA
  • #1 18471199
    kamil12239
    Poziom 17  
    Szanowni Państwo,
    Mam pewien problem z dekodowaniem zmiennych w ramce usart po string hex. Procesor Attiny1614 połączony z modułem bluetooth po TTL. Zaznaczam że ze zwykłymi stringami nie mam problemu tylko jak mam przekonwertować z string hex na int i odesłać. Procek wysyła proste rozkazy np: włącz, wyłącz, włącz na określoną moc, włącz na określoną moc na określony czas. Ramka po string wygląda tak (z modulu bluetooth na uC): +UUBTGRW:0,32,0503010203,1
    Przykład powyżej mówi że włączam na moc 1 (8bit), na 2 min i 3 sek. Poniżej fragment kodu odpowiedzialny za odbior tej ramki i odesłanie potwierdzenia.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Poniżej jak to wygląda w praktyce. Zamiast modułu BLE jest teraz podłączony pod zwykły konwerter USB->RS232.
    Atitny1614 - dekodowanie ramki usart z string hex na int, printf - zmienne
    Końcówka powinna być taka sama ale dlaczego nie jest. Jesli mam komende z jedną zmienną no to wszystko jest ok np ustaw moc +UUBTGRW:0,32,0501FE,1 dostaję normalnie AT+UBTGSN=0,25,06FE gdzie FE to zdekodowana wartość mocy z string hex na int i z int z powrotem na hex string.

    Anomalie też są jeśli chce przesłać czas włączenia urządzenia w formacie hh;mm;ss
    W takim przypadku wyswietla mi w miejscu sekund minuty w miejscu minut zera a godziny poprawnie. Poniżej kod:
    W przerwaniu funkcja printf
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Jak zrobię tak to działa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Zmienne godziny, minuty, sekundy są zmiennymi globalnymi maja volatile. Tak samo jest jak chcę przesłać dane o czasie w innych miejscach w przerwaniu np w petli głownej. Dlaczego tak jest?

    Z wyrazami szacunku K
  • REKLAMA
  • REKLAMA
  • Pomocny post
    #3 18471306
    trol.six
    Poziom 31  
    Funkcja hextoul przyjmuje stringi które powinny być zakończone zerem. A u ciebie wartosc1 ma tylko dwa bajty na wartość.

    kamil12239 napisał:
    Anomalie też są jeśli chce przesłać czas włączenia urządzenia w formacie hh;mm;ss

    Może ramu za mało.

    Na dodatek, jeśli wysyłasz w funkcji main oraz przerwaniu, to jeśli funkcja wysyłająca nie jest atomowa, to będziesz miał sieczke w danych.
  • #4 18471325
    kamil12239
    Poziom 17  
    trol.six napisał:
    Funkcja hextoul przyjmuje stringi które powinny być zakończone zerem. A u ciebie wartosc1 ma tylko dwa bajty na wartość.
    JarekC napisał:
    Tablice wartosc1,wartosc2,wartosc3 są zbyt małe muszą mieć po 3 elementy.

    Dziekuję Panowie to jest trafna uwaga po dopisaniu zera na koniec wszystko działa prawidłowo.
    Z tą funkcją printf to wczesniej w kodzie wysyłam po 5 zmiennych i nnormalnie wszystko gra.
REKLAMA