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

          新聞中心

          RS485協(xié)議

          作者: 時間:2016-12-14 來源:網(wǎng)絡(luò) 收藏

          第二步:發(fā)送數(shù)據(jù)

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

          這里需要注意的是:

          方法一:USART_ClearFlag(USART3, USART_FLAG_TC);

          方法二:

          USART_GetITStatus(USART1, USART_FLAG_TC);

          剛上電時出現(xiàn)亂碼的原因:

          while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET); // USART_FLAG_TXE---檢測發(fā)送數(shù)據(jù)寄存器空標(biāo)志位

          如果USART_FLAG_TC---發(fā)送完成標(biāo)志位

          (1)當(dāng)設(shè)為USART_FLAG_TXE---檢測發(fā)送數(shù)據(jù)寄存器空標(biāo)志位—為空,但是發(fā)送移位寄存器不為空,數(shù)據(jù)還沒有完全的發(fā)送出去,又有數(shù)據(jù)就被寫進(jìn)來了,所以就會容易出現(xiàn)亂碼;

          (2)當(dāng)設(shè)為USART_FLAG_TC—檢測發(fā)送完成標(biāo)志位—為空,即發(fā)送移位寄存器為空,數(shù)據(jù)才真正的發(fā)送出去,因此此時又有數(shù)據(jù)被寫進(jìn)來也不會發(fā)生亂碼

          STM32的數(shù)據(jù)發(fā)送有兩個中斷標(biāo)志,一個是發(fā)送數(shù)據(jù)寄存器空標(biāo)志,一個是發(fā)送完畢標(biāo)志。兩個標(biāo)志都可以引起中斷.

          要以中斷的方式發(fā)送一個數(shù)據(jù)包,流程是這樣的:

          1.設(shè)置RS485的方向為發(fā)送,使能發(fā)送寄存器空中斷,使能完畢進(jìn)入串口中斷。

          2.串口中斷里讀取串口狀態(tài),并填充一個數(shù)據(jù)到發(fā)送數(shù)據(jù)寄存器,硬件自動清除發(fā)送數(shù)據(jù)寄存器空標(biāo)志,串口數(shù)據(jù)發(fā)送開始。

          3.串口發(fā)送完一個數(shù)據(jù),發(fā)送數(shù)據(jù)寄存器變空,再進(jìn)入中斷,繼續(xù)填充下一個數(shù)據(jù),直到最后一個數(shù)據(jù)填充完,使能串口

          發(fā)送完畢中斷。

          4.最后一個數(shù)據(jù)發(fā)送完畢,再次進(jìn)入中斷,清除發(fā)送數(shù)據(jù)寄存器空標(biāo)志,清除發(fā)送完畢中斷標(biāo)志,清除這兩個中斷標(biāo)志

          的使能位,設(shè)置RS485的方向為接收.

          [html]view plaincopy
          1. #defineRX_485GPIO_SetBits(GPIOA,GPIO_Pin_1);
          2. #defineTX_485GPIO_ResetBits(GPIOA,GPIO_Pin_1);
          3. voidUART2_TX485_Puts(char*str)
          4. {
          5. while(*str)
          6. {
          7. TX_485;//打開485發(fā)送DE端口,關(guān)閉接收/RE端口
          8. DelayNmS(1);
          9. USART_SendData(USART2,*str++);
          10. while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//檢測發(fā)送數(shù)據(jù)寄存器空標(biāo)志位
          11. DelayNmS(1);
          12. RX_485;//關(guān)閉發(fā)送DE端口,打開接收/RE485端口,
          13. }
          14. }<spanstyle="font-family:TimesNewRoman;font-size:14px;">span>

          在485芯片的通信中,尤其要注意對485控制端DE的軟件編程。為了可靠工作,在485總線狀態(tài)切換時需要做適當(dāng)延時,再進(jìn)行數(shù)據(jù)收發(fā)。具體的做法是在數(shù)據(jù)發(fā)送狀態(tài)下,先將控制端置“1”,延時1ms左右的時間,在發(fā)送有效的數(shù)據(jù),一包數(shù)據(jù)發(fā)送結(jié)束后再延時1ms后,將控制端置“0”,這樣處理會使總線在狀態(tài)切換時,有一個穩(wěn)定的工作過程。



          上一頁 1 2 下一頁

          關(guān)鍵詞: RS485協(xié)議通信總線自動仲

          評論


          相關(guān)推薦

          技術(shù)專區(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); })();