STM32串口通讯 CubeMX+MDK5

HAL库中串口发送的重要函数

参数:串口指针,发送的数据指针,数据大小,超时限制

·阻塞式发送函数(初学者推荐使用)
 HAL_StatusTypeDef  HAL_UART_Transmit(UART_HandleTypeDef *huart,
                                      uint8_t            *pData,
                                      uint16_t            Size,
                                      uint32_t            Timeout);
·非阻塞式发送函数(类似于中断)
 HAL_StatusTypeDef  HAL_UART_Transmit_IT(UART_HandleTypeDef *huart,
                                         uint8_t            *pData,
                                         uint16_t            Size,);
·发送完毕中断回调函数(数据发送完成后需要执行的操作)
  void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);                               

举例 

 使用非阻塞式的串口发送函数,将发送数组dat_Txd中的前5个数据发送到PC端,在数据发送完成后,反转PB5引脚的电平。

HAL_UART_Transmit_IT(&huart1,dat_Txd, 5); //dat_Txd 是数字,直接写名,不用加&
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);
    }
}

阻塞式

HAL_UART_Transmit(&huart,dat_Txd,5,10000);
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);

 HAL库中串口接受的重要函数

阻塞式接收

参数:串口指针,存放数据地址指针,数据大小,等待实践

HAL_StatusTypeDef HAL_UART_Receive(UART_HandleTypeDef *huart,
                                      uint8_t            *pData,
                                      uint16_t           *Size,
                                      uint32_t            Timeout);
举例:HAL_UART_Receive(&huart1,revbuf,sizeof(revbuf),HAL_MAX_DELAY);
只有当接收到大小为sizeof(revbuf)的信号,才往下执行。

中断式接收

参数:串口指针,存放数据地址指针,数据大小

HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart,
                                      uint8_t            *pData,
                                      uint16_t           *Size,);
·接受完毕中断回调函数(数据接受完成后需要执行的操作)
  void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart); 

举例 

使用非阻塞式的串口接收函数,接收USART1中的一个字节将其保存在dat_Rxd变量中,在数据发送完成后,若该字节为0x5A,则翻转PB8引脚的输出电平。 

HAL_UART_Transmit_IT(&huart1,&dat_Txd, 1);   //dat_Txd是变量,取地址
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        if(dat_Txd == 0x5A)
        {
            HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);        
        }   
    }
}

 实战运用

        [1]开机后,向串口1发送"hello world"

        [2]串口1收到字节指令"0xA1",打开LED1,发送“LED1 Open”

        [3]串口1收到字节指令"0xA2",关闭LED1,发送“LED1 Closed”

        [4]串口发送过程中,打开LED2作为发送数据指示灯

1.CubeMX 配置

 选择异步通讯;

波特率9600;数据长度8bit;无校验位;停止位1bit;

可以接受和发送

NVIC中断打开

2.MDK编辑

 定义数组变量:

uint8_t Tx_str1[] = "Hello world!\r\n";
uint8_t Tx_str2[] = "LED! Open\r\n";
uint8_t Tx_str3[] = "LED! Closed\r\n";

复位后,UART外设发送Hello word 至PC端,串口助手显示 Hello word ;

UART外设准备时刻接受PC端发出的数据

  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);      
  HAL_UART_Transmit(&huart1,Tx_str1,sizeof(Tx_str1),10000); 
  HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);        

  HAL_UART_Receive_IT(&huart1,&Rx_dat,1);      

 
 找到回调函数,然后在主函数中编辑

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1) //判断是不是串口1
    {
        //编写需要执行的内容
    }
}

 相当于当UART接收到PC端发送的数据时,跳进中断,实施该中断中的回调函数

按复位键,串口助手显示 helloword

发送a1,绿灯亮,串口助手显示LED! Open

发送a2,绿灯灭,串口助手显示LED! Closed

注意!!!!16进制✔,不选发送新行!!!!

  • 32
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值