新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機RS485串口通信

        單片機RS485串口通信

        作者: 時間:2016-11-20 來源:網絡 收藏
        RS-485是半雙工的通信方式,發送和接收共用同一物理信道。在任意時刻只允許一臺單機處于發送狀態。因此要求應答的單機必須在偵聽到總線上呼叫信號已經發送完畢,并且沒有其它單機發出應答信號的情況下,才能應答。半雙工通信對主機和從機的發送和接收時序有嚴格的要求。如果在時序上配合不好,就會發生總線沖突,使整個系統的通信癱瘓,無法正常工作。要使總線上的設備在時序上嚴格配合。在復位時,使主從機都處于接收狀態。

        MAX3082的發送和接收轉換是由芯片的RE/和DE端控制的。RE/=1,DE=1時,MAX3082處于發送狀態;RE/=0,DE=0時,MAX3082處于接收狀態。一般使用單片機的一個IO口連接RE/和DE端。在上電復位時,由于硬件電路穩定需要一定的時間,并且單片機各端口復位后處于高電平狀態,這樣就會使總線上各個分機處于發送狀態,由于上電時各電路不穩定,可能向總線發送信息。因此,如果用一根口線作發送和接收控制信號,應該將口線反向后接入MAX3082的控制端,使上電時MAX3082處于接收狀態。另外,在主從機軟件上也應做處理措施,如:上電時或通信之前,對串行口做幾次空操作,清除端口的非法數據和命令。

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

        RS-485的通信程序編寫和RS-232沒有太大區別,如果使用一個IO口控制MAX3082的RE/和DE端口,RS-485只比RS-232多了一個接收和發送的轉換控制位。初始化串口時,使該位處于低電平,即接收狀態。發送數據時,使該位先為高,發送完數據后拉低。程序如下:

        sbitRS485_EP3^5//發送,接收控制位

        void UART1_Init(void)

        {

        SCON = 0x50;//方式1,8位數據,可變波特率

        RS485_E= 0;//置低,接收

        TMOD|= 0x20;//定時器1,方式2,8位自重載

        PCON = 0x00;//波特率倍頻禁止

        TH1= 0xfd;//晶振22.1184MHz,波特率19200;

        TL1= 0xfd;

        IE|= 0x90;//開中斷

        IP= 0x10;

        TR1= 1;//啟動定時器

        }

        void UART1_Send_Char(const INT8U dt)

        {

        SBUF= dt;

        while(!TI);

        TI = 0;

        }

        void UART1_Send_String(INT8U *str, INT8U len)

        {

        INT8U i;

        RS485_E= 1;//置高,發送

        ES= 0;

        for(i=0; i

        {

        UART1_Send_Char(*(str+i));

        }

        RS485_E= 0;//置低,接收

        ES= 1;

        }

        void UART1_Interrupt(void) interrupt 4

        {

        RS485_E = 0;//接收

        ES = 0;

        if(RI)

        {

        //中斷接收數據

        }

        ES = 1;

        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 江孜县| 乐业县| 贵德县| 枞阳县| 巴彦淖尔市| 纳雍县| 南京市| 仁化县| 乌什县| 西宁市| 乳源| 安泽县| 清苑县| 昌邑市| 厦门市| 桦川县| 全南县| 大庆市| 沈阳市| 辽宁省| 东乌珠穆沁旗| 夏津县| 鱼台县| 新安县| 石景山区| 任丘市| 神农架林区| 上饶县| 宜兰县| 舒城县| 施秉县| 荃湾区| 莱州市| 南江县| 和田县| 伊吾县| 布尔津县| 正蓝旗| 乌兰察布市| 南乐县| 嘉祥县|