📄 epc.c
字号:
combuf[offset]=com;
check_sum_val += com;
length--;
if(length==0)
{
if(check_sum_val==0)
treat_report();
endall();
}
}
else if(frame_1byte_ok)
{
if(com != 0x40)
{
offset=1;
combuf[1]=com;
length=com;
check_sum_val += com;
check_bit=0;
check_bit=check_bit^com_0;
check_bit=check_bit^com_1;
check_bit=check_bit^com_2;
check_bit=check_bit^com_3;
check_bit=check_bit^com_4;
check_bit=check_bit^com_5;
check_bit=check_bit^com_6;
check_bit=check_bit^com_7;
if(check_bit)
{
length = length & 0x7f;
frame_head_ok=1;
}
else
endall();
}
}
else if(offset==0)
{
if(com==0x40)
{
combuf[0]=com;
check_sum_val=com;
frame_1byte_ok=1;
}
}
}
else if(sendflag)
{
if(sendcount < ((sendbuf[1] & 0x7f)+2))
{
SFRPAGE = 0x01;
SBUF1 = sendbuf[sendcount];
SFRPAGE = 0x00;
sendcount++;
}
else
{
sendflag=0;
receiveflag=1;
rs485ctl=1; // 使RS485进入接收状态
}
}
}
uchar detect_antenna(void)
{
//检测哪个口已接天线: 00-无天线,01-只有天线0,02-只有天线1,03-天线0和1都有
unsigned char xdata i;
da_swr1=1;
da_swr0=1;
i=0;
if(da_swr0==0) i=1;
if(da_swr1==0) i+=2;
return i;
}
uchar antenna_is_ok(void)
{
//检测天线连接是否正常
unsigned char xdata i;
i=detect_antenna();
if((sel_txian0==0) && ((i==1)||(i==3)))
return true;
if((sel_txian1==0) && ((i==2)||(i==3)))
return true;
return false;
}
void amplifier_on(void)
{
// 打开功放
unsigned long xdata kk2;
power_on=1;
iic_eeprom_read_adress(out_powerl,1);
kk2=common_buf[0];
if(kk2>150) kk2=150;
kk2=(kk2*4096)/240;
SFRPAGE = 0x00;
DAC0L=kk2%256;
DAC0H=kk2/256;
// delay(20);
dog();
}
void amplifier_off(void)
{
// 关闭功放
// SFRPAGE = 0x00;
// DAC0L=0;
// DAC0H=0;
power_on=0;
}
// 生成电子标签授权码MAC和UAC
unsigned char get_authorization(void)
{
unsigned char xdata i, temp;
//取eeprom中厂商授权码
iic_eeprom_read_adress(mac_code,5);
temp=0;
for(i=0;i<4;i++)
temp += common_buf[i];
temp = (~temp)+1;
if(temp != common_buf[4])
return error_mac_code;
for(i=0;i<4;i++)
tag_buf[10+i]=common_buf[i];
// 取eeprom中用户授权码
iic_eeprom_read_adress(user_code,9);
temp=0;
for(i=0;i<8;i++)
temp += common_buf[i];
temp = (~temp)+1;
if(temp != common_buf[8])
return error_mac_code;
for(i=0;i<8;i++)
tag_buf[i]=common_buf[i];
// 生成电子标签中的授权码
if(antenna_is_ok())
{
// 读取标签ID号
amplifier_on();
temp = read_data_process(0, 2);
amplifier_off();
if (temp==error_ok)
{
// 生成电子标签MAC码
for(i=0;i<4;i++)
{
tag_buf[10+i] ^= data_code[i];
tag_buf[10+i] ^= data_code[4+i];
}
// 生成电子标签UAC码
for(i=0;i<8;i++)
tag_buf[i] ^= data_code[i];
for(i=0;i<4;i++)
tag_buf[i] ^= tag_buf[4+i];
}
}
else
temp = error_no_antenna;
dog();
return temp;
}
//检测电子标签是否授权
unsigned char check_authorization(void)
{
unsigned char xdata i, temp;
temp = get_authorization();
if(temp == error_ok)
{
// 读取电子标签授权码,MAC在3#区, UAC码在4#区
amplifier_on();
temp = read_data_process(3, 2);
amplifier_off();
if (temp == error_ok)
{
for(i=0; i<4; i++)
{
if(data_code[i] != tag_buf[13-i]) //!!!??
{
temp=error_invalid_tag;
break;
}
if(data_code[4+i] != tag_buf[3-i])
{
temp=error_invalid_tag;
break;
}
}
}
}
return temp;
}
unsigned char write_authorization(void)
{
unsigned char xdata i, temp;
temp=get_authorization();
if(temp == error_ok)
{
amplifier_on();
for(i=0;i<4;i++)
tagwritebuf[i]=tag_buf[10+i];
temp = write_data_process(3); // 电子标签的3#地址存放MAC码
if(temp == error_ok)
{
for(i=0; i<4; i++)
tagwritebuf[i]=tag_buf[i];
temp = write_data_process(4); // 电子标签的4#地址存放UAC码
}
amplifier_off();
}
return temp;
}
void read_config(void)
{
unsigned char xdata i, temp;
iic_eeprom_read_adress(config_1820,9);
temp=0;
for(i=0; i<8; i++)
temp += common_buf[i];
temp = (~temp)+1;
if(temp != common_buf[8])
{
config_buf[0]=0; //卡号输出接口和格式:0-w26, 1-w34, 2-RS485, 3-RS232
config_buf[1]=0; // 卡号输出方式:0-直接输出,1-标准输出
config_buf[2]=4; //读卡间隔 1-50ms,2-100ms,3-200ms,4-300ms, 5-500ms, 6-1000ms
config_buf[3]=0; //卡号位置,0或5
config_buf[4]=4; //485口通信速率,1-1200,2-2400,3-4800,4-9600,5-19200,6-38400,7-57600
config_buf[5]=0; //保留
config_buf[6]=1; //工作方式:1-定时,2-触发,3-命令
config_buf[7]=0; //保留
temp=0;
for(i=0;i<8;i++)
{
eeprom_buf[i]=config_buf[i];
temp += config_buf[i];
}
eeprom_buf[8]=(~temp) + 1;
iic_block_write(config_1820,9);
}
else
{
for(i=0;i<8;i++)
config_buf[i]=common_buf[i];
}
}
void setbps(unsigned char bps)
{
unsigned char xdata i=bps;
switch(i)
{
// ----- RS232口波特率 -------
case 0: //reset 600bps
TMR2L = 0x00;
TMR2H = 0xf7;
RCAP2L= 0x00;
RCAP2H= 0xf7;
break;
case 1: //reset 1200bps
TMR2L = 0x80;
TMR2H = 0xfb;
RCAP2L= 0x80;
RCAP2H= 0xfb;
break;
case 2: //reset 2400bps
TMR2L = 0xc0;
TMR2H = 0xfd;
RCAP2L= 0xc0;
RCAP2H= 0xfd;
break;
case 3: //reset 4800bps
TMR2L = 0xe0;
TMR2H = 0xfe;
RCAP2L= 0xe0;
RCAP2H= 0xfe;
break;
case 4: //reset 9600bps
TMR2L = 0x70;
TMR2H = 0xff;
RCAP2L= 0x70;
RCAP2H= 0xff;
break;
case 5: //reset 19200bps
TMR2L = 0xb8;
TMR2H = 0xff;
RCAP2L= 0xb8;
RCAP2H= 0xff;
break;
case 6: //reset 38400bps
TMR2L = 0xdc;
TMR2H = 0xff;
RCAP2L= 0xdc;
RCAP2H= 0xff;
break;
case 7: //reset 57600bps
TMR2L = 0xe8;
TMR2H = 0xff;
RCAP2L= 0xe8;
RCAP2H= 0xff;
break;
case 8: //reset 115200bps
TMR2L = 0xf4;
TMR2H = 0xff;
RCAP2L= 0xf4;
RCAP2H= 0xff;
break;
// ----- RS485口波特率 -------
case 10: //reset 1200bps
TL1 = 64;
TH1 = 64;
break;
case 11: //reset 1200bps
TL1 = 64;
TH1 = 64;
break;
case 12: //reset 2400bps
TL1 = 160;
TH1 = 160;
break;
case 13: //reset 4800bps
TL1 = 208;
TH1 = 208;
break;
case 14: //reset 9600bps
TL1 = 232;
TH1 = 232;
break;
case 15: //reset 19200bps
TL1 = 244;
TH1 = 244;
break;
case 16: //reset 38400bps
TL1 = 250;
TH1 = 250;
break;
case 17: //reset 57600bps
TL1 = 252;
TH1 = 252;
break;
case 18: //reset 115200bps
TL1 = 254;
TH1 = 254;
break;
}
}
void pack_and_send()
{
// 命令执行返回数据打包,并发送输出
unsigned char xdata i, m, n, check_sum;
n = sendbuf[1]+1; // sendbuf[1] 为发送数据包的有效长度.
m=1;
for (i=0; i<7; i++)
if (sendbuf[1] & (1<<i))
m = (m==1)? 0 : 1;
if (m==1)
sendbuf[1] |= 0x80; // sendbuf[1]的最高位是低七位的奇校验
else
sendbuf[1] &= 0x7f;
check_sum = 0;
for(i=0; i<n; i++)
check_sum += sendbuf[i];
sendbuf[n] = (~check_sum) + 1; // 校验和
sendflag=1;
sendcount=1;
receiveflag=0;
if(uart_selec==1)
{
rs485ctl=0;
SFRPAGE = 0x01;
SBUF1=sendbuf[0];
SFRPAGE = 0x0;
}
else
if(uart_selec==0)
SBUF0=sendbuf[0];
}
// =================处理数据传输协议======================
void treat_report(void)
{
unsigned int xdata i, j,temp, is_ok;
unsigned int xdata flash_addr;
switch(combuf[2])
{
case 1: //set baudrate
temp=combuf[3];
if(temp>8) temp = 4; // 9600bps
eeprom_buf[0]=temp;
iic_block_write(eeprom_baudl, 1); //存波特率
sendbuf[0]=0xf0;
sendbuf[1]=0x02;
sendbuf[2]=0x01;
pack_and_send();
delay(1000); // 等待发送结束
setbps(temp);
setbps(temp+10);
break;
case 2: //取版本号
iic_eeprom_read_adress(hard_versionl,4);
sendbuf[0]=0xf0;
sendbuf[1]=0x06;
sendbuf[2]=0x02;
for(i=0;i<4;i++)
sendbuf[i+3]=common_buf[i];
pack_and_send();
break;
case 3: //取输出功率
iic_eeprom_read_adress(out_powerl,1);
sendbuf[0]=0xf0;
sendbuf[1]=0x03;
sendbuf[2]=0x03;
sendbuf[3]=common_buf[0];
pack_and_send();
break;
case 4: //设定输出功率
if(combuf[3]>150)
combuf[3]=150; //限制最大功率
eeprom_buf[0]=combuf[3];
iic_block_write(out_powerl,1);
sendbuf[0]=0xf0;
sendbuf[1]=0x02;
sendbuf[2]=0x04;
pack_and_send();
break;
case 0x07: //取工作频率
iic_eeprom_read_adress(current_freql,1);
sendbuf[0]=0xf0;
sendbuf[1]=0x03;
sendbuf[2]=0x07;
sendbuf[3]=common_buf[0];
// sendbuf[3]=get_fre;
pack_and_send();
break;
case 0x08: //设置工作频率
if(combuf[3]==0)
autocon=1; // 跳频工作
else
{
autocon=0; // 定频工作
pll_con(combuf[3]);
}
eeprom_buf[0]=combuf[3];
iic_block_write(current_freql,1);
sendbuf[0]=0xf0;
sendbuf[1]=0x02;
sendbuf[2]=0x08;
pack_and_send();
break;
case 0x0d: //取天线连接情况
i=detect_antenna();
sendbuf[0]=0xf0;
sendbuf[1]=0x03;
sendbuf[2]=0x0d;
sendbuf[3]=i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -