<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > RS485通訊協(xié)議

RS485通訊協(xié)議

作者: 時(shí)間:2016-12-14 來(lái)源:網(wǎng)絡(luò ) 收藏
RS485缺點(diǎn):

RS485總線(xiàn)是一種常規的通信總線(xiàn),它不能夠做總線(xiàn)的自動(dòng)仲裁,也就是不能夠同時(shí)發(fā)送數據以避免總線(xiàn)競爭,所以整個(gè)系統的通信效率必然較低,數據冗余量較大,對于速度要求高的應用場(chǎng)所不適應用RS485總線(xiàn)。同時(shí)由于RS485總線(xiàn)上通常只有一臺主機,所以這種總線(xiàn)方式是典型的集中—分散型控制系統。一旦主機出現故障,會(huì )使整個(gè)系統的通信限于癱瘓狀態(tài),因此做好主機的在線(xiàn)備份是一個(gè)重要措施。

本文引用地址:http://dyxdggzs.com/article/201612/329997.htm

**傳統光電隔離的典型電路:

VDD與+5V1(VCC485)是兩組不共地的電源,一般用隔離型的DC-DC來(lái)實(shí)現。通過(guò)光耦隔離來(lái)實(shí)現信號的隔離傳輸,ISL3152EIBZ與MCU系統不共地,完全隔離則有效的抑制了高共模電壓的產(chǎn)生,大大降低485的損壞率,提高了系統穩定性。但也存在電路體積過(guò)大、電路繁瑣、分立器件過(guò)多,傳輸速率受光電器件限制等缺點(diǎn),對整個(gè)系統的穩定性也有一定影響。

***RXD1 :串口接收端

***TXD1 :串口傳輸端

***TRE1 :為控制位:控制發(fā)送還是接收數據;

當TRE1=1(高電平時(shí)),光耦電路121截止,/RE=1(無(wú)效),DE=1(有效),即發(fā)送數據;

當TRE=0 (低電平時(shí)),光耦電路導通,/RE=0(有效),即接收數據,DE=0(無(wú)效);

/RE: 485接收端

DE:485發(fā)送端

第一步,配置好串口發(fā)送、接收端引腳和485控制引腳;

因為RXD1引腳相對于STM32芯片來(lái)說(shuō)是接收外來(lái)數據,所以設置為輸入;

TXD1引腳相對于STM32芯片來(lái)說(shuō)是對外發(fā)送數據,所以設置為輸出;

TRE1引腳是對外發(fā)送“1”或“0”高低電平命令,所以設置為輸出;

[plain]view plaincopy
  1. voidUART2Init(void)
  2. {
  3. GPIO_InitTypeDefGPIO_InitStructure;
  4. USART_InitTypeDefUSART_InitStructure;
  5. RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  6. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能外設時(shí)鐘
  9. //GPIO結構的成員設置如下:
  10. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
  11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50M時(shí)鐘速度
  12. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽輸出
  13. GPIO_Init(GPIOA,&GPIO_InitStructure);
  14. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;//485_TX
  15. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  16. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//復用推挽輸出
  17. GPIO_Init(GPIOA,&GPIO_InitStructure);
  18. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;//485_RX
  19. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入
  20. GPIO_Init(GPIOA,&GPIO_InitStructure);
  21. //串口的結構成員設置如下:
  22. USART_InitStructure.USART_BaudRate=9600;
  23. USART_InitStructure.USART_WordLength=USART_WordLength_8b;
  24. USART_InitStructure.USART_StopBits=USART_StopBits_1;
  25. USART_InitStructure.USART_Parity=USART_Parity_No;
  26. USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
  27. USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
  28. USART_Init(USART2,&USART_InitStructure);
  29. USART_Cmd(USART2,ENABLE);
  30. //USART_ClearFlag(USART3,USART_FLAG_TC);
  31. USART_GetITStatus(USART1,USART_FLAG_TC);
  32. }

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

這里需要注意的是:

方法一:USART_ClearFlag(USART3, USART_FLAG_TC);

方法二:

USART_GetITStatus(USART1, USART_FLAG_TC);

剛上電時(shí)出現亂碼的原因:

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

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

(1)當設為USART_FLAG_TXE---檢測發(fā)送數據寄存器空標志位—為空,但是發(fā)送移位寄存器不為空,數據還沒(méi)有完全的發(fā)送出去,又有數據就被寫(xiě)進(jìn)來(lái)了,所以就會(huì )容易出現亂碼;

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

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

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

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

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

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

發(fā)送完畢中斷。

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

的使能位,設置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;//打開(kāi)485發(fā)送DE端口,關(guān)閉接收/RE端口
  8. DelayNmS(1);
  9. USART_SendData(USART2,*str++);
  10. while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//檢測發(fā)送數據寄存器空標志位
  11. DelayNmS(1);
  12. RX_485;//關(guān)閉發(fā)送DE端口,打開(kāi)接收/RE485端口,
  13. }
  14. }<spanstyle="NewRoman;">span>

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



關(guān)鍵詞: RS485通訊協(xié)

評論


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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>