新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 實現單片機與PC機多機通訊的程序

        實現單片機與PC機多機通訊的程序

        作者: 時間:2016-11-30 來源:網絡 收藏

        /*-------------------------------- 多機通信協議格式 ------------------------------------*/
        /* 數據包的格式如下所示(共10個字節組成): */
        /* 0x2A,0xEB,0x8D,地址碼,指令碼,數據長度碼,數據碼,數據碼,校驗碼,0xAD */
        void Data_analysis()
        {
        static uchar recdata_sum=0; //存放累加和
        static uchar lencnt=0; //數據長度計數器
        switch(state_flag)
        {
        case 0:
        {
        if(rec_data == 0x2A) // 是否幀頭第一個數據
        state_flag = 1;
        else
        state_flag = 0; // 標志復位
        break;
        }
        case 1:
        {
        if(rec_data == 0xEB) // 是否幀頭第二個數據
        state_flag = 2;
        else
        state_flag = 0; //標志復位
        break;
        }
        case 2:
        {
        if(rec_data == 0x8D) // 是否幀頭第三個數據
        state_flag = 3;
        else
        state_flag = 0; // 標志復位
        break;
        }
        case 3:
        {
        if(rec_data == ID) // 判斷目的地址是否正確
        {
        state_flag = 4;
        recdata_sum=rec_data; //開始累加
        }
        else
        state_flag = 0; //標志復位
        break;
        }
        case 4:
        {
        state_flag = 5;
        cmd=rec_data; //指令碼存儲
        recdata_sum+=rec_data; //累加
        break;
        }
        case 5:
        {
        lencnt = 0; //數據長度計數器清零
        data_count=rec_data; //數據長度碼存儲
        recdata_sum+=rec_data; //累加
        if (data_count!=0) //后面有數據碼
        state_flag=6;
        else
        state_flag=8;
        break;
        }
        case 6:
        case 7:
        {
        Data[lencnt++]=rec_data; //數據碼保存
        recdata_sum+=rec_data; //累加
        if(lencnt==data_count)
        {
        state_flag=8;
        lencnt = 0;
        }

        else
        state_flag=7;
        break;
        }
        case 8:
        {
        if(recdata_sum==rec_data) //數據校驗,判斷累加和是否相等
        state_flag=9;
        else
        {
        retval=1; //置錯誤標志,數據包傳送不正確。
        state_flag=0;
        }
        recdata_sum=0;//累加和清零
        break;
        }
        case 9:
        {
        if (rec_data==0xAD)
        {
        retval=2; //置接收成功標志,數據包傳送成功。
        state_flag=0;
        }
        else
        state_flag=0;
        break;
        }

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

        }
        }

        //主程序 , 不斷掃描串口接收到的命令
        void main()
        {
        PortInit(); //各端口初始化
        TimerInit(); //定時器初始化
        UsartInit(); //串口初始化
        Send(0xce);
        Send(0x7b);
        Send(0x00);
        Send(0xed);
        while(1)
        {
        usart_cmd_scan(); //串口命令掃描
        }
        }


        /*
        *函數名:usart_cmd_scan
        * 描 述:串口命令掃描
        * 輸 入:無
        * 輸 出:無
        * 備 注:掃描PC通過串口發送的命令
        */
        void usart_cmd_scan()
        {
        uchar sendcmd; //下位機向PC發送的命令碼
        switch(retval)
        {
        case 1: //數據發送錯誤,請求PC重發
        {
        sendcmd=2; //向PC發送的重發數據命令,PC識別后向下位機重發數據包。
        Send(0xce);
        Send(0x7b);
        Send(sendcmd);
        Send(0xed); //向PC發送命令

        retval=0; //標志清零,防止重復掃描,重復執行。 2013/9/24
        break;

        }
        case 2: //數據發送成功,執行命令
        {
        switch(cmd) //命令解碼
        {
        case 0x01:
        {
        Send(0xce);
        Send(0x7b);
        Send(0x11);
        Send(0xed);
        cmd=0x00;
        break;
        }
        case 0x02:
        {
        Send(0xce);
        Send(0x7b);
        Send(0x12);
        Send(0xed);
        cmd=0x00;
        break;
        }
        case 0x03:
        {
        Send(0xce);
        Send(0x7b);
        Send(0x13);
        Send(0xed);
        cmd=0x00;
        break;
        }
        }
        }
        retval=0; //標志清零,防止重復掃描,重復執行。
        }
        }


        /*
        * 函數名:Send
        * 描 述:串口數據發送函數
        * 輸 入:sendcmd - 待發送的數據
        * 輸 出:無
        * 備 注:
        */
        void Send(uint8 sendcmd)
        {
        ES=0; //關閉串口
        SBUF=sendcmd; //發送數據,向PC發送。
        while(!TI);
        TI=0; //發送完成,TI清零
        ES=1; //開串口
        }

        以上是我寫的這個程序,希望大家指點一下。
        程序運行整體可以,但是有個問題,也希望大神們能幫忙看一下什么問題
        每次在單片機關機后,再重新上電后,發送都沒反應,只有手動按下開發板的復位鍵后才能正常通信,當再次斷電上電后,又不行了,又得按復位鍵才正常。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 武平县| 榆林市| 多伦县| 亚东县| 武宣县| 上饶市| 阿拉尔市| 金沙县| 肥东县| 晴隆县| 西乌珠穆沁旗| 乳源| 巴东县| 肥乡县| 武川县| 榆社县| 泰顺县| 上高县| 铜陵市| 泰来县| 临汾市| 唐海县| 台湾省| 武胜县| 乐平市| 涿鹿县| 轮台县| 昭觉县| 宁都县| 阿克陶县| 屯昌县| 扶余县| 康定县| 股票| 五河县| 保靖县| 梁河县| 西盟| 黄山市| 德州市| 綦江县|