学习笔记(五):基于STM32CubeMX的串口通信项目(IT篇)

前瞻步骤:1配置SYS调试接口(SWD)和时钟源(SysTick)、2配置RCC 的High Speed Clock (HSE)(Crystal/Ceramic Resonator)和3配置时钟树(Clock Configuration),注:详细看学习笔记(二)

步骤4、配置串口模式为异步通信模式。

        首先功能类型(categories)中选择通信功能(connectivity);

        其次在通信功能(connectivity)中选择串口1(USART1);

        最后在通信模式中选择异步通信(asynchronous)。

 图1: 配置异步通信模式

步骤5、配置串口1(USART1)基础参数 。

        在配置(configuration)界面中选择参数设置(Parameter Settings)界面,因为参数需要根据通信的模块或者调试软件进行对应修改,此项目是与电脑调试软件进行通信,所以使用参数为默认参数。

  1. Baud Rate(波特率):使用默认波特率(115200);
  2. Word Length(字节长度):基本都是8位其中包含了奇偶校验位,即8 Bits (including Parity);
  3. Parity(奇偶校验):使用默认的无奇偶校验位(None);
  4. Stop Bits(停止位):使用默认的1位停止位(1)。

 图2: 配置串口1基础参数

步骤6、配置NVIC设置

   在配置(configuration)界面中选择嵌套向量中断控制器设置(NVIC Settings)界面,并且对USART1的中断进行全中断使能,优先级设置为0即最高(默认即可)。

图3: 配置NVIC设置

步骤7、配置project manager,配置完成后点击GENERATE CODE就可以生成此项目,(详细看学习笔记(二))。

步骤8、定义缓冲区大小、结束符和延申缓冲区使用范围。

        在usart.h文件下进行定义缓冲区大小、结束符和延申缓冲区使用范围。

  • //定义缓冲区大小

        #define RX_BUFFER_SIZE 256

  • //定义结束符

        #define END_CHAR '\n'

  • //延申缓冲区使用范围

        extern uint8_t rx_buffer[RX_BUFFER_SIZE];

 图4: 定义缓冲区大小、结束符和缓冲区使用范围延申

步骤9、 在usart.c中定义缓冲区、索引

  • //定义接收缓冲区

        uint8_t rx_buffer[RX_BUFFER_SIZE];

  • //定义接收索引

        uint8_t rx_index=0;

图5: 定义缓冲区和索引

步骤10、在usart.c文件中重写串口发送完成的回调函数 

        在此项目中发送完成回调函数主要的作用是进行串口读取的触发

        void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
            if(huart->Instance==USART1){
                //当串口发送完成后触发串口读取一位字节到缓冲区中
                HAL_UART_Receive_IT(&huart1,rx_buffer,1);
            }
        } 

 图6: 重写发送完成回调函数

步骤11、在usart.c文件中重写串口读取完成的回调函数 

  在此项目中读取完成回调函数主要的作用是进行判断读取到的数据是否为一个包(这里以\n作为包的结束标志)和将缓冲区回发给上位机。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
    if(huart->Instance==USART1){
        //接收到的字符为换行符
        if(rx_buffer[rx_index]==END_CHAR){
            //添加换行符到缓冲区
            rx_buffer[rx_index++]=END_CHAR;
            //回发缓冲区数据到上位机
            HAL_UART_Transmit_IT(&huart1,rx_buffer,rx_index);
            //重置接收索引
            rx_index=0;
        }
        //不然继续进行读取数据到缓冲区
        else{
            if(rx_index<RX_BUFFER_SIZE-1){
                //接收索引下移
                rx_index++;
                //读取数据到缓冲区
                HAL_UART_Receive_IT(&huart1,&rx_buffer[rx_index],1);
            }
            else
                //重置接收索引
                rx_index=0;
        }
    }
}  

图7: 重写读取完成回调函数

步骤12、在main.c文件的主函数中,以中断方式读取一次串口数据,从而触发读取完成回调函数。

  •     //以中断方式进行读取数据

            HAL_UART_Receive_IT(&huart1,rx_buffer,1);

图8: 中断方式读取一次数据

步骤13、视频效果

USART_IT读取不定长度数据效果视频

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值