内容发布更新时间 : 2024/11/19 20:35:25星期一 下面是文章的全部内容请认真阅读。
STM32 的串口函数_库函数
个人记录:昨天做串口实验的时候一直没有成功的原因,连续调用 USART_SendData 总是会出现前一个被后一个覆盖的情况。之前觉得 ST 的官 方库应该没有问题就没往这方面想,现在查查,确实有库的问题,还是自己对 库不太理解。还有遇到的硬件复位以后,发送第一个字符丢失的情况。1、后 字节覆盖前字节
-----------------加判断 while(USART_GetFlagStatus(USARTx,
USART_FLAG_TXE) == RESET){}2、硬件复位之后第一个字符丢失-------------- ---USART_ClearFlag(USART2,USART_FLAG_TC);----------------- USART_SendData(USART2,0x01);-----------------
while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); 转载正文:1. 问题及现象使用 USART_SendData()函数非连续发送单个字符 是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲 区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符, 当发送数据量大时,就会导致发送的数据莫名其妙的丢失。 如:
12for(TxCounter = 0;TxCounter
2. 原因此 API 函数不完善,函数体内部没有一个判断一个字符是否发送完毕 的语句,而是把数据直接放入发送缓冲区,当连续发送数据时,由于发送移位 寄存器的速度限制(与通信波特率有关),导致发送缓冲区的数据溢出,老的 数据还未及时发送出去,新的数据又把发送缓冲区的老数据覆盖了。
3. 解决方法发送后等待一段时间延迟的方法就不说了,等待时间不确定,此
为下下策。提供下面 2 种方案: 方案 1.
在每一个字符发送后检测状态位 USART_SendData(USART1,
RxBuffer[TxCounter]);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} // 等待发送缓冲区空才能发送下一个字符
方案 2. 修改库函数修改 USART_SendData()函数,在其内部加入发送缓冲区 的 USART_FLAG_TXE 状态检测语句,确保一个字符完全发送出去,才进行下 一个字符的发送。
实现方法:每发送一个字符都检测状态寄存器,确保数据已经发送完毕。具 体操作步骤如下所示。 修改前的函数定义体
123456789101112131415void USART_SendData(USART_TypeDef* USARTx, u16
Data){assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USAR T_DATA(Data));USARTx->DR = (Data & (u16)0x01FF);}修改后的函数定义体 12345678910111213141516void USART_SendData(USART_TypeDef* USARTx, u16
Data){assert_param(IS_USART_ALL_PERIPH(USARTx));assert_param(IS_USAR T_DATA(Data));USARTx->DR
=
(Data
&
(u16)0x01FF);while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待发送缓冲区空才能发送下一个字符}可能有人认为,为什么不 预先在库函数中处理这个问题,而把解决方法抛给用户。个人认为 ST 这么做 的原因是:使用发送中断功能。tips:感谢大家的阅读,本文由我司收集整编。 仅供参阅!