STM32: функция HAL_UART_Transmit_IT не печатает значение - PullRequest
0 голосов
/ 03 апреля 2020

в начале, я относительно новичок в мире программирования микроконтроллеров

У меня проблема с HAL_UART_Transmit_IT, вызываемым в другой функции обратного вызова (HAL_UART_RxCpltCallback). Я хочу написать простую программу, которая будет считывать информацию из UART, а затем записывать ее в неизмененном виде (эхо). Функция в "режиме опроса" - HAL_UART_Transmit () - работает хорошо, но я хочу использовать все функции для прерываний.

#include "stm32f3xx_hal.h"
#include "stm32f303xe.h"
#include "main.h"
#include <string.h>

void SystemClockConfig(void);
void UART2_Init(void);
void Error_handler (void);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);

UART_HandleTypeDef huart2;

char *myUserData = "*** Communication Starts ***\n\r";
uint8_t data_buffer[100];
uint32_t count = 0;
uint8_t rcvd_data;

int main (void)
{
    HAL_Init();
    SystemClockConfig();
    UART2_Init();

    if(HAL_UART_Transmit(&huart2, (uint8_t*)myUserData, strlen(myUserData), HAL_MAX_DELAY) != HAL_OK)
    {
        Error_handler();
    }

    HAL_UART_Receive_IT(&huart2, &rcvd_data,1); // receive message from UART
    while(1)
    {
        // it works ok
        HAL_UART_Transmit_IT(&huart2, (uint8_t*)myUserData, strlen(myUserData));
        HAL_Delay(5000);
    }

    return 0;
}

void UART2_Init(void)
{
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 115200 ;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    if (HAL_UART_Init(&huart2) != HAL_OK)
    {
        Error_handler();
    }
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(rcvd_data == '\r')
    {
        data_buffer[count++]='\r';
        HAL_UART_Transmit_IT(huart, data_buffer, count); // here is a problem. HAL_UART_TRANSMIT() works ok
            // clear array for next incoming message.
            // whether it is the right place for such an operation?
            for (int i=0; i<sizeof(data_buffer);++i)
            {
                data_buffer[i] = 0;
            }

    } else {
    data_buffer[count++] = rcvd_data;
    }
    HAL_UART_Receive_IT(&huart2, &rcvd_data,1); // receive next byte

}

void SystemClockConfig(void)
{
// Do Nothing
}

void Error_handler (void)
{
    while(1);
}

Более того, я хотел бы спросить вас, является ли очистка массива в функции обратного вызова хорошим решением или она должна решаться иначе?

...