STM32库函数USART_SendData问题和解决方法
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32库函数USART_SendData问题和解决方法
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 状态检测语句,确保一个字符完全发送出去,才进行下
一个字符的发送。