⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 使用IAR编译器开发的ATmega128的程序 有串口通信 IO口控制 定时器 SPI接口等等功能的实现
💻 C
📖 第 1 页 / 共 2 页
字号:
                else
                if(*pcPkt==(INT8U)0x05)
                {
                *pcDstPkt=0xf5;
                j++;
                }
                else//出现了非法字符,忽略本条指令
                return 0;
                pcDstPkt++;
                pcPkt++;
          }
      }
      return j;
}
//链路数据编码
//参数:Src:编码前数据;SrcLength:编码前数据长度;Dst:编码后数据
//返回编码后数据长度
INT8U Encode(INT8U *rcvbuf,INT8U *DstBuf,INT8U length,INT8U *Dstlength)
{
      INT8U i=0,j=0;
      INT16U sum=0;
      for(i=0;i<length;i++)
          sum+=*(rcvbuf+i);
      *DstBuf=0xf0;
      j++;
      DstBuf++;
      *DstBuf=length;
      j++;
      DstBuf++;
      for(i=0;i<length;i++)//将有效数据进行转义
      {
            if((*rcvbuf!=(INT8U)0xf0)&&(*rcvbuf!=(INT8U)0xf5)&&(*rcvbuf!=(INT8U)0xff))
            {  
                  *DstBuf=*rcvbuf;
                  DstBuf++;
                  rcvbuf++;
                  j++;
            }
            else if(*rcvbuf==(INT8U)0xf0)
            {            
                  *DstBuf=0xf5;
                  DstBuf++;
                  j++;
                  *DstBuf=0x00;
                  DstBuf++;
                  j++;
                  rcvbuf++;
            }
             else if(*rcvbuf==(INT8U)0xff)
            {            
                  *DstBuf=0xf5;
                  DstBuf++;
                  j++;
                  *DstBuf=0x0f;
                  DstBuf++;
                  j++;
                  rcvbuf++;
            }
            else if(*rcvbuf==(INT8U)0xf5)
            {            
                  *DstBuf=0xf5;
                  DstBuf++;
                  j++;
                  *DstBuf=0x05;
                  DstBuf++;
                  j++;
                  rcvbuf++;
            }
          
      }    
      sum=sum&0xff;
      if((sum!=(INT16U)0xf0)&(sum!=(INT16U)0xff)&(sum!=(INT16U)0xf5))//对校验和进行判断 是否需要转义
      {
                  *DstBuf=(INT8U)sum;
                  DstBuf++;
                  j++;
      }else if(sum==(INT8U)0xf0)
      {
                  *DstBuf=0xf5;
                  DstBuf++;
                  j++;
                  *DstBuf=0x00;
                  DstBuf++;
                  j++;
      }
      else if(sum==(INT8U)0xff)
      {
                  *DstBuf=0xf5;
                  DstBuf++;
                  j++;
                  *DstBuf=0x0f;
                  DstBuf++;
                  j++;
      }
      else if(sum==(INT8U)0xf5)
      {
                  *DstBuf=0xf5;
                  DstBuf++;
                  j++;
                  *DstBuf=0x05;
                  DstBuf++;
                  j++;
      }
      *DstBuf=0xff;
      DstBuf++;
      j++;
      *Dstlength=j;
  
      return 1;
}
void USARTCammandPro(INT8U *pCmdBuf,INT8U CmdLength)
{
      if(CmdLength<5)
           return ;
      if(*(pCmdBuf+2)==(INT8U)0xa1)//继电器操作
      {                              //附加参数1:需要操作的继电器的编号
                                    // 附加参数2:0FH打开00H关闭
          switch(*(pCmdBuf+3))
          {
              case (INT8U)0x0://00H零气
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    ZEROAIROPEN
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    ZEROAIRCLOSE
                  break;
  
              case (INT8U)0x1://01H空气
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    COMAIROPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    COMAIRCLOSE;
                  break;
                          
              case (INT8U)0x2://02H 一通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL1OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL1CLOSE;
                  break;
                  
              case (INT8U)0x3://03H 二通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL2OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL2CLOSE;
                  break;
                  
              case (INT8U)0x4: //04H 三通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL3OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL3CLOSE;
                  break;
                  
              case (INT8U)0x5: //05H 四通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL4OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL4CLOSE;
                  break;
                  
              case (INT8U)0x6://06H 五通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL5OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL5CLOSE;
                  break;
                  
              case (INT8U)0x7://07H 六通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL6OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL6CLOSE;
                  break;
                  
              case (INT8U)0x8://08H 七通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL7OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL7CLOSE;
                  break;
              case (INT8U)0x9://09H 八通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL8OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL8CLOSE;
                  break;
              case (INT8U)0xa://0aH 九通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL9OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL9CLOSE;
                  break;
                  
              case (INT8U)0xb://0bH 十通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    CHANNEL10OPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    CHANNEL10CLOSE;
                  break;
              case (INT8U)0xc: //0cH进气室
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    AIRROOMOPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    AIRROOMCLOSE;
                  break;    
              case (INT8U)0xd://0dH 排气通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    AIROUTOPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    AIROUTCLOSE;
                  break;
                
              case (INT8U)0xe://0EH 排水通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    WATEROUTOPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    WATEROUTCLOSE;
                  break;
              case (INT8U)0xf://0FH 所有15个通道
                  if(*(pCmdBuf+4)==(INT8U)0x0f)
                    ALLOPEN;
                  if(*(pCmdBuf+4)==(INT8U)0x00)
                    ALLCLOSE;
                  break;
          }
          
      }  
      if(*(pCmdBuf+2)==(INT8U)0xa2)//查询继电器状态
      {
          INT8U Cmd[4];
          Cmd[0]=0xe2;
          Cmd[1]=PINC;
          Cmd[2]=PINA;
          USARTSendCammand(Cmd,3);
      }
      if(*(pCmdBuf+2)==(INT8U)0xb1)//汽缸控制
      {
        if((*(pCmdBuf+3)==(INT8U)0x0f)&&(*(pCmdBuf+4)<(INT8U)0x03))
        {
          MotorCtlFlag=1;
          MotorStep=(*(pCmdBuf+4))-1;
        }
        if(*(pCmdBuf+3)==(INT8U)0x00)
          MotorCtlFlag=2;
      }
      if(*(pCmdBuf+2)==(INT8U)0xc1)//测电压
      {
        VoltageSampleFlag=(INT8U)1;
      }
      if(*(pCmdBuf+2)==(INT8U)0xc2)//停止测电压
        VoltageSampleFlag=(INT8U)0;
      
}
void USARTSendCammand(INT8U *pCmdBuf,INT8U CmdLength)
{
      INT8U CodedCmd[30],CodedLength=0;
      Encode(pCmdBuf,CodedCmd,CmdLength,&CodedLength);
      for(int i=0;i<CodedLength;i++)
        USARTSendChar(CodedCmd[i]);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -