<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 實(shí)現(xiàn)單片機(jī)與PC機(jī)多機(jī)通訊的程序

          實(shí)現(xiàn)單片機(jī)與PC機(jī)多機(jī)通訊的程序

          作者: 時(shí)間:2016-11-30 來源:網(wǎng)絡(luò) 收藏

          /*-------------------------------- 多機(jī)通信協(xié)議格式 ------------------------------------*/
          /* 數(shù)據(jù)包的格式如下所示(共10個字節(jié)組成): */
          /* 0x2A,0xEB,0x8D,地址碼,指令碼,數(shù)據(jù)長度碼,數(shù)據(jù)碼,數(shù)據(jù)碼,校驗(yàn)碼,0xAD */
          void Data_analysis()
          {
          static uchar recdata_sum=0; //存放累加和
          static uchar lencnt=0; //數(shù)據(jù)長度計(jì)數(shù)器
          switch(state_flag)
          {
          case 0:
          {
          if(rec_data == 0x2A) // 是否幀頭第一個數(shù)據(jù)
          state_flag = 1;
          else
          state_flag = 0; // 標(biāo)志復(fù)位
          break;
          }
          case 1:
          {
          if(rec_data == 0xEB) // 是否幀頭第二個數(shù)據(jù)
          state_flag = 2;
          else
          state_flag = 0; //標(biāo)志復(fù)位
          break;
          }
          case 2:
          {
          if(rec_data == 0x8D) // 是否幀頭第三個數(shù)據(jù)
          state_flag = 3;
          else
          state_flag = 0; // 標(biāo)志復(fù)位
          break;
          }
          case 3:
          {
          if(rec_data == ID) // 判斷目的地址是否正確
          {
          state_flag = 4;
          recdata_sum=rec_data; //開始累加
          }
          else
          state_flag = 0; //標(biāo)志復(fù)位
          break;
          }
          case 4:
          {
          state_flag = 5;
          cmd=rec_data; //指令碼存儲
          recdata_sum+=rec_data; //累加
          break;
          }
          case 5:
          {
          lencnt = 0; //數(shù)據(jù)長度計(jì)數(shù)器清零
          data_count=rec_data; //數(shù)據(jù)長度碼存儲
          recdata_sum+=rec_data; //累加
          if (data_count!=0) //后面有數(shù)據(jù)碼
          state_flag=6;
          else
          state_flag=8;
          break;
          }
          case 6:
          case 7:
          {
          Data[lencnt++]=rec_data; //數(shù)據(jù)碼保存
          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) //數(shù)據(jù)校驗(yàn),判斷累加和是否相等
          state_flag=9;
          else
          {
          retval=1; //置錯誤標(biāo)志,數(shù)據(jù)包傳送不正確。
          state_flag=0;
          }
          recdata_sum=0;//累加和清零
          break;
          }
          case 9:
          {
          if (rec_data==0xAD)
          {
          retval=2; //置接收成功標(biāo)志,數(shù)據(jù)包傳送成功。
          state_flag=0;
          }
          else
          state_flag=0;
          break;
          }

          本文引用地址:http://www.ex-cimer.com/article/201611/323815.htm

          }
          }

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


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

          retval=0; //標(biāo)志清零,防止重復(fù)掃描,重復(fù)執(zhí)行。 2013/9/24
          break;

          }
          case 2: //數(shù)據(jù)發(fā)送成功,執(zhí)行命令
          {
          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; //標(biāo)志清零,防止重復(fù)掃描,重復(fù)執(zhí)行。
          }
          }


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

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


          上一頁 1 2 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();