"); //-->
2.1 问题及现象
使用USART_SendData()函数非连续发送单个字符是没有问题的;当连续发送字符时(两个字符间没有延时),就会发现发送缓冲区有溢出现象。若发送的数据量很小时,此时串口发送的只是最后一个字符,当发送数据量大时,就会导致发送的数据莫名其妙的丢失。
如:
for(TxCounter = 0;TxCounter < RxCounter; TxCounter++)
USART_SendData(USART1, RxBuffer[TxCounter]);
2.2 原因
此API函数不完善,函数体内部没有一个判断一个字符是否发送完毕的语句,而是把数据直接放入发送缓冲区,当连续发送数据时,由于发送移位寄存器的速度限制(与通信波特率有关),导致发送缓冲区的数据溢出,老的数据还未及时发送出去,新的数据又把发送缓冲区的老数据覆盖了。
2.3 解决方法(目前总结的两种方案)
方案1. 加入延时函数(下下策),不需要修改USART_SendData()函数
for(TxCounter = 0;TxCounter < RxCounter; TxCounter++){
USART_SendData(USART1, RxBuffer[TxCounter]);
DelayMS(2); //加入一个小的延时
}
方案2. 修改USART_SendData()函数,在其内部加入发送缓冲区的USART_FLAG_TXE状态检测语句,确保一个字符完全发送出去,才进行下一个字符的发送。
实现方法:每发送一个字符都检测状态寄存器,确保数据已经发送完毕。具体操作步骤如下所示。
修改前的函数定义体
void USART_SendData(USART_TypeDef* USARTx, u16 Data)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_DATA(Data));
/* Transmit Data */
USARTx->DR = (Data & (u16)0x01FF);
}
修改后的函数定义体
void USART_SendData(USART_TypeDef* USARTx, u16 Data)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
assert_param(IS_USART_DATA(Data));
/* Transmit Data */
USARTx->DR = (Data & (u16)0x01FF);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待发送缓冲区空才能发送下一个字符
}
方案3. 不修改原来的库函数,在每一个字符发送后检测状态位。
USART_SendData(USART1, RxBuffer[TxCounter]);
while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET){} //等待发送缓冲区空才能发送下一个字符
ST这么做的原因是:使用发送中断功能。
专栏文章内容及配图由作者撰写发布,仅供工程师学习之用,如有侵权或者其他违规问题,请联系本站处理。 联系我们
相关推荐
美国 公司诚招 Sr. & Jr. Firmware Engineers in 深圳
HT9170 双音多频(DTMF)接收器的使用 说明及源程序
HT9170 双音频(DTMF)接收器
HT单片机加、减、乘、除法 说明及源程序
有发光指示的电灯开关电路
数据中心与消费电子芯片拉动台积电一季度营收增长
HT9200 双音多频(DTMF)信号发生器的使用 说明及源程序
lwIP协议栈是否包含了SNMP?
中断驱动
超声波扫描转换演示 OMAP3530 EVM
HT9200AB 双音频(DTMF)发生器
硅光子技术:点亮更高效数据中心之路
低功耗射频和德州仪器的解决方案
德州仪器 TMS320C6474 DSP 评估板
光通信领域并购:Credo 宣布收购 DustPhotonics
电源管理设计贴士
2025年汽车功率半导体供应商份额
双控电灯开关电路
小芯片标准旨在实现 “即插即用”
提供毕业设计余下的以太网板子
五控电灯开关电路
高性能 32位嵌入式处理器TMS470 家族
除氦气外,8 种关键材料风险冲击韩国芯片供应链
简易变光拉线开关电路
三控电灯开关电路
请教vxworks加载end网络驱动的问题
STC 车规 MCU,国产STC32G12K128 为商用汽车提供可靠控制方案
微软与Stellantis计划用AI赋能车主
美国上诉法院重启针对英特尔的30亿美元专利侵权诉讼
售价仅1.7元!STC高性价比车规级MCU重塑汽车电子供应链格局