串口通信 (HAL)

一、扫描模式

UART:通用异步收发器

USART:通用同步/异步收发器,其可选使用异步方式,那将和UART无区别,如果是同步,则需要多一根时钟线(USART_CK)

CubMAX配置介绍:

 

模式选择:

Asynchronous  异步通信

Synchronous  同步通信

Single Wire (Half-Duplex) 单线/半双工

Multiprocessor Communication 多处理器

支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC规范。

 基础参数:波特率为9600Bits/s,传输数据长度为8 Bit,奇偶检验无,停止位1 

HAL库函数

串口发送函数:

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

功能:串口发送指定长度的数据。如果超时没发送完成,则不再发送,返回超时标志(HAL_TIMEOUT)。

参数

  • UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
  • *pData 需要发送的数据
  • Size 发送的字节数
  • Timeout 最大发送时间,发送数据超过该时间退出发送

串口接收函数:

 HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);

功能:串口接受指定长度的数据。如果超时没接受完成,则不再接受,返回超时标志(HAL_TIMEOUT)。

参数

  • UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
  • *pData 需要接受的数据
  • Size 发送的字节数
  • Timeout 最大接受时间,接受数据超过该时间退出接受

代码

全局:

char RxBuffer[100];   //接收数据
char TxBuffer[100] = {0x50}; //发送数据

main:

 HAL_UART_Transmit(&huart3,(uint8_t *)TxBuffer,1,0xffff);

while:

      HAL_UART_Receive(&huart3,(uint8_t *)RxBuffer,3,0xffff);// 接收3个字符
      if(RxBuffer[0] != 0)
      {
          HAL_UART_Transmit(&huart3,(uint8_t *)RxBuffer,3,0xffff);// 发送3个字符
          memset(RxBuffer,0,sizeof(RxBuffer));                
      }
memset函数需要在添加#include "string.h"

串口助手演示效果:

 符合预计效果

二、中断模式

CubMAX配置介绍:

Preemption Priorit:抢占优先级

Sub Priority :子优先级

数字越小优先级越高

自动生成的代码中已经使能了中断

 函数

中断接收数据:

HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

功能:串口中断接收,以中断方式接收指定长度数据。
大致过程是,设置数据存放位置,接收数据长度,然后使能串口接收中断。接收到数据时,会触发串口中断。
再然后,串口中断函数处理,直到接收到指定长度数据,而后关闭中断,进入中断接收回调函数,不再触发接收中断。(只触发一次中断)

参数:

  • UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1
  • *pData 接收到的数据存放地址
  • Size 接收的字节数

中断接收回调函数:

HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);  

功能:HAL库的中断进行完之后,并不会直接退出,而是会进入中断回调函数中,用户可以在其中设置代码,

串口中断接收完成之后,会进入该函数,该函数为空函数,用户需自行修改,

参数:

UART_HandleTypeDef *huart UATR的别名 如 : UART_HandleTypeDef huart1; 别名就是huart1

 代码:

全局:

char RxBuffer[100];   //接收数据

 main:

  /* USER CODE BEGIN 2 */
     HAL_UART_Receive_IT(&huart3,(uint8_t *)RxBuffer,1);//开启串口接受中断  
  /* USER CODE END 2 */

 全局:

复制代码
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART3)//判断串口号
    {
        HAL_UART_Transmit(&huart3,(uint8_t *)RxBuffer,1,0xffff);
        
        HAL_UART_Receive_IT(&huart3,(uint8_t *)RxBuffer,1);//再次开启
    }
}
/* USER CODE END 4 */
复制代码

串口助手演示效果:

 可以实现串口中断

三、DMA收发模式

 STM32可用DMA的外设:定时器、ADC、SPI、IIC、USART

 使用DMA必须开启中断

 串口DMA模式最大为u16个字节,则65535

CubMAX配置介绍:

 

mode:模式

 Normal:正常模式,当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次

 Circular: 循环模式,传输完成后又重新开始继续传输,不断循环永不停止

 

Increment Address:地址增加

 Peripheral:设置传输数据的时候外设地址是不变还是递增。如果设置为递增,那么下一次传输的时候地址加 Data Width个字节,勾选表示递增。

 Memory:   设置传输数据时候内存地址是否递增。如果设置为递增,那么下一次传输的时候地址加 Data Width个字节,这个是内存,勾选表示递增。

函数:

串口DMA发送:

HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

 串口DMA接受:

HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);

代码:

main:

HAL_UART_Receive_DMA(&huart3,(uint8_t *)RxBuffer,10);//设置串口DMA缓冲区

 全局:

复制代码
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART3)//判断串口号
    {
      HAL_UART_Transmit_DMA(&huart3,(uint8_t *)RxBuffer,10);    
    }
}
/* USER CODE END 4 */
复制代码

串口助手演示效果:

 因为没有做项目,程序非常简单。

 

posted @   Yoku  阅读(1332)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示