您的位置 首页 芯闻

STM32之USART库函数USART_SendData的bug

1.最近在调试ATM32F103CB时发现,一串数据的最后一个字节总是发送不出去,用的是RS485收发;2.代码如下:voiduartReturn(unsignedcharc…

1.最近在调试ATM32F103CB时发现,一串数据的最终一个字节总是发送不出去,用的是RS485收发;

2.代码如下:

voiduartReturn(unsigned char childBoardAddr)
{
uchar temp = 0; //must have

temp += 0xAB;
temp += childBoardAddr;
temp += 0x30;
temp += 0x01;
temp += childBoardAddr;

RS485_TX_EN; //enable rs485 tx

sendByte(0xAB);
sendByte(childBoardAddr);
sendByte(0x30);
sendByte(0x01);
sendByte(childBoardAddr);
sendByte(temp);

RS485_RX_EN; //enable rs485 rx
}

其间:sendByte函数如下:

voidsendByte( unsigned char data)
{
//RS485_TX_EN;
USART_SendData( USART2,data );
while( USART_GetFlagStatus( USART2,USART_FLAG_TXE ) == RESET );//数据没有被传入输出移位寄存器,则一向等候下去
//RS485_RX_EN;
}

搭档帮助改了一下lib库函数:USART_SendData,在其后边加了:while((USARTx->SR&0x40)==0);//////////发现最终一字节数据会漏发,才加上的;

这调查办可不便是等价于:while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)吗;

>>>>>>>>来看看网上是怎样说的?

用串口接连发送一串数字时,榜首个数总是发不出去,我用STM32F103ZE,STM32F103CB都是这样的状况,以下是代码:
USART_SendData(USART1,0x06);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_SendData(USART1,0x07);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_SendData(USART1,0x08);while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);

,榜首字节发送不出去,看网友是怎样剖析回答的吧:

1:这个问题的底子原因是复位后,TC和TXE标志位默许都是1,很多人喜爱这样写:
USART_SendData(USART1, (u8) ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
while在发送榜首个字节时没有起到应有效果,直接跳出,接着写第二个字节,这时榜首个字节还未宣布,数据被破坏了.

看看datasheet,公然复位今后,SR=0x00c0;TC=TXE=1;

疑问:为什么网友说:只需榜首个用TXE,其它用什么标志无所谓,都能正常发送。按道理,TXE也没起到维护啊!!!

2.while确实很费时,别的当TDR寄存器中的数据被硬件转移到移位寄存器的时分,TXE被硬件置位(留意:单缓冲器传输中运用该位);当包括有数据的一帧发送完成后,而且TXE=1时,由硬件将该方位’1’,只要在多缓存通讯中才引荐这种铲除程序。其间TC判别的是一帧数据,而TXE是当TDR数据传到移位寄存器就被置位了,所以TC的时间比较长,很简单被下一次数据掩盖~~~所以一般喜爱判别TXE,数据写到DR就可以了 ,剩余的作业就交给硬件了

3.一般的用TXE就可以了, TC一般用于需求延时的场合,比方说是232/485转换器,需求得到TC后,才能将发送改变成接纳,不然最终一个字节发送不完全。

看来,3很契合我的状况:我的相当于2个等候:

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET;//@1

while( USART_GetFlagStatus( USART2,USART_FLAG_TXE ) == RESET );//@2

考虑一下:@2能不能拿掉呢??

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/xinwen/264810.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部