通过大概时间来判断时序来解析码段,效率不高,暂无其他解决办法
主函数
u8 status_buffer[32];
u8 pra_buf[24];
int rec_flag;
u8 pra_buf1[130];
u8 XIANY[40];
u8 NFCdata[24];
char code[100]={0};//捕获到的数据
char *p;
char st=0;
int SN_H,SN_L,CH,US,dataNFC,animal,CRCxmode;//处理完的数据SN_L+SN_H
u8 flag_not;
int slave_add;
while(1)
{
RS485_Receive_Data(rs485buf,&lenn);
//一直扫描接收到的数据,扫描需要增加一个指令执行是否完成
if(rec_flag == 1)
{
rec_flag = 0;
}
SN_H=0,SN_L=0,CH=0,US=0;
st = read_id();
if(st == 1)//数据接收成功
{
// EM_SHD = 1;
flag_not = data_pl();
if(flag_not==1)//数据验证成功
{
data_wrangling();
memcpy( &NFCdata[0], &SN_L, 4);
memcpy( &NFCdata[4], &SN_H, 4);
memcpy( &NFCdata[8], &CH, 4);
memcpy( &NFCdata[12], &US, 4);
}
// EM_SHD = 0;
}
}
主要代码为数据的处理和时序的解析,整个.c都在这了,自取,能识别但是效率不高
#include "led.h"
#include "delay.h"
extern int TCNT1;
extern char code[100];
extern int SN_H,SN_L,CH,US,dataNFC,animal;
int CRCint_L=0,CRCint_H=0,CRCxmode_A,CRCxmode_B;
unsigned char CRCchar[8] = {0};
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PB,PE端口时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PB,PE端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //SHD
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_7);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //MOD
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //OUT
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
char read_id_start(void)
{
char code_st = 1;
char i,c_l;
while(!EM_DE_OUT);//变为1就退出
TCNT1 = 0;//清计数器计数
while(EM_DE_OUT);//变为0就退出
if(TCNT1>110&&TCNT1<150)
{
while(!EM_DE_OUT);
for(i=1;i<11;i++)
{
delay_us(20);
if(EM_DE_OUT == 1)
{
delay_us(140);
if(EM_DE_OUT == 1)
{
code[i] = 1;
while(EM_DE_OUT);
}
else
{
code[i] = 0;
while(!EM_DE_OUT);
}
}
else
{
delay_us(140);
if(EM_DE_OUT == 1)
{
code[i] = 0;
while(!EM_DE_OUT);
}
else
{
code[i] = 1;
while(EM_DE_OUT);
}
}
}
if(code[0]==0 && code[1]==0&& code[2]==0&& code[3]==0&& code[4]==0&& code[5]==0&& code[6]==0&& code[7]==0&& code[8]==0&& code[9]==0 && code[10]==1)
{
code_st = 1;
}
else
{
code_st = 0;
}
}
else
code_st = 0;
if(code_st == 1)
return 1;
else
return 0;
}
char read_id(void)
{
char st=0;
char i=0;
EM_SHD = 0;
st=read_id_start();
if(st == 1)
{
//顺序读取剩余bit
for(i=11;i<101;i++)
{
delay_us(20);
if(EM_DE_OUT == 1)
{
delay_us(143);
if(EM_DE_OUT == 1)
{
code[i] = 1;
while(EM_DE_OUT);
}
else
{
code[i] = 0;
while(!EM_DE_OUT);
}
}
else
{
delay_us(143);
if(EM_DE_OUT == 1)
{
code[i] = 0;
while(EM_DE_OUT);
}
else
{
code[i] = 1;
while(!EM_DE_OUT);
}
}
}
return 1;
}
else
return 0;
}
uint32_t reverse_32bit_int(uint32_t num)
{
// 提取原整数的四个字节(8位)
uint8_t byte1 = (uint8_t)((num & 0xFF000000) >> 24);
uint8_t byte2 = (uint8_t)((num & 0x00FF0000) >> 16);
uint8_t byte3 = (uint8_t)((num & 0x0000FF00) >> 8);
uint8_t byte4 = (uint8_t)(num & 0x000000FF);
// 倒序排列这些字节并构建新的整数
uint32_t reversed_num = ((uint32_t)byte4 << 24) | ((uint32_t)byte3 << 16) | ((uint32_t)byte2 << 8) | (uint32_t)byte1;
return reversed_num;
}
uint32_t reverse_6bit_int(uint32_t num)
{
// 提取原整数的6个bit
uint32_t bit1 = (num & 0x20) >> 5;
uint32_t bit2 = (num & 0x10) >> 4;
uint32_t bit3 = (num & 0x08) >> 3;
uint32_t bit4 = (num & 0x04) >> 2;
uint32_t bit5 = (num & 0x02) >> 1;
uint32_t bit6 = num & 0x01;
// 倒序排列这6个bit并构建新的整数
uint32_t reversed_num = (bit6 << 5) | (bit5 << 4) | (bit4 << 3) | (bit3 << 2) | (bit2 << 1) | bit1;
return reversed_num;
}
uint32_t reverse_10bit_int(uint32_t num) {
// 提取原整数的10个bit
uint32_t bit1 = (num & 0x200) >> 9;
uint32_t bit2 = (num & 0x100) >> 8;
uint32_t bit3 = (num & 0x080) >> 7;
uint32_t bit4 = (num & 0x040) >> 6;
uint32_t bit5 = (num & 0x020) >> 5;
uint32_t bit6 = (num & 0x010) >> 4;
uint32_t bit7 = (num & 0x008) >> 3;
uint32_t bit8 = (num & 0x004) >> 2;
uint32_t bit9 = (num & 0x002) >> 1;
uint32_t bit10 = num & 0x001;
// 倒序排列这10个bit并构建新的整数
uint32_t reversed_num = (bit10 << 9) | (bit9 << 8) | (bit8 << 7) | (bit7 << 6) | (bit6 << 5) | (bit5 << 4) | (bit4 << 3) | (bit3 << 2) | (bit2 << 1) | bit1;
return reversed_num;
}
uint32_t reverse_14bit_int(uint32_t num) {
// 提取原整数的14个bit
uint32_t bit1 = (num & 0x4000) >> 13;
uint32_t bit2 = (num & 0x2000) >> 12;
uint32_t bit3 = (num & 0x1000) >> 11;
uint32_t bit4 = (num & 0x0800) >> 10;
uint32_t bit5 = (num & 0x0400) >> 9;
uint32_t bit6 = (num & 0x0200) >> 8;
uint32_t bit7 = (num & 0x0100) >> 7;
uint32_t bit8 = (num & 0x0080) >> 6;
uint32_t bit9 = (num & 0x0040) >> 5;
uint32_t bit10 = (num & 0x0020) >> 4;
uint32_t bit11 = (num & 0x0010) >> 3;
uint32_t bit12 = (num & 0x0008) >> 2;
uint32_t bit13 = (num & 0x0004) >> 1;
uint32_t bit14 = num & 0x0002;
// 倒序排列这14个bit并构建新的整数
uint32_t reversed_num = (bit14 << 13) | (bit13 << 12) | (bit12 << 11) | (bit11 << 10) | (bit10 << 9) | (bit9 << 8) | (bit8 << 7) | (bit7 << 6) | (bit6 << 5) | (bit5 << 4) | (bit4 << 3) | (bit3 << 2) | (bit2 << 1) | bit1;
return reversed_num;
}
uint32_t reverse_16bit_int(uint32_t num) {
// 提取原整数的16个bit
uint32_t reversed_num = 0;
int i;
for (i = 0; i < 16; i++) {
reversed_num = (reversed_num << 1) | ((num >> i) & 1);
}
return reversed_num;
}
unsigned short do_crc(unsigned char *ptr, int len)
{
unsigned int i;
unsigned short crc = 0x0000;
while(len--)
{
crc ^= (unsigned short)(*ptr++) << 8;
for (i = 0; i < 8; ++i)
{
if (crc & 0x8000)
crc = (crc << 1) ^ 0x1021;
else
crc <<= 1;
}
}
return crc;
}
u8 data_pl()
{
int i,CG_FLAG = 0;
for( i=11;i<19;i++)
{
SN_H |= code[i];
SN_H = SN_H <<1;
}
for( i=20;i<28;i++)
{
SN_H |= code[i];
SN_H = SN_H <<1;
}
for( i=29;i<37;i++)
{
SN_H |= code[i];
SN_H = SN_H <<1;
}
for( i=38;i<46;i++)
{
SN_H |= code[i];
if(i==45)break;
SN_H = SN_H <<1;
}
for( i=47;i<53;i++)
{
SN_L |= code[i];
if(i==52)break;
SN_L = SN_L <<1;
}
//以上是SN码处理
CH |= code[53];
CH = CH <<1;
CH |= code[54];
CH = CH <<1;
for( i=56;i<64;i++)
{
CH |= code[i];
if(i==63)break;
CH = CH <<1;
}
//以上是CN码处理
dataNFC = code[65];
//以上是data码处理
for( i=66;i<73;i++)
{
US |= code[i];
US = US <<1;
}
for( i=74;i<81;i++)
{
US |= code[i];
if(i==80)break;
US = US <<1;
}
//以上是us码处理
animal = code[81];
//以上是animal码处理
for( i=83;i<91;i++)
{
CRCxmode_A |= code[i];
CRCxmode_A = CRCxmode_A <<1;
}
for( i=92;i<100;i++)
{
CRCxmode_A |= code[i];
if(i==99)break;
CRCxmode_A = CRCxmode_A <<1;
}
//以上是16位CRC码
CRCint_H = SN_H;
CRCint_L |= (SN_L<<26);
CRCint_L |= (CH<<16);
CRCint_L |= (dataNFC<<15);
CRCint_L |= (US<<1);
CRCint_L |= animal;
//处理为两个32位的整形9999 9999 9667 8001,正确的
CRCchar[0] = (unsigned char)(CRCint_H>>24);
CRCchar[1] = (unsigned char)(CRCint_H>>16);
CRCchar[2] = (unsigned char)(CRCint_H>>8);
CRCchar[3] = (unsigned char)(CRCint_H);
CRCchar[4] = (unsigned char)(CRCint_L>>24);
CRCchar[5] = (unsigned char)(CRCint_L>>16);
CRCchar[6] = (unsigned char)(CRCint_L>>8);
CRCchar[7] = (unsigned char)(CRCint_L);
//转化为1char型数组
CRCxmode_B = do_crc(CRCchar, sizeof(CRCchar));
//开始计算校验码
CRCint_L = 0; CRCint_H = 0;//到这里为止,所有的变量对比写入的数据来说都是逆序的
if(CRCxmode_A == CRCxmode_B)
{
CG_FLAG = 1;
}
CRCxmode_A = 0;
CRCxmode_B = 0;
if(CG_FLAG != 0)
{
return 1;
}
else
{
return 0;
}
}
void data_wrangling()
{
SN_L = reverse_6bit_int(SN_L);
SN_H = reverse_32bit_int(SN_H);
CH = reverse_10bit_int(CH);
US = reverse_14bit_int(US);
// CRCxmode_A = reverse_16bit_int(CRCxmode_A);
//处理为逆序整形
}
.h文件
#ifndef __LED_H
#define __LED_H
#include "sys.h"
#define EM_SHD PAout(7)
#define EM_MOD PBout(1)
#define EM_DE_OUT PBin(0)
#define CE PBout(12)
void LED_Init(void);//初始化
char read_id_start(void);
char read_id(void);
uint32_t reverse_32bit_int(uint32_t num) ;
uint32_t reverse_6bit_int(uint32_t num) ;
uint32_t reverse_10bit_int(uint32_t num) ;
uint32_t reverse_14bit_int(uint32_t num) ;
uint32_t reverse_16bit_int(uint32_t num);
unsigned short do_crc(unsigned char *ptr, int len);
u8 data_pl();
void data_wrangling(void);
#endif