📄 update.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 + -