Skocz do zawartości

Kurs STM32 - #5 - Komunikacja z komputerem, UART


Pomocna odpowiedź

Witam serdecznie wszystkich użytkowników 🙂 Mam problem z zadaniem 5.2 , mianowicie nie wiem w którym miejscu kodu powinienem odczytywać kilka znaków a nie jeden. Wydaje mi się ,że powinienem coś zmienić tutaj :

 

 while(1)
    {

  	  if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)) // ten fragment kodu
  	  {                                           // sprawdza czy w buforze
  		  char c = USART_ReceiveData(USART2);    // jest cokolwiek, analogiczna sytuacaj do tej gdzie
  		  switch(c)                              // funckcja nie dopuszcza doprzepelnienia rejestru
  		  {

reszta kodu wygląda identycznie jak w kursie ,ale i tak go wstawię 🙂

#include "stm32f10x.h"

void send_char(char c)
{
	while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
	USART_SendData(USART2, c);
}

void send_string(const char* s)
{
	while (*s)
		send_char(*s++);
}

int main(void)
{
	GPIO_InitTypeDef gpio;
	USART_InitTypeDef uart;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

	GPIO_StructInit(&gpio);
	gpio.GPIO_Pin = GPIO_Pin_2;
	gpio.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_Init(GPIOA, &gpio);

	gpio.GPIO_Pin = GPIO_Pin_3;
	gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_Init(GPIOA, &gpio);

	USART_StructInit(&uart);
	uart.USART_BaudRate = 115200;
	USART_Init(USART2, &uart);

	USART_Cmd(USART2, ENABLE);

	while (1) {
		if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE)) {
		    char c = USART_ReceiveData(USART2);
		    switch (c)
		    {
		        case 'a':
		            send_string("Odebrano komunikat A!\r\n");
		            break;
		        case 'b':
		            send_string("Odebrano komunikat B!\r\n");
		            break;
		        default:
		            send_string("Nieznany komunikat:(\r\n");
		            break;
		    }
		}

	}
}

Jeśli ktoś ma jakiś pomysł będę wdzięczny za pomoc

  • 2 lat(a) później...

Mam pytanie odnośnie baud rate w transmisji asynchronicznej, na które nie znalazłem dotychczas odpowiedzi a które nie daje mi spokoju.

Skąd urządzenie odbiorcze zna baud rate, z jakim powinien się komunikować? Czy np. czujniki i inne peryferia mają ustaloną przez producenta, sztywną wartość którą należy skonfigurować na MCU czy może przed rozpoczęciem transmisji kontroler informuje adresata, z jaką prędkością będzie nadawał?

W przypadku Arduinowego monitora transmisji szeregowej ręcznie wybieramy z jakim baud ratem mają być odczytywane dane ale jak to wygląda w przypadku zwykłych urządzeń peryferyjnych? 

Jeżeli pytanie jest głupie to przepraszam 😅

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...