stm32 串口收发


Stm32 cubemx里的初始化见 链接,以下是main文件里的调用

查询

查询方式:发送数据——先发后查;接收数据——先查后收


要去使用stm32f1xx_hal_uart.h文件下的相关函数

具体为

  • 发送用到的
HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);//Timeout参数是超时时间,如果发送数据时间超过限制,就会返回HAL_TIMeOUT
//使用位置
int main(){
    ...
    while(1){
        ...
        delay();//加适当的延时
        HAL_UART_Transmit();
    }
}
  • 接收用到的
HAL_UART_Receive(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout);//参数与上面一样
//使用位置
int main(){
    ...
    while(1){
        ...
        if(HAL_UART_Receive(...) == HAL_OK){
            ...
        }
    }
}

中断

中断方式:发送数据——发送、等待中断、中断中发送;
接收数据——等待中断、在中断中接收


要去使用stm32f1xx_hal_uart.h文件下的相关函数

具体为

  • 接收用到的
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);//数据区(size)全部接收完成(接收满了),才会调用。该函数需要重定义,否则将使用默认的,重定义不用将__weak写上
//注意在回调函数里,末尾还要调用一遍HAL_UART_Receive_IT(感觉是重新使能)
//使用位置
int main(){
	HAL_UART_Receive_IT();
	...
	while(1){
	...
	}
}    
...
void HAL_UART_RxCpltCallback()//重定义
{
      ...
      HAL_UART_Receive_IT(...);//处理完后,重新使能
}
  • 发送用到的
HAL_UART_Transmit_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);

但是呢,对于发送我们是知道什么时候要发送的,一般采用查询方式,对于接收我们是不知道,数据是什么时候过来的,一般采用中断

DMA

  • 发送用到的
HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
  • 接收用到的
HAL_UART_Receive_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
//使用位置
int main(){
    ...
    HAL_UART_Receive_DMA();
    while(1){
        ...
    }
    //一旦开启DMA,收发中断是强制开启的,所以也可以编写回调函数
    void HAL_UART_RxCpltCallback()//重定义
    {
        ...
    }
}

HAL_UART_HalfCpltCallback

HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart);//数据区接收到一半时调用

相较于HAL_UART_TxCpltCallback,这种 HalfCpltCallback 只能在DMA方式下调用,不能在阻塞和中断方式下调用。问题链接

image-20220214131627550

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值