📄 usbmainold.c
字号:
trs_cnt=0; //列下标
for(ind_buf2=6;ind_buf2<64;ind_buf2++)
{ Clr_WDog(); //清w-dog
j_temp=drvr_drv_time[trs_hang][trs_cnt];
MainEpBuf2[ind_buf2]=j_temp;
trs_jy^=j_temp;
if(trs_cnt==27)
{
trs_hang=(trs_hang+1)%300;
trs_cnt=(trs_cnt+1)%28;
}
else trs_cnt++;
trs_cnt_byte++;
trs_cnt_size++;
}
k = D12_WriteEndpoint5(64); //发送
}
else
{
ind_buf2=0; //发送剩下的数据
do
{ Clr_WDog(); //清w-dog
j_temp=drvr_drv_time[trs_hang][trs_cnt];
MainEpBuf2[ind_buf2]=j_temp;
trs_jy^=j_temp;
if(trs_cnt==27)
{
trs_hang=(trs_hang+1)%300;
trs_cnt=(trs_cnt+1)%28;
}
else trs_cnt++;
trs_cnt_byte++;
trs_cnt_size++;
ind_buf2++;
}while(ind_buf2<64&&trs_cnt_byte<280);
if(trs_cnt_byte==280)
{
MainEpBuf2[ind_buf2]=trs_jy;
trs_cnt_tot=1;
Clr_WDog();//喂狗
}
k = D12_WriteEndpoint5(64); //发送
}
}
}
//--------------------------------------------------------------------------------------------上载疑点点数据
void trsusb_ydshj(void)
{
unsigned char xdata j=0,l,k=0;
unsigned int xdata i;
Clr_WDog(); //清w-dog
//初始化时,已将sec_data[10][326]的所有字节清0
if(trs_cnt_size==10)
{
l=(sec_hang+1)%10; //共有l条疑点记录
if(sec_data[l][0]) l=10;
if(l==0)
{
trs_jy=packdata(0);
MainEpBuf2[6]=trs_jy; //发1个空数据包,立即返回
j= D12_WriteEndpoint(5, 64, MainEpBuf2); //发送
trs_cnt_size=0;
return;
}
trs_cnt_size=l;
trs_cnt_tot=trs_cnt_size;
}
if(trs_cnt_size==0)
{
trs_cnt=0;
trs_cnt_tot=0;
return;
}
else
{
if(trs_cnt==0)
{
j=packdata(326);
k=(sec_hang+10-(trs_cnt_tot-trs_cnt_size))%10;
for(i=0;i<326;i++)
{ Clr_WDog(); //清w-dog
MainEpBuf2[i+6]=sec_data[k][i];
j^= MainEpBuf2[i+6];
}
MainEpBuf2[332]=j;
Clr_WDog();//喂狗
}
i=trs_cnt*64;
j = D12_WriteEndpoint(5, 64, MainEpBuf2+i);
trs_cnt++;
if(trs_cnt>5)
{
trs_cnt=0;
trs_cnt_size--;
}
}
}
//-----------------------------------------------------------------------------------------------上载2天超时
void trsusb_2dayover(void)
{
unsigned char xdata i,j,l;
unsigned char xdata over_rec[21],over_cnt=0;
unsigned char xdata a[3],b[3],c[5],d[5];
Clr_WDog(); //清w-dog
if(trs_cnt_tot)
{
trs_cnt_tot=0;
//找到符合条件的超时记录
//stop_3day[11]数组中前9个字节存放停车当天以及之前2天的日期,先从中取出各自的日期
for(i=0;i<3;i++) //读取停车前2天的年月日
{ Clr_WDog(); //清w-dog
a[i]=stop_3day[i];
}
for(i=0;i<3;i++) //读取停车前1天的年月日
{ Clr_WDog(); //清w-dog
b[i]=stop_3day[3+i];
}
for(i=0;i<5;i++) //读取停车当天的年月日时分
{ Clr_WDog(); //清w-dog
d[i]=stop_3day[6+i];
}
i=num_ovrec;
l=0;
do
{ Clr_WDog(); //清w-dog
for(j=0;j<5;j++)
{ Clr_WDog(); //清w-dog
c[j]=overtime_rec[i][23+j]; //取出 overtime_rec[]数组中的一个停止年月日时分
}
if((a[0]==c[0]) && (a[1]==c[1]) && (a[2]==c[2])) //如果停车前2天的年月日与之相同
{
if(c[3]>d[3])
{
over_rec[over_cnt]=i; //将对应的数组下标保存在over_rec[]
over_cnt++;
}
else if(c[3]==d[3])
{
if(c[4]>=d[4])
{
over_rec[over_cnt]=i; //将对应的数组下标保存在over_rec[]
over_cnt++;
}
}
}
else if((b[0]==c[0]) && (b[1]==c[1]) && (b[2]==c[2])) //如果停车前1天的年月日与之相同
{
over_rec[over_cnt]=i; //将对应的数组下标保存在over_rec[]
over_cnt++;
}
else if((d[0]==c[0]) && (d[1]==c[1]) && (d[2]==c[2])) //如果停车当天的年月日与之相同
{
over_rec[over_cnt]=i; //将对应的数组下标保存在over_rec[]
over_cnt++;
}
i=(i+1)%21;
l++;
}while(l<21);
if(over_cnt==0) //没有符合条件的超时记录
{
trs_jy=packdata(0);
MainEpBuf2[6]=trs_jy; //发1个空数据包,立即返回
j= D12_WriteEndpoint(5, 64, MainEpBuf2); //发送
trs_cnt_size=0;
return;
}
trs_cnt_size=over_cnt;
}
if(trs_cnt_size==0)
{
trs_cnt=0;
return;
}
else //有符合条件的超时记录,共over_cnt条
{
trs_cnt_size--;
trs_jy=packdata(28); //数据块长度为28
l=over_rec[trs_cnt_size];
for(j=0;j<28;j++) //将28个字节(驾驶证号码+时间)送入缓冲区
{ Clr_WDog(); //清w-dog
MainEpBuf2[j+6]=overtime_rec[l][j];
trs_jy^=MainEpBuf2[j+6];
}
MainEpBuf2[34]=trs_jy;
j = D12_WriteEndpoint(5, 64, MainEpBuf2);
}
return;
}
//----------------------------------------------------------------------------------------上载最近10次通信时间
void trsusb_down_time(void)
{
unsigned char xdata i,j,k,l,m;
Clr_WDog(); //清w-dog
//初始化时,已将down_time[10][5]的所有字节清0
l=(index_dw_tm+1)%10; //index_dw_tm指向10次当中的最近1次通信时间
if(down_time[l][0]) l=10;
k=packdata(l*5); //数据块长度为l*5
i=index_dw_tm;
for(j=0;j<l;j++)
{ Clr_WDog(); //清w-dog
for(m=0;m<5;m++)
{ Clr_WDog(); //清w-dog
MainEpBuf2[6+5*j+m]=down_time[i][m];
k^=MainEpBuf2[6+5*j+m];
}
i=(i+9)%10;
}
MainEpBuf2[l*5+6]=k;
j = D12_WriteEndpoint(5, 64, MainEpBuf2);
}
//--------------------------------------------------------------------------------上载带有驾驶证号码的疑点数据
trsusb_num_ydshj()
{
unsigned char xdata j;
Clr_WDog(); //清w-dog
//初始化时,已将num_10[10][18]的所有字节清0
if(trs_cnt_tot==1)
{
trs_cnt_tot=0;
trs_cnt_size=10;
trs_cnt=sec_hang;
}
if(trs_cnt_size==0)
{
trs_cnt=0;
return;
}
else //有trs_cnt_size条记录
{
trs_cnt_size--;
trs_jy=packdata(18); //数据块长度为18
for(j=0;j<18;j++) //将18个字节(驾驶证号码)送入缓冲区
{ Clr_WDog(); //清w-dog
MainEpBuf2[j+6]=num_10[trs_cnt][j];
trs_jy^=MainEpBuf2[j+6];
}
MainEpBuf2[24]=trs_jy;
j = D12_WriteEndpoint(5, 64, MainEpBuf2);
trs_cnt=(trs_cnt+9)%10;
}
}
//---------------------------------------------------------------------------------------------USB传送数据函数
void trs_usb(void)
{
unsigned int xdata len;//,len1;
Clr_WDog(); //清w-dog
recv_cmd=0;
ES=0;
while(1 )
{
Clr_WDog(); //清w-dog
usbclk_cnt++;
if(usbclk_cnt&0x100)
{
Clr_WDog();//喂狗
}
if(usbclk_cnt>0x50000||FL_RUN)
{
usbclk_cnt=0;
break;
}
if (bEPPflags.bits.ep2_rxdone) //端点2收到数据;
{
DISABLE;
bEPPflags.bits.ep2_rxdone = 0;
unpack();
check_pack();
Clr_WDog();//喂狗
if (recv_size==0) //接收到的是命令,判断命令类型,对mainepbuf赋值;
{
if (error)
{
packet_error(0xfa);
error=0;
len = D12_WriteEndpoint(5, 64,MainEpBuf2);
}
else
{
switch(recv_cmd)
{
// trs_count=0x0;
case 1 :
trs_num(); //上载驾驶员代码,和232共用一函数
len = D12_WriteEndpoint(5, 64,MainEpBuf2);
break;
case 2 :
trs_clk(); //上载时钟时间,和232共用一函数
len = D12_WriteEndpoint(5, 64,MainEpBuf2);
break;
case 3 :
trs_lich(); //上载360小时里程,和232共用一函数
len = D12_WriteEndpoint(5, 64,MainEpBuf2);
break;
case 4 :
trs_tzxs(); //上载特征系数,和232共用一函数
len = D12_WriteEndpoint(5, 64,MainEpBuf2);
break;
case 5 :
trs_cnt_size=1;
trs_fst_time=1;
trs_cnt_tot=1;
trsusb_rate(360); //上载360小时速度
break;
case 6 :
trs_vin(); //上载VIN,和232共用一函数
len = D12_WriteEndpoint(5, 64,MainEpBuf2);
break;
case 7 :
trs_cnt_size=10;
trs_cnt=0;
trs_cnt_tot=0;
//j_temp=0;
trsusb_ydshj(); //上载疑点数据
break;
case 8 :
trs_2daylich(); //上载2天里程,和232共用一函数
len = D12_WriteEndpoint(5, 64,MainEpBuf2);
break;
case 9 :
trs_cnt_size=1;
trs_fst_time=1;
trs_cnt_tot=1;
trsusb_rate(48); //上载2天速度
break;
case 0x11 :
trs_cnt_tot=1;
trs_cnt_size=0;
trsusb_2dayover(); //上载2天超时
break;
case 0x0B:
trs_cnt_tot=1;
trs_cnt_size=0;
trsusb_num_ydshj(); //上载带有驾驶证号码的疑点数据
break;
case 0x0C:
trsusb_down_time(); //上载最近10次通信时间
break;
case 0x0D :
trs_ini_info(); //上传初始安装信息(ID号+安装时间),和232共用一函数
len = D12_WriteEndpoint(5, 64,MainEpBuf2);
break;
case 0x0E:
trs_cnt_size=0;
trs_fst_time=1;
trs_cnt_tot=1;
trsusb_num_rate(360); //上载驾驶员的流水记录
break;
case 0x0F:
trs_cnt_size=0;
trs_fst_time=1;
trs_cnt_tot=1;
trsusb_num_rate(48); //上载驾驶员的流水记录
break;
case 0x66:
break;
case 0xBA :
FLAG_INIT=0;
break;
case 0xff :
ENABLE;
return;
default:
break;
}
}
}//接收上传命令,并作处?
else
{
if (error)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -