新聞中心

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

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

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

        在單片機主循環程序的最前部分進行指令譯碼

        if(Uart_RecvFlag)//接收到命令
        {

        switch(rx_buffer[1])
        {
        case 0xAA://單片機狀態命令控制;
        ucWorkStatue=rx_buffer[2];//指令數據

        break;
        case 0xDD://PWM值修改指令

        OCR2=rx_buffer[2];
        break;
        case 0xFF://初始溫度設定
        break;
        }
        Uart_RecvFlag=0;
        }

        //隨后進行執行指令

        switch(ucWorkStatue)
        {
        case 1://空閑模式
        break;
        case 2://測量模式,但不輸出
        break;
        case 3://測量模式,由串口輸出
        break;
        case 4://PWM輸出測試
        break;
        default:
        break;
        }
        這樣就可以利用串口對單片機進行在線命令控制了;

        上行協議的制定和下行協議基本一致!

        程序中定義了串口通信輸出緩沖區,緩沖區的字長正好為協議的長度;

        //串口發送緩沖區變量聲明
        volatile unsigned char tx_buffer[TX_BUFFER_SIZE];//定義串口發送緩沖區
        volatile unsigned char tx_wr_index=0,tx_rd_index=0,tx_counter=0;//rx_wr_index寫指針,rx_rd_index讀指針,rx_counter緩沖區數據個數

        //USART發送函數
        void USART_Transmit(unsigned char data)//發送數據函數
        {
        while(tx_counter==TX_BUFFER_SIZE);//輸出緩沖區滿,等待
        asm("cli");
        if(tx_counter||((UCSRA DATA_REGISTER_EMPTY)==0))
        {
        tx_buffer[tx_wr_index]=data;
        if(++tx_wr_index==TX_BUFFER_SIZE)
        tx_wr_index=0;
        ++tx_counter;
        }
        else
        UDR = data;
        asm("sei");
        }

        //發送中斷服務程序

        ISR(USART_TXC_vect)//USART發送數據中斷
        {
        if(tx_counter)
        {
        --tx_counter;
        UDR=tx_buffer[tx_rd_index];
        if(++tx_rd_index==TX_BUFFER_SIZE)
        {
        tx_rd_index=0;
        }
        }
        }
        在C#編寫的中,利用串口接收事件響應方法定義

        serialPort1.ReceivedBytesThreshold = RECEIVE_LENTH;

        在時間響應事件中調用協議分析處理函數serialPortCaculate()來分析協議

        private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {

        this.label_dispzedNum.Invoke(new MethodInvoker(delegate
        { //匿名方法
        int inNumSData=0;
        try
        {
        inNumSData = this.serialPort1.BytesToRead;


        this.lab_serial_bufin_diplay.Text = inNumSData.ToString();

        //串行數據處理
        //圖像顯示
        byte dataID = 0x00;
        double temp = this.serialPortCaculate(ref dataID);
        switch(dataID)
        {
        case TEMVAL:

        break;
        default:
        this.serialPort1.DiscardInBuffer

        ()
        break;
        }

        }
        catch
        { }


        }));
        }

        ///////接收轉換協議,接收數據時直接調用
        private double serialPortCaculate(ref byte dataID)
        {
        Byte[] BReceiveTemp = new Byte[RECEIVE_LENTH];
        for (int i = 0; i RECEIVE_LENTH; i++)//接收定長數據字符串
        {
        BReceiveTemp[i] = Convert.ToByte(this.serialPort1.ReadByte());
        }
        dataID=BReceiveTemp[1];
        switch (BReceiveTemp[1])
        {
        case TEMVAL:
        default :
        }
        }


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 岳阳市| 武安市| 宝鸡市| 贵南县| 交城县| 大兴区| 新蔡县| 鄂托克旗| 邵阳市| 射阳县| 鲁山县| 易门县| 台北县| 游戏| 台安县| 岳阳市| 诸暨市| 凤城市| 兴义市| 稻城县| 昌乐县| 呼和浩特市| 天祝| 祁阳县| 克什克腾旗| 山阳县| 荥阳市| 化德县| 天门市| 富锦市| 勐海县| 辉南县| 吉首市| 改则县| 交城县| 鄂尔多斯市| 奇台县| 武安市| 永嘉县| 高唐县| 大竹县|