Skocz do zawartości

Przesyłanie zmiennych typu float przez UART


Pomocna odpowiedź

Napisano

Witam !

Zrealizowałem komunikacje bezprzewodową miedzy stm32 (slave), a komputer(master) w oparciu o moduły HC05 HC06 i konwerter usb-uart.

Jak w temacie w jaki sposób mógłbym przesyłać zmienne typy float przez uart ? Zmienna float jest 4 bajtowa, czy mógłbym wysyłać daną paczkami bajt po bajcie ? Docelowo po stronie pc będzie aplikacja GUI pisana w c#, gdzie zmienna float będzie wyświetlana w jakimś polu tekstowym. Szukam różnych materiałów w necie, konwersje standardy itp ale mam mętlik w głowie. Mógłby mi ktoś coś zasugerować, z góry dzięki!!!

Możesz wysłać poszczególne bajty swojej zmiennej typu float. Najłatwiej jest chyba zdefiniować sobie unię floata i tablicy bajtów i w ten sposób się dobierać do poszczególnych bajtów (poczytaj sobie o union w C). Oczywiście po drugiej stronie będziesz musiał to sobie poskładać do kupy — nie wiem, czy C# obsługuje podobne operacje, w najgorszym razie będziesz musiał to sobie policzyć sam.

Najłatwiej jest chyba zdefiniować sobie unię floata

W C najłatwiej zdefiniować wskaźnik na zmienna 8 bitową i ustawić go na adres tego floata albo tablicy floatów i po prostu inkrementować. W C# chyba tak łatwo sie nie da, ale do zrobienia.

Do tego warto byłoby zadbać o jakiś nagłówek żeby wiedzieć kiedy rozpoczyna sie transfer.

Przesyłanie danych binarnych bywa czasem problematyczne. Jak chodzi o typ float większość języków programowania stosuje się do standardów IEEE, więc brutalna metoda przesyłania float-a jako bajtów może zadziałać. Oczywiście pozostaje problem kolejności bajtów w słowie, ale w przypadku ARM i x86_64 chyba też mamy szczęście i przypadkiem zadziała.

Jeśli to ma być konkretny i jedyny w swoim rodzaju sposób transmisji - wiadomo jaki język/kompilator, jaki porcesor itd można to tak zrobić.

Ale jeśli chodzi o coś bardziej uniwersalnego, niezawodnego i niezależnego od platformy, przesyłanie floatów jako danych binarnych nie najlepiej się sprawdza. Jeżeli nie zależy Ci na dużej optymalizacji ilości danych, to proponuję stary sprawdzony format tekstowy - przesyłasz float-a jako liczbę tekstową. Łatwo jest debuggować, a ew. Zmiana reprezentacji, a nawet użycie typu double nic nie zmieni. Dodatkowo problemy z samym przesyłem (np. Konwersja \n na \r\n) nie mają wpływu na działanie programu.

  • 3 tygodnie później...

Zaimplementuj sobie protokół Modbus RTU i masz po problemie. Nie dość że zestandaryzowane rozwiązanie, to jeszcze przemysłowe i kompatybilne z wieloma gotowymi układami. Obsługuje Floaty, i praktycznie wszystkie standardowe formaty.

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...