新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機與上位機通信協議的制定

        AVR單片機與上位機通信協議的制定

        作者: 時間:2013-12-07 來源:網絡 收藏

        單片機和的串口分為上行協議和下行協議,要分別制定!

        上行協議,即由單片機向發送數據。

        下行協議,即由向單片機發送數據。

        又要分固定長度和不定長度兩種

        本文所介紹的協議屬于簡單的固定字長的

        下行協議由四個字節構成

        起始字PRE 命令字ORD 值VAL 結束字END 附注
        1byte 1byte 1byte 1byte  
        BBH AAH(ORD_SATA)     單片機狀態轉換命令標識
        01H EEH 模式1:空閑
        02H EEH 模式2:溫度采集
        03H EEH 模式3:溫度采集向上位機傳送采集值
        04H EEH 模式4:PWM測試
        BBH DDH(ORD_PWM) value EEH PWM占空比值修改指令
        BBH FFH(ORD_TEM) value EEH 目標溫度控制指令

        上表是簡單的上位機對單片機的控制指令

        下述函數是C#中封裝的串口通信類中的發送函數的封裝

        public void SerSendCommu(byte orderDef, byte data)//參數1為命令字,參數二為要發送的數

        //據,需要時可直接調用
        {
        Byte[] BSendTemp = new Byte[SEND_LENTH];
        BSendTemp[0] = PRE;
        BSendTemp[1] = orderDef;
        BSendTemp[2] = data;
        BSendTemp[3] = END;
        this.serialPort1.Write(BSendTemp, 0, SEND_LENTH);
        }

        下位機中用中斷方式接收字符,本文用的是GCC語言,下面是串口接收數據中斷

        ISR(USART_RXC_vect)//串口接收中斷
        {
        unsigned char status,data;
        status = UCSRA; //**首先讀取UCSRA的值,再讀取UDR值,順序不能顛倒,否則讀取UDR后的UCSRA的

        //值即會改變**
        data = UDR;
        if(!Uart_RecvFlag)//判斷緩存中的數據是否讀完,讀完則接收指令
        {
        if((status((1FE)|(1PE)|(1DOR)))==0)
        {
        rx_buffer[rx_counter]=data;
        rx_counter++;
        switch(rx_counter)
        {
        case 1:
        if(data!=USART_BEGIN_STX)
        rx_counter=0;
        break;
        case 4:
        rx_counter=0;
        if(data==USART_END_STX)
        Uart_RecvFlag=1;
        break;
        }
        }
        }

        }


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 徐州市| 东山县| 广平县| 德昌县| 石阡县| 垫江县| 东港市| 龙山县| 麦盖提县| 威信县| 台北市| 连云港市| 鄢陵县| 中西区| 融水| 江山市| 桃源县| 松滋市| 玉山县| 水城县| 洛宁县| 凤台县| 抚远县| 常熟市| 罗城| 玉林市| 星子县| 古交市| 罗甸县| 建平县| 仁怀市| 望奎县| 抚宁县| 安阳县| 庆城县| 宜春市| 项城市| 勐海县| 黔东| 固安县| 佳木斯市|