📄 test.c
字号:
}
else
{
serial.status = 0x00;
serial.token = 0x00;//初始化报文
}
break;
case 0x01 :
if(ch==0xAA)
{
serial.status = 0x02;
RX_index=0;
}
else
{
serial.status = 0x00;
serial.token = 0x00;//初始化报文
}
break;
case 0x02 : //接收数据长度 2byte
RX_temp[RX_index]=ch;
RX_index++;
if(RX_index==2) //接收到第二个数据时,开始进行第1步判断
{
serial.len = RX_temp[1]*256+RX_temp[0];
serial.status = 0x03;
RX_index=0;
if(serial.len>SIZE_IN_BUFFER) serial.token = 0xF0;
}
break;
case 0x03 ://接收 reserved 数据
RX_index++;
if(RX_index==2) //接收到第二个数据
{
serial.status = 0x04;
RX_index=0;
}
break;
case 0x04 ://接收CRC 2byte
RX_temp[RX_index]=ch;
RX_index++;
if(RX_index==2) //接收到第二个数据时,开始进行第1步判断
{
serial.CRC = RX_temp[1]*256+RX_temp[0];
serial.status = 0x05;
RX_index=0;
}
break;
case 0x05 ://接收 L3 层的数据
if(serial.Addr<serial.len) {
RXData[serial.Addr++]=ch;
}
if(serial.Addr==serial.len){
OSSemPost(EventSem1);
asm{
NOP
};
}
break;
default : break;
}
}
OSIntExit();
}
word CRC_16(byte *ptr, word len) {
register word crc=0xFFFF;
register byte da;
while(len--!=0) {
da=(byte) (crc>>8); // 以8 位二进制数的形式暂存CRC 的高8 位
crc<<=8; // 左移8 位,相当于CRC 的低8 位乘以28
crc^=crc_ta[da^*ptr]; // 高8 位和当前字节相加后再查表求CRC ,再加上以前的CRC
ptr++;
}
return(crc);
}
//剔出AA 00 AA 中的00
void demodulation(byte *s,word str_len)
{
byte flag=0;
word k;
word j;
if(str_len<6) return;
for(k=0;k<str_len;k++)
{
if(flag!=0) //当已经设置标志位以后
{
if(s[k]==0x00){flag=2; continue; }//继续循环
else if(s[k]==0xAA) //此时应该进行插入或者删除操作
{
if(flag==2)
{
for(j=k;j<str_len;j++) {
s[j-1]=s[j]; //删除时
}
k--;
str_len--;
s[str_len]=0x00; //把最后一个值赋为0
}
}
else flag=0; // 进行下一次判断
}
if((s[k])==0xAA)
{
flag=1; //设置标志位
}
}
}
//在AA AA 中增加一个00
word modulation(byte *s,word str_len)
{
byte flag=0;
word k;
word j;
for(k=0;k<str_len;k++)
{
if(flag==1) //当已经设置标志位以后
{
if(s[k]==0xAA)
{
for(j=0;j<str_len-k+1;j++)
s[str_len+1-j]=s[str_len-j]; //删除时
s[k]=0x00;
k++;
str_len++;
}//继续循环
else if(s[k]==0x00) flag=1;
else flag=0; // 进行下一次判断
}
if((s[k])==0xAA)
{
flag=1; //设置标志位
}
}
return str_len;
}
void CommDeal(void)
{
INT8U err;
word cal_crc,Send_len;
word i;
Send_len=0;
//首先填充固定的数据
Send_toot[0]=0xAA;Send_toot[1]=0xAA; //同步字
Send_toot[4]=0x00;Send_toot[5]=0x00; //Reserved
//接下来填充其他的字段
OSSemPend(EventSem1,0,&err);
if(serial.status == 0x05) //如果接收数据到了L3层,需要进一步处理
{
serial.cmd=RXData[0]; //获得命令值
cal_crc=CRC_16(RXData,serial.len); //计算出CRC
//下一步为判断两个crc是否相等
if(cal_crc==serial.CRC)
{
demodulation(RXData,serial.len); //把L3层的数据解包
switch(serial.cmd)
{
//******M_ddu_HW_REPORT_REQ*************
case 1 ://**** M_ddu_HW_REPORT_RSP *****
Hard_respond();
//重新整理数据
Send_len=modulation(Send_Buffer,32);
//CRC的填充
cal_crc=CRC_16(Send_Buffer,Send_len);//计算出CRC
Send_toot[7]=(cal_crc>>8) & 0xFF;
Send_toot[6]=cal_crc & 0xFF; //CRC
Send_toot[3]=(Send_len>>8)&0xFF;Send_toot[2]=Send_len & 0xFF;//长度
break;
default:
//命令的填充
Send_Buffer[0]=0x17; //0-Message ID
Send_Buffer[1]=0xFF; //1-padding
Send_Buffer[2]=RXData[2]; //2
Send_Buffer[3]=RXData[3]; //3-Sequence Number
Send_Buffer[4]=0x01; //4-ACK
Send_Buffer[5]=0x04; //5-NACK Reason ( bad CMD)
Send_Buffer[6]=0x00; //6-Vendor specific error
Send_Buffer[7]=0xFF; //7-padding
Send_len=modulation(Send_Buffer,8);
//CRC的填充
cal_crc=CRC_16(Send_Buffer,Send_len);//计算出CRC
Send_toot[7]=(cal_crc>>8) & 0xFF;
Send_toot[6]=cal_crc & 0xFF; //CRC
Send_toot[3]=(Send_len>>8)&0xFF;Send_toot[2]=Send_len & 0xFF;//长度
Send_toot[7]=(cal_crc>>8) & 0xFF;
Send_toot[6]=cal_crc & 0xFF; //CRC
break;
}
//开始发送数据
TxByte(Send_toot[0]); //发送报头
TxByte(Send_toot[1]); //发送报头
TxByte(Send_toot[2]); //发送报头
TxByte(Send_toot[3]); //发送报头
TxByte(Send_toot[4]); //发送报头
TxByte(Send_toot[5]); //发送报头
TxByte(Send_toot[6]); //发送报头
TxByte(Send_toot[7]); //发送报头
for(i=0;i<Send_len;i++) TxByte(Send_Buffer[i]);//发送数据
}
}
serial.token = 0x00; //重新开始接收数据
serial.status = 0x00; //状态初始化
serial.Addr = 0x00; //存储器地址初始化
serial.CRC = 0x00; //存储器地址初始化
serial.len = 0x00; //存储器地址初始化
// err= OSMutexPost(EventMutex1);
serial.cmd = 0x00; //存储器地址初始化
}
void Hard_respond(void)
{
//命令的填充
Send_Buffer[0]=0x02; //0-Message ID
Send_Buffer[1]=0xFF; //1-padding
Send_Buffer[2]=RXData[2]; //2
Send_Buffer[3]=RXData[3]; //3-Sequence Number
Send_Buffer[4]=0x00;//4-Network type
//0x00----GSM900
//0x01----GSM1800
//0x02----GSM1900
//0x05----GSM800
//0xFF----No Info
Send_Buffer[5]=0x60; //5-Vendor ID
Send_Buffer[6]=0x00; //0x00----HW OK
Send_Buffer[7]=0xFF; //7-padding
Send_Buffer[8]='E';//8
Send_Buffer[9]='R';//9
Send_Buffer[10]='G';//10
Send_Buffer[11]='A';//11-Device type
Send_Buffer[12]=1;//12-Minor SW version
Send_Buffer[13]=1;//13-Major SW version
//version is 1.1
Send_Buffer[14]=0xFF; //14
Send_Buffer[15]=0xFF; //15-padding
Send_Buffer[16]=2; //16-Minor SW version
Send_Buffer[17]=2; //17-Major SW version
Send_Buffer[18]=0xFF; //18
Send_Buffer[19]=0xFF; //19-padding
Send_Buffer[20]='L'; //20
Send_Buffer[21]='1'; //21-Factory Code
Send_Buffer[22]='0'; //22
Send_Buffer[23]='6'; //23-Year
Send_Buffer[24]='4'; //24
Send_Buffer[25]='1'; //25-Week
Send_Buffer[26]='1'; //26
Send_Buffer[27]='2'; //27
Send_Buffer[28]='3'; //28
Send_Buffer[29]='4'; //29
Send_Buffer[30]='5'; //30-Serial number of the week
Send_Buffer[31]=0; //31-End of string character
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -