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

  • <dfn id="79stg"></dfn>
    <object id="79stg"><div id="79stg"><label id="79stg"></label></div></object>
    <ruby id="79stg"><dl id="79stg"><noscript id="79stg"></noscript></dl></ruby>

      新聞中心

      EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 采用MSP430地址位多機協(xié)議通訊程序

      采用MSP430地址位多機協(xié)議通訊程序

      作者: 時間:2016-11-13 來源:網(wǎng)絡 收藏
      /*
      采用MSP430地址位多機協(xié)議通訊程序
      微控論壇原創(chuàng)作品 作者:tianxy
      各位同仁,響應版主號召,現(xiàn)就"愛好者"同志提出的<<關于UART的地址位多機通訊>>做出本人的見解.希望大家多多指點.
      430串口發(fā)送格式中,我們可以看到.一個字節(jié)由1個起始位+7位或8位數(shù)據(jù)位+校驗位+1位或2位停止組成.如果要使用
      430的地址位多機協(xié)議.主要是將UxCTL寄存器中的MM位置1,同時將UxRCTL寄存器中的URXWIE置1.
      例程如下:
      上位機先用Mark校驗方式.格式為:1個起始位+8位數(shù)據(jù)位+1位校驗位+1位停止位.
      發(fā)送5個字節(jié):0x02(地址號) 0x05(命令字節(jié)) 0x00(預留字節(jié)) 0x07(累加和校驗低字節(jié)) 0x00(累加和校驗高字節(jié))
      單片機接收程序如下,同時將收到的數(shù)據(jù)再返回給上位機.
      程序中所使用的變量.請自行定義.有標注說明.

      Microcontrol CODE
      */
      void COM_Init(void)
      {
      //---------------------------------串口初始化函數(shù)
      U0CTL &= ~SWRST;
      U0TCTL&=~TXWAKE;
      U0CTL|=CHAR+MM;//8bit+地址位多機協(xié)議
      IFG1&=~(URXIFG0+UTXIFG0);//接收,發(fā)送中斷標志清零
      ME1|=(UTXE0+URXE0); //使能接收和發(fā)送中斷
      U0TCTL|=SSEL0+SSEL1; //時鐘選擇--MCLK
      UBR10=0x04;//6M/4800
      UBR00=0xe2;
      UMCTL0=0x00;//波特率調(diào)整控制
      IE1|=URXIE0;//使能接收中斷
      URCTL0|=URXWIE;//只有收到地址字符時才永許中斷
      }

      #pragma vector=USART0RX_VECTOR//接收中斷處理
      __interrupt void USART0RX(void)
      {
      // addr為本機地址號
      unsigned char date,date1;
      _EINT();
      if((URCTL0&0x21)==BIT0)//RXERR
      {
      //出現(xiàn)錯誤且該錯誤非溢出引起
      URCTL0=URXWIE;//只有收到地址字符時才允許中斷
      ought_receive=0;//應接收個數(shù)變量
      mling_flag=0; //命令標志變量
      order=0;//命令變量
      date=RXBUF0;
      }
      else
      {
      date=RXBUF0;
      URCTL0&=~RXERR;//接收錯誤清零
      if(URCTL0&URXWIE)//接受到地址位否?
      {
      if(date==addr)
      {
      URCTL0&=~URXWIE;
      jieshou_ljh=date;
      }

      order=0;
      ought_receive=0;
      mling_flag=0;
      }
      else//接受命令、數(shù)據(jù)
      {
      date1=date;
      if((mling_flag&0x01)==0x00)
      {
      order=date;
      jieshou_ljh+=date;//計算累加和
      switch(date)
      {
      case 0x05://命令
      ought_receive=3;//除命令字節(jié)外還要接收3個字節(jié)
      fmaddr=0;
      mling_flag|=0x01;//已收到命令字節(jié),下一字節(jié)應為數(shù)據(jù)
      break;

      default:
      URCTL0=URXWIE;
      ought_receive=0;
      order=0;
      mling_flag=0;
      jieshou_ljh=0;
      P2OUT&=~BIT7;
      break;
      }
      }
      else
      {
      if(ought_receive==0)//接收出錯
      {
      URCTL0|=URXWIE;//只有收到地址字符時才永許中斷
      date1=RXBUF0;
      P2OUT&=~BIT7;//RS485 控制信號
      jieshou_ljh=0;
      order=0;
      mling_flag=0;
      }
      else
      {
      if(ought_receive==2)//收到累加和的低位
      {
      ought_receive=1;
      txy=date;
      }
      else if(ought_receive==1)//收到累加和的高位,表示接收完畢,可以處理并發(fā)送數(shù)據(jù)
      {
      P2OUT|=BIT7;//RS485 控制信號
      ought_receive=0;
      date1=(unsigned char)txy;//計算累加和.
      txy=(unsigned int)date;
      txy<<=8;
      txy|=date1;
      _NOP();
      if(jieshou_ljh==txy)
      {
      IE1&=~URXIE0;//關閉接收中斷
      ME1|=UTXE0;//USART0允許發(fā)送數(shù)據(jù)
      UTCTL0|=TXWAKE;//USART0發(fā)送地址位
      ME1|=UTXE0;//USART0允許發(fā)送
      IFG1&=~(UTXIFG0+URXIFG0);
      TXBUF0=addr;//--------------------------------------------------------地址
      while((UTCTL0&BIT0)==0);//當發(fā)送空時,TXEPT=1
      TXBUF0=order;//--------------------------------------------------------命令
      while((UTCTL0&BIT0)==0);//當發(fā)送空時,TXEPT=1
      TXBUF0=0x00;//--------------------------------------------------------預留
      while((UTCTL0&BIT0)==0);//當發(fā)送空時,TXEPT=1
      TXBUF0=0x07;//--------------------------------------------------------累加和低
      while((UTCTL0&BIT0)==0);//當發(fā)送空時,TXEPT=1
      TXBUF0=0x00;//--------------------------------------------------------累加和高
      while((UTCTL0&BIT0)==0);//當發(fā)送空時,TXEPT=1
      ME1&=~UTXE0;//開始下一次數(shù)據(jù)幀接收
      ME1|=URXE0;
      IE1&=~(UTXIE0+URXIE0);
      IFG1&=~(UTXIFG0+URXIFG0);
      ought_receive=0;
      jieshou_ljh=0;
      URCTL0=URXWIE;
      IE1|=URXIE0;
      mling_flag=0;
      P2OUT&=~BIT7;//轉(zhuǎn)為收
      }
      }
      else if(ought_receive>2)
      {
      ought_receive--;
      jieshou_ljh+=date;//計算累加和.
      receive_buf[fmaddr]=date;//數(shù)據(jù)存放數(shù)組
      fmaddr++;
      }
      }
      }
      }
      }
      }


      評論


      技術專區(qū)

      關閉