<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32之USART庫(kù)函數(shù)USART_SendData的bug

          STM32之USART庫(kù)函數(shù)USART_SendData的bug

          作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
          1.最近在調(diào)試ATM32F103CB時(shí)發(fā)現(xiàn),一串?dāng)?shù)據(jù)的最后一個(gè)字節(jié)總是發(fā)送不出去,用的是RS485收發(fā);

          2.代碼如下:

          本文引用地址:http://www.ex-cimer.com/article/201611/318087.htm

          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函數(shù)如下:

          voidsendByte( unsigned char data)
          {
          //RS485_TX_EN;
          USART_SendData( USART2,data );
          while( USART_GetFlagStatus( USART2,USART_FLAG_TXE ) == RESET );//數(shù)據(jù)沒(méi)有被傳入輸出移位寄存器,則一直等待下去
          //RS485_RX_EN;
          }

          同事幫忙改了一下lib庫(kù)函數(shù):USART_SendData,在其后面加了:while((USARTx->SR&0x40)==0);//////////發(fā)現(xiàn)最后一字節(jié)數(shù)據(jù)會(huì)漏發(fā),才加上的;

          這調(diào)語(yǔ)句可不就是等價(jià)于:while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET)嗎;

          >>>>>>>>來(lái)看看網(wǎng)上是怎么說(shuō)的?

          用串口連續(xù)發(fā)送一串?dāng)?shù)字時(shí),第一個(gè)數(shù)總是發(fā)不出去,我用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);

          ,第一字節(jié)發(fā)送不出去,看網(wǎng)友是怎么分析解答的吧:

          1:這個(gè)問(wèn)題的根本原因是復(fù)位后,TC和TXE標(biāo)志位默認(rèn)都是1,很多人喜歡這樣寫(xiě):
          USART_SendData(USART1, (u8) ch); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET)
          while在發(fā)送第一個(gè)字節(jié)時(shí)沒(méi)有起到應(yīng)有作用,直接跳出,接著寫(xiě)第二個(gè)字節(jié),這時(shí)第一個(gè)字節(jié)還未發(fā)出,數(shù)據(jù)被破壞了.

          看看datasheet,果然復(fù)位以后,SR=0x00c0;TC=TXE=1;

          疑問(wèn):為什么網(wǎng)友說(shuō):只要第一個(gè)用TXE,其它用什么標(biāo)志無(wú)所謂,都能正常發(fā)送。按道理,TXE也沒(méi)起到保護(hù)?。。。?/p>

          2.while的確很費(fèi)時(shí),另外當(dāng)TDR寄存器中的數(shù)據(jù)被硬件轉(zhuǎn)移到移位寄存器的時(shí)候,TXE被硬件置位(注意:?jiǎn)尉彌_器傳輸中使用該位);當(dāng)包含有數(shù)據(jù)的一幀發(fā)送完成后,并且TXE=1時(shí),由硬件將該位置’1’,只有在多緩存通訊中才推薦這種清除程序。其中TC判斷的是一幀數(shù)據(jù),而TXE是當(dāng)TDR數(shù)據(jù)傳到移位寄存器就被置位了,所以TC的時(shí)間比較長(zhǎng),很容易被下一次數(shù)據(jù)覆蓋~~~所以一般喜歡判斷TXE,數(shù)據(jù)寫(xiě)到DR就可以了 ,剩下的工作就交給硬件了

          3.一般的用TXE就可以了, TC一般用于需要延時(shí)的場(chǎng)合,比如說(shuō)是232/485轉(zhuǎn)換器,需要得到TC后,才能將發(fā)送改變成接收,否則最后一個(gè)字節(jié)發(fā)送不完全。

          看來(lái),3很符合我的情況:我的相當(dāng)于2個(gè)等待:

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

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

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



          評(píng)論


          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();