【蓝桥杯嵌入式备赛】其六:串口通信

主控板:STM32G431RBT6
板载下载器:DAPLINK
软件:STM32CubeMX、Keil MDK5

1、工程配置

  • UART1选择异步通信模式,根据要求设置比特率为9600并使能中断在这里插入图片描述

2、代码编写

  • interrupt.c:增加串口中断回调函数
    char rxdata[30];
    uint8_t rxdat;
    unsigned char  rx_pointer;
    
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *hurat){
      rxdata[rx_pointer++]=rxdat;
      HAL_UART_Receive_IT(&huart1,&rxdat,1);
    }
    
  • main.c:串口接收函数
    void uart_rx_proc(){
      if(rx_pointer>0){
      	if(rx_pointer==24){
      		sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time);	
      	}
      	else{
      		char temp[20];
      		sprintf(temp,"Error");
      		HAL_UART_Transmit(&huart1,(uint8_t*)temp,strlen(temp),50);
      	}
      	rx_pointer=0;
      	memset(rxdata,0,30);
      }
    }
    
  • main.c:在disp_proc()中增加一个界面
    		else if(view==2){
      		LCD_DisplayStringLine(Line1, (uint8_t *)"      Car_msg");
      		char text[30];
      		sprintf(text,"cartype=%s",car_type);
      		LCD_DisplayStringLine(Line3, (uint8_t *)text);
      		sprintf(text,"cardata=%s",car_data);
      		LCD_DisplayStringLine(Line4, (uint8_t *)text);
      		sprintf(text,"cartime=%s",car_time);
      		LCD_DisplayStringLine(Line5, (uint8_t *)text);
      	}
    
  • main.c:在key_change()中增加界面选择
    if(key[0].single_flag==1){
      	view++;
      	if(view==3)
      		view=0;
      	LCD_Clear(0x000000);
      	key[0].single_flag=0;
        //key[0].state=No_Press;
       }
    
  • main.c:变量和函数声明及初始化
    #include "string.h"
    
    extern char rxdata[30];
    extern uint8_t rxdat;
    extern unsigned char  rx_pointer;
    
    char car_type[5];
    char car_data[5];
    char car_time[13];
    
    void uart_rx_proc();
    int main(void)//增加部分
    {
    HAL_UART_Receive_IT(&huart1,&rxdat,1);
    
    while (1){
        key_change();
        disp_proc();
        if(rx_pointer!=0){
      	  int temp=rx_pointer;
      	  HAL_Delay(1);
      	  if(temp==rx_pointer)
      		  uart_rx_proc();	  
        }
    }
    

3、硬件实现

  • 通过串口向下位机发送正确信息,LCD屏也能显示出正确的信息:
    在这里插入图片描述
    在这里插入图片描述
  • 发送错误信息时LCD屏无数据显示,下位机会向上位机发送“Error”通过串口助手显示出来:
    在这里插入图片描述

4、问题和总结

  • HAL_UART_Transmit(&huart1,(uint8_t*)temp,strlen(temp),50);
    用于通过UART(通用异步收发器)接口向上位机发送数据,其中包括四个参数;

    • *UART_HandleTypeDef *huart *:UART接口配置信息;
    • *uint8_t pData:指向包含要传输数据的数据缓冲区的指针;
    • uint16_t Size:要传输的字节数;
    • uint32_t Timeout:以毫秒为单位的超时值,如果传输操作超过此时间函数将返回错误。
  • HAL_UART_Receive_IT(&huart1, rx_data, 1);
    用于在中断模式下接受一定量的数据,

    • Size:要接收的数据元素(u8或u16)数量,每次中断只能接收一个字符,因此该函数Size只能填1
    • 在main函数中在进入while循环前需要调用该函数。
  • 本工程中是通过串口收发固定长度的数据,是因为题目要求中收发的数据都是固定格式与固定长度,如果单片机需要接收不定长度的数据可以考虑设置标志位或定时器来判断数据是否完成发送;另一方面工程中只实现了接收一个数据,但一般题目中会要求接收一组数据,此时可以应用结构体实现功能。

参考资料
(1)B站学习视频:【备战2024蓝桥杯 嵌入式组】CT117E-M4 新款开发板 3小时省赛模块 速成总结
(2)STM32实现串口不定长数据接收(HAL库版–方法2)
(3)HAL库+CubeMX 串口发送和中断接收字符串
(4)STM32 非阻塞HAL_UART_Receive_IT解析与实际应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值