📄 fssf.c
字号:
//Com3 接收命令模块
void Com3RD_P(void)
{
int i,j;
if(get3i==SendTLen) //如果接收完毕,则进行指令分析
{
if((GCom3getCmd[1]==2) && (GCom3getCmd[2]==0xfd)) //起始符正确
if(GCom3getCmd[5]==(GCom3getCmd[3]^GCom3getCmd[4])) //效验和正确
CAflag3=1; //允许分析
else //效验和不正确,则重新定位起始符位置
{
for(i=3;i<SendTLen;i++)
{if(GCom3getCmd[i]==2) break;}
get3i=SendTLen-i+1;
for(j=1;j<get3i;i++,j++)
{GCom3getCmd[j]=GCom3getCmd[i];}
CAflag3=0;
}
else //起始符不正确,则重新定位起始符位置
{
for(i=2;i<SendTLen;i++)
{if(GCom3getCmd[i]==2) break;}
get3i=SendTLen-i+1;
for(j=1;j<get3i;i++,j++)
{GCom3getCmd[j]=GCom3getCmd[i];}
CAflag3=0;
}
if(CAflag3==1)
{
CAflag3=0;get3i=1;Com3Flag=1;
Gcmd3=GCom3getCmd[3];
if(Gcmd3==6)
{Gcheci3=GCom3getCmd[4];}
Gcmd3_P();
}
else
Com3Flag=0;
}
}
//串口3命令转换
void Com3toCom1Edit(void)
{
SendCom1Para3[1]=GCom3getCmd[1];
SendCom1Para3[2]=GCom3getCmd[2];
SendCom1Para3[3]=GCom3getCmd[3];
SendCom1Para3[4]=GCom3getCmd[4];
SendCom1Para3[5]=GCom3getCmd[5];
}
//串口1缓存清零
void clearhc(void)
{int i;
for (i=1;i<=48;i++)
{GCom1get[i]=0;}
}
//COM2命令处理
void Gcmd2_P(void)
{ int i;
switch (Gcmd2)
{
case 1 :
THR2=0x03;THR2=0xfc;THR2=0x01;THR2=0x00;THR2=0x01;
break;
case 2 :
THR2=0x03;THR2=0xfc;THR2=0x02;THR2=0x00;THR2=0x02;
break;
case 3 :
THR2=0x03;THR2=0xfc;THR2=0x03;THR2=0x00;THR2=0x03;
break;
case 4 : //返回串口2假删除
THR2=0x03;THR2=0xfc;THR2=0x04;THR2=0x00;THR2=0x04;
if(DFchoose==1) //dan
{THR1=0x02;THR1=0xfd;THR1=0x04;THR1=0x00;THR1=0x04;}
else if (DFchoose==0) //fu 有可能缺次扫描
{if(Cmd6OKF2==1)
{Com2DelOK=1;Cmd6OKF2=0;}
}
break;
case 5 :
//THR2=0x03;THR2=0xfc;THR2=0x05;THR2=Car2D;THR2=0x05^Car2D;
if(DFchoose==1) //dan
{THR2=0x03;THR2=0xfc;THR2=0x05;THR2=Car2D;THR2=0x05^Car2D;}
else if((DFchoose==0)&&(Com2DelOK==0)) //fu
{THR2=0x03;THR2=0xfc;THR2=0x05;THR2=Car2F;THR2=0x05^Car2F;}
else if((DFchoose==0)&&(Com2DelOK==1))
{THR2=0x03;THR2=0xfc;THR2=0x05;THR2=0x00;THR2=0x05;}
break;
case 6 :
port6=1;
if(DFchoose==1) //dan
{
for(i=1;i<=48;i++)
{Sendcom2char[i]=GCom1Array[Gcheci2][i];}
//getonecar(Sendcom2char,GCom1Array,Gcheci2);
//Sendcom2char[48]=JYH_P();
Uart2_Txd_Data(Sendcom2char);
}
if(DFchoose==0) //fu
{
for(i=1;i<=48;i++)
{Sendcom2char[i]=GCom1Array[2][i];}
//getonecar(Sendcom2char,GCom1Array,2);
Sendcom2char[4]=1;
//Sendcom2char[48]=JYH_P();
Uart2_Txd_Data(Sendcom2char);
}
Cmd6OKF2=1;
break;
}//switch
}
//COM3命令处理
void Gcmd3_P(void)
{ int i;
switch (Gcmd3)
{
case 1 :
THR3=0x03;THR3=0xfc;THR3=0x01;THR3=0x00;THR3=0x01;
break;
case 2 :
THR3=0x03;THR3=0xfc;THR3=0x02;THR3=0x00;THR3=0x02;
break;
case 3 :
THR3=0x03;THR3=0xfc;THR3=0x03;THR3=0x00;THR3=0x03;
break;
case 4 : //返回串口3假删除
THR3=0x03;THR3=0xfc;THR3=0x04;THR3=0x00;THR3=0x04;
if(DFchoose==1)
{THR1=0x02;THR1=0xfd;THR1=0x04;THR1=0x00;THR1=0x04;}
else if (DFchoose==0)
{if(Cmd6OKF3==1)
{Com3DelOK=1;Cmd6OKF3=0;}
}
break;
case 5 :
if(DFchoose==1) //dan
{THR3=0x03;THR3=0xfc;THR3=0x05;THR3=Car3D;THR3=0x05^Car3D;}
else if((DFchoose==0)&&(Com3DelOK==0)) //fu
{THR3=0x03;THR3=0xfc;THR3=0x05;THR3=Car3F;THR3=0x05^Car3F;}
else if((DFchoose==0)&&(Com3DelOK==1)) //删除过 返回0
{THR3=0x03;THR3=0xfc;THR3=0x05;THR3=0x00;THR3=0x05;}
break;
case 6 :
port6=0;
if(DFchoose==1) //dan
{
for(i=1;i<=48;i++)
{Sendcom3char[i]=GCom1Array[Gcheci3][i];}
//getonecar(Sendcom3char,GCom1Array,Gcheci3);
//Sendcom3char[48]=JYH_P();
Uart3_Txd_Data(Sendcom3char);
}
if(DFchoose==0) //fu
{
for(i=1;i<=48;i++)
{Sendcom3char[i]=GCom1Array[1][i];}
//getonecar(Sendcom3char,GCom1Array,1);
Sendcom3char[4]=1;
//Sendcom3char[48]=JYH_P();
Uart3_Txd_Data(Sendcom3char);
}
Cmd6OKF3=1;
break;
}
}
unsigned char JYH_P()
{int jy,i;
jy=0;
for(i=3;i<=47;i++)
{
jy=jy^GCom1getchar[i];
}
return(jy);
}
void getallche(void)
{ int i,j;
THR1=0x02;THR1=0xfd;THR1=0x05;THR1=0x00;THR1=0x05;
ScanCom1(GCom1getchar,5);
DqCarsum=GCom1getchar[4]; //当前车道车辆总数
for(i=1;i<=DqCarsum;i++)
{ THR1=0x02;
THR1=0xfd;
THR1=0x06;
THR1=i;
THR1=0x06^i;
ScanCom1(GCom1getchar,48);
for(j=1;j<=48;j++)
{GCom1Array[i][j]=GCom1getchar[j];
}
//delay();
}
}
/*void getonecar(unsigned char buf1[],unsigned char buf2[][],int checi)
{ int i;
for(i=1;i<=48;i++)
{buf1[i]=buf2[checi][i];}
}*/
void DFmodle(void)
{ int p;
p=signal;
signal=port7007;
if((signal&0x02)^(p&0x02)==1)
{Com2DelOK=0;Com3DelOK=0;}
if((signal&0x02)==2)
{DFchoose=1;} //单收费
else if((signal&0x02)!=2)
{DFchoose=0;} //复收费
}
void CarSet(void)
{
if(DFchoose==1)
{Car2D=DqCarsum;Car3D=0;}
else if (DFchoose==0)
{ if(DqCarsum==0)
{Car2F=0;Car3F=0;}
else if(DqCarsum==1)
{Car2F=0;Car3F=1;}
else if (DqCarsum>=2)
{Car2F=1;Car3F=1;}
}
}
void Del_P(void)
{ //串口3和串口2都发过删除车辆命令时
if((DFchoose==0)&&(Com3DelOK==1)&&(Com2DelOK==1)) //发给工控机(串口1)两次删除命令
{THR1=0x02;THR1=0xfd;THR1=0x04;THR1=0x00;THR1=0x04;
ScanCom1(GCom1getchar,5);
if(ScanOK==1)
{THR1=0x02;THR1=0xfd;THR1=0x04;THR1=0x00;THR1=0x04;
ScanCom1(GCom1getchar,5);
Com3DelOK=0;Com2DelOK=0;}
}
}
void UART_SETUP()
{
//串口1配置
LCR1 = 0x80; //DLAB=1 访问除数和功能切换寄存器
DLL1 = 0x18;//18==9600,02==115200;
DLM1 = 0x00; //波特率=9600
LCR1 = 0x03; //WLS1,WLS0=11,数据长度为8位
FCR1 = 0x01; //使能FIFO发送和接收
//MCR1 = 0x20; //AUTO-CTS ENABLED
IER1 = 0x00; //开550接收中断
//串口2配置
LCR2 = 0x80; //DLAB=1 访问除数和功能切换寄存器
DLL2 = 0x18;//18==9600,02==115200;
DLM2 = 0x00; //波特率=9600
LCR2 = 0x03; //WLS1,WLS0=11,数据长度为8位
FCR2 = 0x01; //使能FIFO发送和接收
//MCR2 = 0x20; //AUTO-CTS ENABLED
IER2 = 0x01; //开550接收中断
//串口3配置
LCR3 = 0x80; //DLAB=1 访问除数和功能切换寄存器
DLL3 = 0x18;//18==9600,02==115200;
DLM3 = 0x00; //波特率=9600
LCR3 = 0x03; //WLS1,WLS0=11,数据长度为8位
FCR3 = 0x01; //使能FIFO发送和接收
//MCR3 = 0x20; //AUTO-CTS ENABLED
IER3 = 0x01; //开550接收中断
asm(" ssbx INTM"); // 关中断,进行关键设置时不许打扰
uWork=PMST; // 设置PMST寄存器
PMST =uWork&0xff; // 中断向量表起始地址=80H
IMR=0x0f;
//IMR = 0x7; // 使能INT0
TCR = 0x41f; // 预分频系数为16
TIM = 0xf000; // 时钟计数器清0
PRD = 0x0f423; // 周期寄存器为0ffH
TCR = 0x42f; // 复位、启动
IFR = 0xff; // 清中断标志位
asm(" rsbx INTM"); // 开中断
}
void ledf(int fsum)
{ int i;
for(i=1;i<fsum;i++);
{ asm(" RSBX XF ");
delay();
delay();
delay();
delay();
asm(" SSBX XF ");
delay();
delay();
delay();
delay();
}
}
void delay()
{ int j=0,k=0;
for(j=0;j<30000;j++);
for(k=0;k<30000;k++);
}
void f_w_p(int i,int addr,int data) //写具体页具体地址具体数据
{
port5=i;
flash[0x555]=0xaa;
flash[0x2aa]=0x55;
flash[0x555]=0xa0;
flash[addr]=data;
timeoutcount = 0;
do timeoutcount += 1;
while(flash[addr] != data && timeoutcount < 0xffffff);
port5=0;
//if(timeoutcount == 0xffff)
//break;
}
void flash_sector_erase(int i) //段擦除
{
port5=i;
flash[0x555]=0xaa;delay();
flash[0x2aa]=0x55;delay();
flash[0x555]=0x80;delay();
flash[0x555]=0xaa;delay();
flash[0x2aa]=0x55;delay();
flash[i]=0x30;delay();
port5=0;
}
void wait(int nWait)
{
int i,j,k=0;
for ( i=0;i<nWait;i++ )
for ( j=0;j<15;j++ )
k++;
}
//模拟软件正常工作。
//080601 串口2、3分别用SWITCH函数来处理
//080602 初步调试成功,双串口能协调删除车辆,我太高兴了
//080604 单复收费调试初步成功,等待检测BUG,我真高兴~~~~~
//080609 再次验证单复联合工作情况 基本没问题,待后续验证
//080609a 从复进入单模式时,清除Com2DelOK、Com3DelOK,新旧亭要车辆数据时,对应的灯亮 主(旧)亭 port6=1 辅(新)亭 port6=0
//080609c 初步定为正式试用版
//080610a 解决自启动不运行的问题
//080610c 加入JYH_P() 计算3-47校验和,并存放在第48字节数,然后发送
//080614 修改串口1扫描函数超时计数植为4000 原来为5FFF 操他娘的!!
//080722 命令处理放入中断函数中处理 未调试
//080725 已经调试通过
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -