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

📄 update.c

📁 源码
💻 C
字号:
#include "71x_lib.h"
#include "SendPWM.h"
#include "Update.h"
#include "main.h"
#include "UartPort.h"
//同步头开始位置
#define IDB8962A_PosH              2                          
#define IDB8968D_PosH              2                                              
#define ID912066_PosH             29                                      
#define ID911FE5_PosH             29                                      
#define ID216843_PosH             29                                                        
#define ID882DCD85_PosH	          4
#define ID53785060_PosH           16
#define ID53774200_PosH           16
#define ID84B1676_PosH            31
#define ID115DD5C0_PosH           31
//数据开始位置
#define IDB8962A_PosD             60                         
#define IDB8968D_PosD             60                                             
#define ID912066_PosD             85                                     
#define ID911FE5_PosD             85                                      
#define ID216843_PosD             85                                                        
#define ID882DCD85_PosD	          108
#define ID53785060_PosD	          84
#define ID53774200_PosD           84
#define ID84B1676_PosD            113
#define ID115DD5C0_PosD           113
//同步头长度
#define IDB8962A_HLen              5                          
#define IDB8968D_HLen              5                                              
#define ID912066_HLen              4                                      
#define ID911FE5_HLen              4                                      
#define ID216843_HLen              4                                                        
#define ID882DCD85_HLen	          20
#define ID53785060_HLen	          2
#define ID53774200_HLen	          2
#define ID84B1676_HLen	          1
#define ID115DD5C0_HLen	          1
//u8 UartRxBuf[]={0xfA,0x80,0xff};
u8 NewArr[250];
/*=========================================================================
函数名:Encode
输入:IDNo,传感器编号
输出:无
功能:根据传感器类型的曼码或非曼码,将串口接收的数据编码成‘1’‘0’
==========================================================================*/
void EnCode(u8 IDNo)
{
  u8 i;
 for(i=0;i<150;i++)
    NewArr[i] = 0x00;
 switch(IDNo)
 {
  case IDB8962A:
  case IDB8968D:
  EnCodePWM();//PWM 编码
  break;
  case ID912066:
  case ID911FE5:
  case ID216843:
  case ID84B1676:
  case ID115DD5C0:
  EnCodeMAN();//曼彻斯特编码
  break;
  case ID882DCD85:
  EnCodeDMAN(IDNo,ID882DCD85_PosH);  
  break;
  case ID53774200:
  EnCodeDMAN(IDNo,ID53774200_PosH); 
  break;
  case ID53785060:
  EnCodeDMAN(IDNo,ID53785060_PosH);//差分曼码编码
  break;
  default:
  break;
}

}
/*=========================================================================
函数名:EnCodePWM
输入:无
输出:无
功能:将串口接收的数据编码成PWM码1为‘1’0为‘0’
==========================================================================*/
void EnCodePWM(void)
{
  u8 Temp;
  u8 j=0,i=1;
  
 while(UartRxBuf[i]!=0xff)//判断是否为结束字节
  {
    Temp = UartRxBuf[i];
    for(j=0;j<8;j++)//判断8个位
    {
    if(Temp&0x80)
      NewArr[(i-1)*8+j] = '1';//第i个字节的第j位编码
    else
      NewArr[(i-1)*8+j] = '0';
    Temp = Temp<<1;//编码下个位
    }
    i++;//i++应在此,若在while判断中使用则temp得到的第一数就是buf中的第2个
  }
   NewArr[(i-1)*8] = '\0';

}

/*=========================================================================
函数名:EnCodeMAN
输入:无
输出:无
功能:将串口接收的数据编码成MAN码1为‘1’‘0’0为‘0’‘1’
==========================================================================*/
void EnCodeMAN(void)
{
 u8 Temp,j=0,i=1;
 u8 k;
  while(UartRxBuf[i]!=0xff)//判断是否为结束字节
  {
    Temp = UartRxBuf[i];
    for(k=0;k<8;k++)//判断8个位,曼码编码1位编码成两位
    {
       if(Temp&0x80)//1->'1''0'
        {
          NewArr[(i-1)*16+j++] = '1';
          NewArr[(i-1)*16+j++] = '0';
        }
       else //0->'0''1'
        {
          NewArr[(i-1)*16+j++] = '0';
          NewArr[(i-1)*16+j++] = '1';
        }
        Temp = Temp<<1;//编码下个位
    }
    j = 0;
    i++;//取下字节编码
  } 
  NewArr[(i-1)*16] = '\0';
}
/*==============================================================================
函数名:EnCodeDMAN
输入:无
输出:无
功能:将串口接收的数据编码成DMAN码1为‘1’‘0’0为‘0’‘1’
===============================================================================*/

void EnCodeDMAN(u8 IDNo,u8 Pos)
{
  u8 PreDMAN[2];
  u8 Temp,k;
  u8 j,i;
  u16 *ArrP;

  j = 0;
 
  switch(IDNo)//找到要替换的数组
  {
  case ID882DCD85:
    ArrP = ArrID882DCD85; 
      break;
    
  case ID53785060:
    ArrP = ArrID53785060;
    break;
    
  case ID53774200:
    ArrP = ArrID53774200;
     break;
  default:
    break;
  }
  
  i = 1;
  if(*(ArrP+Pos-1)&0xf000)//找到要替换位置的前一个数
  {
  PreDMAN[0] = '0';//若替换位置前一个为0xxx,fxxx.则前编码为01
  PreDMAN[1] = '1';
  }
  else//若替换位置前一个为fxxx,0xxx,则前编码为10
  {
  PreDMAN[0] = '1';
  PreDMAN[1] = '0'; 
  }
  while(UartRxBuf[i]!=0xff)//循环取要替换的数,
  {
    Temp = UartRxBuf[i];
    for(k=0;k<8;k++)
    {
      if(Temp&0x80)//若为逻辑1
        {
          if((j == 0)&&(i == 1))//若为编码数组的前两个字节,则按PreDAM编码
          {
            NewArr[0] = (PreDMAN[0] == '1'?'0':'1');//按PreDMAN中反转
            NewArr[1] = (PreDMAN[1] == '1'?'0':'1');
            j = 2;
          }
          else 
          {         //此处原为NewArr[i*16+j++] = NewArr[i*16+j-2];
            j++;    //        NewArr[i*16+j++] = NewArr[i*16+j-4]编译有警告,“先使用后改变,顺序不对”,
                    //因编译器是从右计算的,所以将j++提出来先计算    
            NewArr[(i-1)*16+j-1] = NewArr[(i-1)*16+j-2];//新编码前字为前编码后字01->10,10->01
            j++;
            NewArr[(i-1)*16+j-1] = NewArr[(i-1)*16+j-4];//新编码后字为前编码前字
          }
        }
       else //0->'0''1'
        {
          if((j == 0)&&(i == 1))
          {
            NewArr[0] = PreDMAN[0] ;//维持PreDMAN
            NewArr[1] = PreDMAN[1] ;
            j = 2;
          }
          else 
          {
            j++;
            NewArr[(i-1)*16+j-1] = NewArr[(i-1)*16+j-3];//新编码前字为前编码前字01 01
            j++;
            NewArr[(i-1)*16+j-1] = NewArr[(i-1)*16+j-3];//新编码后字为前编码后字,效果维持不变
          }
        
       }
        Temp = Temp<<1;//编码下个位
   }
   j = 0;
   i++;
 }
}
/*=========================================================================
函数名:UpdateData
输入:pos the begin postion to be update
      IDNo,传感器编号
输出:无
功能:按源数组将目的数组中的数替换成依据IDNo的参数
==========================================================================*/
 void UpdateData(u8 IDNo)
{
  EnCode(IDNo);//编码
  switch (IDNo) 
  {
  case IDB8962A:
    UpdatePWM(ArrIDB8962A,T_IDB8962A_H,T_IDB8962A_L,IDB8962A_PosH,IDB8962A_HLen);//替换数据
    break;
  case IDB8968D:
    UpdatePWM(ArrIDB8968D,T_IDB8968D_H,T_IDB8968D_L,IDB8968D_PosH,IDB8968D_HLen);//替换数据
    break;
  case ID912066:
    UpdateNPWM(ArrID912066,T_ID912066_H,T_ID912066_L,ID912066_PosH,ID912066_HLen);//替换数据
    break;
  case ID911FE5:
    UpdateNPWM(ArrID911FE5,T_ID911FE5_H,T_ID911FE5_L,ID911FE5_PosH,ID911FE5_HLen);//替换数据
    break;
  case ID216843:
    UpdateNPWM(ArrID216843,T_ID216843_H,T_ID216843_L,ID216843_PosH,ID216843_HLen);//替换数据
    break;
  case ID53785060:
    UpdateNPWM(ArrID53785060,T_ID53785060_H,T_ID53785060_L,ID53785060_PosH,ID53785060_HLen);//替换数据
    break;
  case ID53774200:
    UpdateNPWM(ArrID53774200,T_ID53774200_H,T_ID53774200_L,ID53774200_PosH,ID53774200_HLen);//替换数据
    break;
  case ID882DCD85:
    UpdateNPWM(ArrID882DCD85,T_ID882DCD85_H,T_ID882DCD85_L,ID882DCD85_PosH,ID882DCD85_HLen);//替换数据
    break;
   case ID84B1676:
    UpdateNPWM(ArrID84B1676,T_ID84B1676_H,T_ID84B1676_L,ID84B1676_PosH,ID84B1676_HLen);//替换数据
    break;
   case ID115DD5C0:
    UpdateNPWM(ArrID115DD5C0,T_ID115DD5C0_H,T_ID115DD5C0_L,ID115DD5C0_PosH,ID115DD5C0_HLen);//替换数据
    break;
  default:
    break;
  }    

}
/*=========================================================================
函数名:UpdateNPWM---非PWM波形替换
输入:u16 *DesArr,要被替换的数组
      u8 Time,脉冲时间
      u8 Pos,替换的开始位置
输出:无
功能:按NEWARR的高低替换数组,NEWARR中已是分解后的高低电平变化,不再是码形
      NEWARR中‘1’‘0’对应波形的高电平和低电平
==========================================================================*/
 void UpdateNPWM(u16 *DesArr,u16 TimeH,u16 TimeL,u8 PosH,u8 HeadLen)
{
  u8 *SrcArr,i;
  u16 *TempDes;
//u8 NewArr1[]={'0','1','1','0','1','0','1','0','0','0','1','1','1','1','1','1','\0'};//调试用
  TempDes = DesArr;
  SrcArr = NewArr;
  DesArr = TempDes + PosH;
  for(i=0;i<HeadLen*2;i++)//更新同步头
  {
    if(*SrcArr == '1')
      *DesArr = TimeH|0xf000;
    else
      *DesArr = TimeL&0x0fff;
    SrcArr++;
    DesArr++;
  }

  SrcArr = NewArr+(HeadLen/8+(HeadLen%8?1:0))*16;//定位编码后数据开始位置,1位逻辑编码后为2位
  while(*SrcArr!='\0')//更新数据                  //不足一字节,补成一字节
  {
    if(*SrcArr == '1')
      *DesArr = TimeH|0xf000;
    else
      *DesArr = TimeL&0x0fff;
    SrcArr++;
    DesArr++;
    if((*DesArr == 0xffff))//到原始数组的末尾,或指定个数替换完毕则不再替换
    break;
    
  }
      
}


/*=========================================================================
函数名:UpdatePWM---PWM波形替换
输入:u16 *DesArr,要被替换的数组
      u8 Time,脉冲时间
      u8 Pos,替换的开始位置
输出:无
功能:按NEWARR的高低替换数组,NEWARR中是PWM编码中的逻辑1,0
      NEWARR中‘1’‘0’对应波逻辑1和逻辑0
==========================================================================*/
void UpdatePWM(u16 *DesArr,u16 TimeH,u16 TimeL,u8 PosH,u8 HeadLen)
{
  u8 *SrcArr;
  u16 *TempDes;
  u8 i;
 // u8 NewArr1[]={'0','0','1','1','1','0','1','0','0','0','1','1','1','1','1','1','\0'};
  SrcArr = NewArr;
  TempDes = DesArr;
  DesArr = PosH + TempDes;
  for(i=0;i<HeadLen;i++)//更新同步头
  {
     if(*SrcArr == '1')
    {
      *(DesArr++) = TimeH|0xf000;
      *(DesArr++) = TimeL&0x0fff;
    }
    else
    {
      *(DesArr++) = TimeL|0xf000;
      *(DesArr++) = TimeH&0x0fff;
    }
    SrcArr++;
  }
  *(DesArr-1) += 0x0230;

  SrcArr = NewArr+(HeadLen/8+(HeadLen%8?1:0))*8;
  while(*SrcArr!='\0')//更新数据
  {
    if(*SrcArr == '1')
    {
      *(DesArr++) = TimeH|0xf000;
      *(DesArr++) = TimeL&0x0fff;
    }
    else
    {
      *(DesArr++) = TimeL|0xf000;
      *(DesArr++) = TimeH&0x0fff;
    }
    
    if((*DesArr == 0xffff))//到原始数组的末尾,或指定个数替换完毕则不再替换
      break;
    SrcArr++;
  }
}

⌨️ 快捷键说明

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