STM32双串口接收数据

工程要求需要至少两个串口,一个串口用于接收传感器数据,另一个串口用于接收上位机或者遥控器发来的指令,本次开发的软件使用的是CubeMX和keil5的编译环境,使用的单片机是STM32F103RCT6,使用串口3接收传感器的数据,串口1接收上位机或者遥控器发来的指令,下面上CubeMX的配置图片:
在这里插入图片描述
图中开了三个串口,原本打算使用串口2接收数据,但是实验过程中发现串口2出现了问题,不能正常使用,所以使用串口3接收传感器数据
三个串口的配置如下:
在这里插入图片描述
在这里插入图片描述
这里三个串口的配置均相同,且中断优先级设置的均为默认优先级,时钟配置如下:
在这里插入图片描述
在这里插入图片描述
基础配置完成后,开始搬砖:
首先说一下在usart.c和usart.h中的代码:
usart.c
/**

  • @brief Retargets the C library printf function to the USART.
    */
    int fputc(int ch,FILE *f)
    {
    HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF);
    return ch;
    }
    //用于清除串口接收的数据
    void Usart1Receive_IDLE(UART_HandleTypeDef *huart)
    {
    uint32_t temp;

    if((__HAL_UART_GET_FLAG(huart,UART_FLAG_IDLE) != RESET))
    {
    __HAL_UART_CLEAR_IDLEFLAG(&huart1);
    HAL_UART_DMAStop(&huart1);
    temp = huart1.hdmarx->Instance->CNDTR;//
    UsartType.RX_Size = RX_LEN - temp;
    UsartType.RX_flag = 1;
    HAL_UART_Receive_DMA(&huart1,UsartType.RX_pData,RX_LEN);
    }
    }
    //DMA发送回调函数
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
    {
    __HAL_DMA_DISABLE(huart->hdmatx);
    if(huart == &huart1)
    UsartType.dmaSend_flag = USART_DMA_SENDOVER;
    }
    void Usart1SendData_DMA(UART_HandleTypeDef * huart,USART_RECEIVETYPE recivetype,uint8_t *pdata, uint16_t Length)
    {
    while(recivetype.dmaSend_flag == USART_DMA_SENDING);
    recivetype.dmaSend_flag = USART_DMA_SENDING;
    HAL_UART_Transmit_DMA(huart, pdata, Length);
    }
    usart.h
    #define RX_LEN 1024
    #define USART_DMA_SENDING 1//发送中标志位
    #define USART_DMA_SENDOVER 0//发送完成标志位

typedef struct
{
uint8_t RX_flag:1; //IDLE receive flag 接收中断清除标志位
uint16_t RX_Size; //receive length 接受数据长度
uint8_t RX_pData[RX_LEN]; //DMA receive buffer DMA接收数据通道
uint8_t dmaSend_flag:1;
}USART_RECEIVETYPE;

extern USART_RECEIVETYPE UsartType;

void Usart1SendData_DMA(UART_HandleTypeDef * huart,USART_RECEIVETYPE recivetype,uint8_t *pdata, uint16_t Length);
这里只对串口1进行配置,串口2可以用于发送
接下来为在stm32f1xx_it.c的配置:
在这里插入图片描述
在main.c中代码配置如下:
在这里插入图片描述
while(1)
{
在这里插入图片描述
}
经过上述配置之后,串口1即可完成接收上位机的数据并在串口助手上打印出来。
接下来介绍串口3的配置:这是串口3具体接收的传感器的数据,并读取的函数
在这里插入图片描述
实测通过OLED进行显示数据,通过串口打印助手可以与串口1进行发送与接收。

猜你喜欢

转载自blog.csdn.net/weixin_44080304/article/details/116892581