Skocz do zawartości
rycho84

STM32F103C8Tx - komunikacja przez UART za pomocą przerwań

Pomocna odpowiedź

Witam,

piszę mały programik do komunikacji przez UART z pomocą przerwań, a że jestem początkujący to mam mały problem,

ogólnie wszystko działa, tylko po wywołaniu przerwania i odebraniu danych, program nie powraca już do pętli głównej, może mi ktoś podpowiedzieć gdzie zrobiłem błąd?

oto kod:

#include "main.h"
#include "string.h"
#include "stm32f1xx_hal.h"




/* Private variables ---------------------------------------------------------*/
UART_HandleTypeDef huart2;

/* USER CODE BEGIN PV */
uint8_t key[1];
volatile uint8_t stan = 0;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void Error_Handler(void);
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART2_UART_Init(void);
/* USER CODE BEGIN PFP */
void uart_write(UART_HandleTypeDef * handler, char * text) {
       HAL_UART_Transmit(handler, text, strlen(text), 1000);
}
void uart_write_line(UART_HandleTypeDef * handler, char * text) {
       HAL_UART_Transmit(handler, text, strlen(text), 1000);
       HAL_UART_Transmit(handler, "\r\n", 2, 1000);
}
uart_read_line(UART_HandleTypeDef * handler, char * buffer, uint16_t buffer_size) {
       HAL_StatusTypeDef status;
       char current_char;
       uint16_t char_counter = 0;

       while (char_counter < buffer_size - 1) {
             status = HAL_UART_Receive(handler, &current_char, 1, 1);
             if (status == HAL_OK) {
                    if (current_char == '\r' || current_char == '\n')
                           if (char_counter == 0) continue; else break;
                    *(buffer + char_counter++) = current_char;
             }
       }

       *(buffer + char_counter) = '\0';

}

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {

	char buffer[1024];
	      	  uart_read_line(&huart2, buffer, 1024);
	      	  uart_write(&huart2, "Odebrano: ");
	      	  uart_write_line(&huart2, buffer);
	      	  HAL_UART_Receive_IT(&huart2,key, 1);


}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
	SystemCoreClock = 8000000;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
  HAL_UART_Receive_IT(&huart2, key, 1);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
	  uart_write_line(&huart2, "jestem");
	  HAL_Delay(1000);

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

 

Udostępnij ten post


Link to post
Share on other sites

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ę »

×