Dodatkowe materiały:

  • komunikacja UART STM32 – link
  • informacje o Modbus ASCII – link
  • informacje o Modbus ASCII [2] – link

Zadanie 1 – 3

Utworzyć sekcje krytyczną na dostępie do komunikacji UART.

  • stworzyć kolejkę na 100 elementów, znaki odebrane z terminala,
  • utworzyć  wątek, który odbiera znaki z terminala i dodaje je do kolejki, wykorzystać funkcję “HAL_UART_Receive()” z czasem “timeout” ustawionym na 50,
  • drugi wątek odbiera informacje z kolejki jeśli ich ilość osiągnie 5 i wyświetla na terminalu,
  • wątki korzystają z bezpiecznego dostępu do portu UART.

Czy wszystkie dane są odbierane na czas, czy są jakieś gubione, dlaczego?

Zadanie 2 – 3,5

Zmodyfikować odbieranie danych z uart, tak aby wykorzystać mechanizm przerwań “HAL_UART_Receive_IT() “.

Dodawanie do kolejki znaków z przerwania wymaga zastosowania funkcji z końcówką “ISR”.

Czy dalej dochodzi do utraty informacji?

 

 

Zadanie 3 – 5

Zaimplementować prosty protokół danych podobny do Modbus ASCII.

Zaimplementować ramkę danych w formacie ASCII. Ramka musi mieć wszystkie pola zgodne z ramką Modbus ASCII (początek adres, kod funkcji, dane, suma kontrolna, znaki końca ramki).

jako adres urządzenia przyjąć wartość 15, jako sumę kontrolną przyjąć wartość “00”.

Należy zrobić kilka przykładowych ramek zgodnych z formatem (zapisać w notatniku), ramki należy wysyłać przez terminal, a program powinien wykonywać zawarte w nich funkcje.

Zaimplementować następujące funkcje:

  • kod funkcji: “10”, dane: 1 – dioda LED włączona, 2- dioda LED wyłączona,
  • kod funkcji: “20”, dane: czas włączenia LED, czas wyłączenia diody LED w ms – dioda LED miga zgodnie z zadanymi parametrami,
  • Kod funkcji: “30”, dane: imię jednej osoby z grupy. Program wyświetla na terminalu komunikat: “Hej Paweł” – gdzie Paweł to podstawione imię z ramki. Program umożliwia podanie różnych długości imion.