新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > RS485通訊協議

        RS485通訊協議

        作者: 時間:2016-12-14 來源:網絡 收藏
        RS485缺點:

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

        本文引用地址:http://www.104case.com/article/201612/329997.htm

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

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

        ***RXD1 :串口接收端

        ***TXD1 :串口傳輸端

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

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

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

        /RE: 485接收端

        DE:485發送端

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

        因為RXD1引腳相對于STM32芯片來說是接收外來數據,所以設置為輸入;

        TXD1引腳相對于STM32芯片來說是對外發送數據,所以設置為輸出;

        TRE1引腳是對外發送“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);//使能外設時鐘
        9. //GPIO結構的成員設置如下:
        10. GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
        11. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//50M時鐘速度
        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. }

        第二步:發送數據

        這里需要注意的是:

        方法一:USART_ClearFlag(USART3, USART_FLAG_TC);

        方法二:

        USART_GetITStatus(USART1, USART_FLAG_TC);

        剛上電時出現亂碼的原因:

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

        如果USART_FLAG_TC---發送完成標志位

        (1)當設為USART_FLAG_TXE---檢測發送數據寄存器空標志位—為空,但是發送移位寄存器不為空,數據還沒有完全的發送出去,又有數據就被寫進來了,所以就會容易出現亂碼;

        (2)當設為USART_FLAG_TC—檢測發送完成標志位—為空,即發送移位寄存器為空,數據才真正的發送出去,因此此時又有數據被寫進來也不會發生亂碼

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

        要以中斷的方式發送一個數據包,流程是這樣的:

        1.設置RS485的方向為發送,使能發送寄存器空中斷,使能完畢進入串口中斷。

        2.串口中斷里讀取串口狀態,并填充一個數據到發送數據寄存器,硬件自動清除發送數據寄存器空標志,串口數據發送開始。

        3.串口發送完一個數據,發送數據寄存器變空,再進入中斷,繼續填充下一個數據,直到最后一個數據填充完,使能串口

        發送完畢中斷。

        4.最后一個數據發送完畢,再次進入中斷,清除發送數據寄存器空標志,清除發送完畢中斷標志,清除這兩個中斷標志

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

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



        關鍵詞: RS485通訊協

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 蒲江县| 南平市| 宁国市| 旬邑县| 西和县| 微山县| 高台县| 香港| 崇阳县| 晋州市| 凤阳县| 昭平县| 泸水县| 娱乐| 耿马| 手机| 西和县| 广元市| 西昌市| 陆丰市| 江油市| 腾冲县| 新野县| 廊坊市| 台东市| 彰化市| 屯昌县| 芜湖县| 尼勒克县| 清镇市| 延吉市| 永年县| 潍坊市| 甘德县| 泰来县| 温州市| 柘城县| 韩城市| 淳化县| 承德市| 根河市|