新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Mega128的串口通訊程序

        Mega128的串口通訊程序

        作者: 時間:2016-11-10 來源:網絡 收藏
        #i nclude
        #i nclude
        #i nclude "uart.h"
        /* USART Buffer Defines */
        #define USART_RX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256
        bytes */
        #define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 )
        #define USART_TX_BUFFER_SIZE 16 /* 1,2,4,8,16,32,64,128 or 256
        bytes */
        #define USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 )
        #if ( USART_RX_BUFFER_SIZE & USART_RX_BUFFER_MASK )
        #error RX buffer size is not a power of 2
        #endif
        /* Static Variables */
        static unsigned char USART_RxBuf[USART_RX_BUFFER_SIZE];
        static volatile unsigned char USART_RxHead;
        static volatile unsigned char USART_RxTail;
        static unsigned char USART_TxBuf[USART_TX_BUFFER_SIZE];
        static volatile unsigned char USART_TxHead;
        static volatile unsigned char USART_TxTail;
        /* 串口初始化 */
        void InitUSART(INT8U baudrate)
        {
        INT8U x;
        UBRR0L = baudrate;
        UCSR0B = ( (1<Complete
        Interrupt Enable, Receiver Enable and Transmitter Enable*/
        x = 0; /* flush receive buffer */
        USART_RxTail = x;
        USART_RxHead = x;
        USART_TxTail = x;
        USART_TxHead = x;
        }
        /* 接收中斷 */
        void USART_RX_interrupt( void )
        {
        unsigned char data;
        unsigned char tmphead;
        data = UDR0; /* read the received data */
        tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;/*
        calculate
        buffer index */
        USART_RxHead = tmphead; /* store new index */
        if ( tmphead == USART_RxTail )
        {
        return;/* ERROR! Receive buffer overflow, you can use
        flux cortorl */
        }
        USART_RxBuf[tmphead] = data; /* store received data in buffer
        */
        }
        /* 發送中斷 */
        void USART_TX_interrupt( void )
        {
        unsigned char tmptail;
        if ( USART_TxHead != USART_TxTail )/* check if all data is
        transmitted */
        {
        tmptail = ( USART_TxTail + 1 ) & USART_TX_BUFFER_MASK;/*
        calculate buffer index */
        USART_TxTail = tmptail; /* store new index */
        UDR0 = USART_TxBuf[tmptail]; /* start transmition */
        }
        else
        {
        UCSR0B &= ~(1<}
        }
        /* 讀取數據函數 */
        unsigned char ReceiveByte( void )
        {
        unsigned char tmptail;
        while ( USART_RxHead == USART_RxTail ) /* wait for incomming
        data */
        ;
        tmptail = ( USART_RxTail + 1 ) & USART_RX_BUFFER_MASK;/*
        calculate
        buffer index */
        USART_RxTail = tmptail; /* store new index */
        return USART_RxBuf[tmptail]; /* return data */
        }
        /* 發送數據函數 */
        void TransmitByte( unsigned char data )
        {
        unsigned char tmphead;
        tmphead = ( USART_TxHead + 1 ) & USART_TX_BUFFER_MASK; /*
        calculate
        buffer index */
        while ( tmphead == USART_TxTail )/* wait for free space in
        buffer */
        ;
        USART_TxBuf[tmphead] = data; /* store data in buffer */
        USART_TxHead = tmphead; /* store new index */
        UCSR0B |= (1<}
        /* 查詢是否有數據 */
        unsigned char DataInReceiveBuffer( void )
        {
        return ( USART_RxHead != USART_RxTail ); /* return 0 (FALSE)
        if the
        receive buffer is empty */
        }
        /* 中斷中只做很少的事情,通常我是在接收中斷中post一個信號量,觸發別的任務讀數據
        */


        關鍵詞: Mega128串口通

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 富平县| 积石山| 通渭县| 桃江县| 长顺县| 内黄县| 谷城县| 永德县| 常熟市| 彰化县| 灵石县| 界首市| 台前县| 即墨市| 萍乡市| 洮南市| 潮州市| 荥阳市| 柳州市| 阿城市| 常熟市| 伊通| 铜梁县| 黄冈市| 崇礼县| 奉节县| 通榆县| 陆丰市| 西藏| 西峡县| 朝阳区| 崇左市| 台湾省| 抚州市| 天全县| 古浪县| 安平县| 滨海县| 抚远县| 泰顺县| 同江市|