串口阻塞/中断发送数据(HAL库)

串口通信基础原理

串口常用电平标准:

  • 波特率:串口通信的速率

    注:波特率(每秒传输码元数,码元/s)和比特率(每秒传输的比特数,bit/s)只在二进制调制 下等效,此时一个码元 = 一个bit。

  • 起始位:标志一个数据帧的开始,固定为低电平。(下降沿开启)

  • 数据位:数据帧的有效载荷,低位先行

  • 校验位:用于数据验证。奇校验在第九位补0/1,使得整个数据帧1的个数为奇数,偶校验同理。

  • 停止位:用于数据帧间隔,固定为高电平。

USART 通用同步/异步收发器

       USART是STM32内部集成的硬件外设,可从数据寄存器的一个字节自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接位一个字节数据,放在数据寄存器中。

USART外设就是串口通信的硬件支持电路。

usart部分结构图:

串口打印操作实验(阻塞发送版本)

串口的阻塞发送,就是调用HAL_UART_Transmit()函数

第一个参数:要使用的串口句柄。

第二个参数:发送数据的地址

第三个参数:发送数据的大小,发送一个字符就是1。

第四个参数是等待时间。这个等待时间就是串口阻塞发送的精髓,它在串口正在发送的时候,是将整个任务阻塞,直到等待时间结束。如果设置等待时间为0xffff,就是一直等到数据发送完,才会继续执行其他代码。

封装一下直接调用即可:

执行效果如图所示:

如果要发送字符串/数组,使用一个for循环即可。

串口打印操作实验(中断发送版本)

串口的中断发送,就是调用HAL_UART_Transmit_IT()函数

第一个参数:要使用的串口句柄。

第二个参数:发送数据的地址

第三个参数:发送数据的大小,发送一个字符就是1。

中断发送区别于阻塞发送就是在于等待时间。

       当程序执行了HAL_UART_Transmit_IT()之后,不会等待数据发送完,就会立即执行下一条代码,而发送字符串的工作就放在中断中去执行。这样就保证了整个任务不会因为等待串口发送而阻塞。

在触发中断之后,

判断中断标志置一之后,

       回调函数是一个虚函数,由我们自己重新定义。在发送完第一个字符之后,程序会进入到这里,我们可以按照我们要的需求自定义代码内容,比如发送完一个字符置一个标志位,或者是继续在这里发送下一个字符,如果我们什么也不做就空着就好。

封装一下代码即可使用:

执行效果如图所示:

如果要打印字符串,可以使用for多次调用,也可以在中断回调函数HAL_UART_TxCpltCallback中去继续发送剩余字符。

参数文献:江协科技教程

  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当使用 HAL 库进行串口发送时,可以使用以下代码示: ```c #include "stm32f4xx_hal.h" // 定义串口句柄 UART huart; // 串口发送回调函数void HAL_UART_TxCpltCallback(UART_HandleTypeDef *art) { // 发送完成的回调处理 // 可以在里执行一些其他操作 } int main) { // 初始化 HAL 库 HAL(); // 初始化串口硬件 __HAL_RCC_USART1_CLK_ENABLE(); h.Instance = USART1; huart.Init.BRate = 115200; huart.WordLength = UART_WORDLENGTH_8B huart.Init.StopBits = UART_STOPBITS_1; huart.Init.Parity = UART_PARITY_NONE; huart.Init.Mode = UART_MODE_TX; huart.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart); // 定义发送数据缓冲区 uint8_t sendData[] = "Hello, World!\r\n"; while (1) { // 发送数据 HAL_UART_Transmit_IT(&huart, sendData, sizeof(sendData) - 1); // 延时一段时间 HAL_Delay(1000); } } // 串口发送中断处理函数 void USART1_IRQHandler(void) { HAL_UART_IRQHandler(&huart); } // 串口错误中断处理函数 void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { // 发生错误时的处理 } ``` 上述示例代码中,首先需要初始化串口硬件,然后定义一个发送数据的缓冲区。在主循环中,通过调用 `HAL_UART_Transmit_IT` 函数进行非阻塞发送发送完成后,通过 `HAL_UART_TxCpltCallback` 回调函数进行处理。 注意,上述代码仅供参考,具体的实现方式可能会根据不同的硬件平台和 HAL 库版本有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值