在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

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

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

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

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

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

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

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

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

            //隨后進行執(zhí)行指令

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

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

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

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

            //USART發(fā)送函數
            void USART_Transmit(unsigned char data)//發(fā)送數據函數
            {
            while(tx_counter==TX_BUFFER_SIZE);//輸出緩沖區(qū)滿,等待
            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");
            }

            //發(fā)送中斷服務程序

            ISR(USART_TXC_vect)//USART發(fā)送數據中斷
            {
            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 下一頁

            評論


            相關推薦

            技術專區(qū)

            關閉