Skocz do zawartości

Kurs STM32 F4 - #7 - Komunikacja przez UART


Pomocna odpowiedź

Z moich uwag, poza tym, co wcześniej opisał Elvis odnośnie końca linii i buforowania, to dorzuciłbym problematyczne działanie przykładu z 10 znakami w buforze. Na moim kompie RealTerm wyrzucał krzaczki na końcu stringa (w sensie 10 znaków normalnie i potem jakieś randomy). Wydaje mi się, że wynikało to z faktu braku zamknięcia tablicy znakiem '\0' (10-znakowy bufor i 10 znaków zapisanych). Jak uzupełniłem ten znak na dodanym przeze mnie 11. miejscu problem zniknął i wypisywanie odbywało się normalnie.

Edytowano przez PrimeSoul
  • Lubię! 1
Link do komentarza
Share on other sites

@PrimeSoul dzięki za sygnał. Na pewno będziemy za jakiś czas aktualizować ten kurs, aby wstawić zrzuty z aktualnych wersji Cube i poprawić część tematów merytorycznie. Będę dawał znać na forum, gdy kurs będzie już zaktualizowany 🙂

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/
uint8_t Received[10];
/* USER CODE END PV */

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

	uint8_t Data[40]; // Tablica przechowujaca wysylana wiadomosc.
	uint16_t size = 0; // Rozmiar wysylanej wiadomosci

	size = sprintf(Data, "Odebrana wiadomosc: %s\n\r",Received);

	HAL_UART_Transmit_IT(&huart1, Data, size); // Rozpoczecie nadawania danych z wykorzystaniem przerwan
	HAL_UART_Receive_IT(&huart1, Received, 10); // Ponowne włączenie nasłuchiwania
	HAL_GPIO_TogglePin(LED_BLUE_GPIO_Port, LED_BLUE_Pin);
}
/* USER CODE END PFP */

/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1, Received, 10);
/* USER CODE END 2 */

Kod jest taki jak w kursie o stm32 f4. Ja chciałbym, żeby mi każde słowo się wyświetlało w Real Term, nie tylko o długości 10 znaków, ale także po 8 znaków czy 6 znaków. Reasumując, chciałbym o dowolnej ilości znaków słowo wysłane przez UART, zobaczyć w terminalu. Piszę słowo "pies" chciałbym zobaczyć to słowo, później napisze np. "dzwoneczek" też chciałbym aby to słowo się pojawiło w terminalu.

Link do komentarza
Share on other sites

Mam problem z wyświetlaniem wiadomości. Raz, że niektóre znaki nie działają, a dwa, że po dziesiątej wiadomości jakby dodatkowo \r \n przestawało działać i nowe komunikaty wyświetlają się po sobie. Baud się zgadza z konfiguracją, port również, kwarc ustawiony zgodnie z prawdą na 8MHz, wyświetlanie Ansi, program uruchamiany jako administrator.

2021-03-13_171201.png

Link do komentarza
Share on other sites

Dnia 13.03.2021 o 17:28, Repti napisał:

Mam problem z wyświetlaniem wiadomości. Raz, że niektóre znaki nie działają, a dwa, że po dziesiątej wiadomości jakby dodatkowo \r \n przestawało działać i nowe komunikaty wyświetlają się po sobie. Baud się zgadza z konfiguracją, port również, kwarc ustawiony zgodnie z prawdą na 8MHz, wyświetlanie Ansi, program uruchamiany jako administrator.

2021-03-13_171201.png

Mialem identyczny problem, zmiana typu tablicy data na uint16_t pomogla.

Link do komentarza
Share on other sites

Cześć!

Kurs jest bardzo fajny i już wiele się nauczyłem. Jednak zauważyłem, że część rzeczy się "przeterminowała" i już nie działa od strzała tylko trzeba coś modyfikować. Korzystam z zestawu przeznaczonego pod ten kurs.

Staram się by mój ARM odsyłał do PC odpowiedzi "STOP" i "START", ale mi nie wychodzi. Być może ktoś z was miał podobnie.

Występują ostrzeżenia, że jest: sprintf(char *str, const char *str,...) oraz HAL_UART_Transmit_IT (..., uint8_t *, uint16_t). Można zadeklarować: char data[50] zamiast uint8_t data[50] i wtedy pasuje w sprintf() [nie ma ostrzeżenia], oraz użyć (uint8_t*) w HAL_UART_Transmit_IT.

Udało mi się wyeliminować ostrzeżenia (było 7 czy 8), błędów nie było. Niemniej program nie działa tak jak oczekuję. W RealTerm wyświetlają się przedziwne znaczki.

image.thumb.png.ee290f36019da18d9c0b1048d6724035.png

UPDATE_01: Za każdym razem po włączeniu RealTerm należy przestawić wybrany ostatnio port COM na inny i z powrotem wybrać ten z ProfilicSerial, oraz rozłączyć się i połączyć na nowo przyciskiem "Open". To okazało się być przyczyną dziwnych znaczków.

UPDATE_02: Obecnie program działa już niemal w 100%. Przesyła "START", "STOP" i wypisuje jaka cyfra została wysłana inna niż 0 czy 1. Niemniej dla literek wyskakuje zawsze "STOP". To za pewne efekt atoi(). Używam własnej funkcji wait(), ponieważ poza main() HAL_DELAY() zatrzymuje program na dobre.

Mój kod wygląda następująco:

/* USER CODE BEGIN PFP */
	void wait(int ticks){
		for (int i = 0; i <= ticks*1000000; i++){
			i=i;
		}
	}

	void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){

			char data[50];
			uint16_t size = 0;

			switch (atoi((char*)&received)){

			case 0:
				size = sprintf(data, "STOP\r\n");
				HAL_GPIO_TogglePin(GPIOD, blue_led_Pin);
				wait(2);
				HAL_GPIO_TogglePin(GPIOD, blue_led_Pin);
				break;

			case 1:
				size = sprintf(data, "START\r\n");
				HAL_GPIO_TogglePin(GPIOD, blue_led_Pin);
				wait(2);
				HAL_GPIO_TogglePin(GPIOD, blue_led_Pin);
				break;

			default:
				size = sprintf(data, "UNKNOWN SIGN RECEIVED %d\r\n", atoi((char*)&received));
				break;

			}

			HAL_UART_Transmit_IT(&huart1, (uint8_t*) data, size);
			HAL_UART_Receive_IT(&huart1, &received, 1);
		}

/* USER CODE END PFP */
/* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart1, &received, 1);
  /* USER CODE END 2 */

 

Edytowano przez okaluka
Update problemu #004
Link do komentarza
Share on other sites

Cześć!

Okazuje się, że uruchomienie DMA, samo skonfigurowanie go do działania, powoduje, że program się nie zgrywa na ARM.
Korzystam z Cube32mxIde 1.8.0 i próbowałem na wszystkich wersjach, aż do 1.0.0....

Mieliście może podobny problem?

Z góry dzięki za pomoc.

Link do komentarza
Share on other sites

Hej, 

Dziękuję za zainteresowanie tematem.
Program jest "pusty" tj. nie ma innego kodu poza tym, który jest generowany przez samego Cube32mxIDE. W tym konfiguracja DMA.
Kiedy nie konfiguruję DMA (jakiegokolwiek, np ADC) program zgrywa się na płytkę, a kiedy konfiguruję DMA to się nie zgrywa.
Wygląda to jak gdyby sama konfiguracja DMA powodowała jakiś problem. Poza tym mogę powiedzieć, że nie zmieniam żadnych dodatkowych opcji, nie buszuję w ustawieniach i innych co mogłoby spowodować problem. Dodam, że jestem już na 8 części kursu i wykonałem z powodzeniem wszystkie ćwiczenia i zadania "domowe", tylko DMA się nie udało.
W innych niż 1.8.0 wersjach jest po prostu informacja "Connection lost". W wersji 1.8.0 jak na screenie poniżej:
image.thumb.png.1e05f762b903bfefebf0462a27d6b314.png

Link do komentarza
Share on other sites

36 minut temu, okaluka napisał:

Hej, 

Dziękuję za zainteresowanie tematem.
Program jest "pusty" tj. nie ma innego kodu poza tym, który jest generowany przez samego Cube32mxIDE. W tym konfiguracja DMA.
Kiedy nie konfiguruję DMA (jakiegokolwiek, np ADC) program zgrywa się na płytkę, a kiedy konfiguruję DMA to się nie zgrywa.
Wygląda to jak gdyby sama konfiguracja DMA powodowała jakiś problem. Poza tym mogę powiedzieć, że nie zmieniam żadnych dodatkowych opcji, nie buszuję w ustawieniach i innych co mogłoby spowodować problem. Dodam, że jestem już na 8 części kursu i wykonałem z powodzeniem wszystkie ćwiczenia i zadania "domowe", tylko DMA się nie udało.                                                                                                                                                    
 

Cześć,

a próbowałeś może "wgrać" program na płytkę za pomocą programu "ST-LINK"? Ja też kiedyś miałem taką podobną systuację, że debugger ni nie startował, po wgraniu programu osobno za pomocą "ST-LINK" wszstko zaczęło działąć poprawnie. Poza tym wydaje mi się, że po przejściu na UART za pomocą DMA powinieneś zmienić wywołania funkcji  HAL_UART_Transmit_IT na HAL_UART_Transmit_DMA (z funkcjami do odbioru podobnie).

Zobacz też ten link:

https://community.st.com/s/question/0D50X00009XkfcUSAR/haluarttransmitdma-issues

może być pomocny.

Pozdrawiam

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dnia 10.02.2022 o 13:08, FlyingDutch napisał:

a próbowałeś może "wgrać" program na płytkę za pomocą programu "ST-LINK"? Ja też kiedyś miałem taką podobną systuację, że debugger ni nie startował, po wgraniu programu osobno za pomocą "ST-LINK" wszstko zaczęło działąć poprawnie. Poza tym wydaje mi się, że po przejściu na UART za pomocą DMA powinieneś zmienić wywołania funkcji  HAL_UART_Transmit_IT na HAL_UART_Transmit_DMA (z funkcjami do odbioru podobnie).

Tak, próbowałem. Być może zrobiłem przy tym jakiś błąd, kto wie. Aczkolwiek zbudowałem .hex także innego programu, takiego, który działał żeby sprawdzić sam proces, i program zadziałał. Przy DMA się co prawda zgrywał, ale nie działał. Muszę to przetestować jeszcze raz...

Dnia 10.02.2022 o 11:29, Gieneq napisał:

kurs był pisany na wersji 1.6.x i przykład ten działał, sam testowałem. Pokaż jaki masz błąd. czy masz ten sam układ co w kursie?

Jeśli w moim przypadku zgranie projektu wersją 1.6.0 się nie udało to myślę, że może być temu winien firmware ST-Link'a... Niestety nie mam innego programatora, żeby sprawdzić czy tak właśnie jest. Pozostaje poczekać na update FW...

Link do komentarza
Share on other sites

2 minuty temu, okaluka napisał:

Tak, próbowałem. Być może zrobiłem przy tym jakiś błąd, kto wie. Aczkolwiek zbudowałem .hex także innego programu, takiego, który działał żeby sprawdzić sam proces, i program zadziałał. Przy DMA się co prawda zgrywał, ale nie działał. Muszę to przetestować jeszcze raz...

Jeśli w moim przypadku zgranie projektu wersją 1.6.0 się nie udało to myślę, że może być temu winien firmware ST-Link'a... Niestety nie mam innego programatora, żeby sprawdzić czy tak właśnie jest. Pozostaje poczekać na update FW...

Cześć,

update firmware programatora możesz zrobić on-line za pomocą aplikacji ST_LINK. Spróbuj obniżyć zegar programatora w opcjach ST_LINK'a to czasami pomaga.

Pozdrawiam

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dnia 12.02.2022 o 08:07, FlyingDutch napisał:

Cześć,

update firmware programatora możesz zrobić on-line za pomocą aplikacji ST_LINK. Spróbuj obniżyć zegar programatora w opcjach ST_LINK'a to czasami pomaga.

Cześć, kiedy włączyłem ST-Link dostałem komunikat o możliwym update'cie, ale do innej, trochę starszej wersji firmware'u i to rozwiązało problem. Programy z zainicjalizowanym DMA zgrywają się i działają bez zarzutu.
Mogę dodać, że wersja Cube32IDE 1.8.0 błędnie generuje inicjalizację DMA na końcu całej inicjalizacji, a powinna zaraz za GPIO, a po niej inicjalizowana powinno być cała reszta. Należy to zmienić w w zaawansowanych opcjach menedżera niebieskimi strzałkami w prawym górnym rogu zaraz nad tabelą i dopiero generować program.

image.thumb.png.bc8a9edecf1c9d957be806318e45d902.png

Dziękuję za wskazówki! 🙂

UPDATE: Chyba za wcześnie się pochwaliłem. W przypadku peryferiów TIM i ADC z DMA nie ma problemu, ale w przypadku UART dalej jest.
Na razie to zostawiam z powodu braku czasu. Jakby Wam przyszło coś jeszcze do głowy to dajcie znać 😉

 

Edytowano przez okaluka
  • Lubię! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.