📄 fssf.c
字号:
#define IMR *(int *)0x0
#define IFR *(int *)0x1
#define PMST *(int *)0x1d
#define CLKMD (unsigned int *)0x58
#define TIM *(int *)0x24
#define PRD *(int *)0x25
#define TCR *(int *)0x26
#define SendTLen 6 //其它发送数据及接收指令的字节长度
#define GfeeBufC 12 //车辆信息缓冲指针,共10个,GfeeBufH,GfeeBufT;
#define flash ((volatile unsigned int*)0x8000)
ioport unsigned int port5;
#define flash_page port5
ioport unsigned int port7;
#define flash_page1 port7
ioport unsigned int port7007;
#define KGCS port7007
ioport unsigned int port6;
ioport unsigned int port9;
ioport unsigned int port2000,port2001,port2002,port2003,port2004,port2005,port2006,port2007; //串口0
ioport unsigned int port4000,port4001,port4002,port4003,port4004,port4005,port4006,port4007; //串口1
ioport unsigned int port8000,port8001,port8002,port8003,port8004,port8005,port8006,port8007; //串口3
#define RBR1 port2000 //接收缓冲寄存器
#define THR1 port2000 //发送缓冲寄存器
#define IER1 port2001 //中断使能寄存器
#define IIR1 port2002 //中断标志寄存器
#define FCR1 port2002 //FIFO控制寄存器
#define LCR1 port2003 //线路控制寄存器
#define MCR1 port2004 //MODEM控制寄存器
#define LSR1 port2005 //线路状态寄存器
#define MSR1 port2006 //MODEM控制寄存器
#define SCR1 port2007 //暂存寄存器
#define DLL1 port2000 //低位除数寄存器
#define DLM1 port2001 //高位除数寄存器
#define RBR2 port4000 //接收缓冲寄存器
#define THR2 port4000 //发送缓冲寄存器
#define IER2 port4001 //中断使能寄存器
#define IIR2 port4002 //中断标志寄存器
#define FCR2 port4002 //FIFO控制寄存器
#define LCR2 port4003 //线路控制寄存器
#define MCR2 port4004 //MODEM控制寄存器
#define LSR2 port4005 //线路状态寄存器
#define MSR2 port4006 //MODEM控制寄存器
#define SCR2 port4007 //暂存寄存器
#define DLL2 port4000 //低位除数寄存器
#define DLM2 port4001 //高位除数寄存器
#define RBR3 port8000 //接收缓冲寄存器
#define THR3 port8000 //发送缓冲寄存器
#define IER3 port8001 //中断使能寄存器
#define IIR3 port8002 //中断标志寄存器
#define FCR3 port8002 //FIFO控制寄存器
#define LCR3 port8003 //线路控制寄存器
#define MCR3 port8004 //MODEM控制寄存器
#define LSR3 port8005 //线路状态寄存器
#define MSR3 port8006 //MODEM控制寄存器
#define SCR3 port8007 //暂存寄存器
#define DLL3 port8000 //低位除数寄存器
#define DLM3 port8001 //高位除数寄存器
char cReceive,cBuffer[100];
int p;
unsigned int uWork;
unsigned long timeoutcount;
unsigned char GCom1getchar[50];
unsigned char GCom1Array[11][50];
int GCom1get[50];
int GCom2getCmd[SendTLen]; //通过串口2接收指令(1~5):5个字节
int geti=1; //com2接收数据的指针
int CAflag=0; //=1,允许分析;=0,不允许分析
int Gcmd2,Gpara2; //通过串口2所接收指令的指令(cmd)代码及参数(para)
int Com2Flag=0; //com2 接收和发送标志位。=0,不允许;=1,允许
int Com2Dataflag=0; //=1,发送车辆数据;=0,发送除车辆数据以外的数据
unsigned int GfeeBufH=1; //缓冲头
unsigned int GfeeBufT=1; //缓冲尾
unsigned int carpoint=0; //车辆缓冲数据序号(0~9)
int delDataFlag=0; //是否允许删除数据标志位,=1,允许。
int byflag=0; //备用位bit-7
int sbflag=0; //设备初始化bit-6
int hcflag=0; //缓存bit-5
int comflag=0; //通讯bit-4
int ltflag=0; //轮胎识别器bit-3
int loopflag=0; //线圈bit-2
int gmflag=0; //光幕bit-1
int ctflag=0; //称台bit-0
unsigned char SendCom1Para3[SendTLen];
int GCom3getCmd[SendTLen]; //通过串口2接收指令(1~5):5个字节
int get3i=1; //com2接收数据的指针
int CAflag3=0; //=1,允许分析;=0,不允许分析
int Com3Flag=0; //com2 接收和发送标志位。=0,不允许;=1,允许
int Gcmd3,Gpara3; //通过串口3所接收指令的指令(cmd)代码及参数(para)
int Com3Dataflag=0; //=1,发送车辆数据;=0,发送除车辆数据以外的数据
unsigned char Sendcom2char[50];
unsigned char Sendcom3char[50];
int signal; //单复收费选择位 =13,复 !=13 单
int CokF=0;
int CokD=0;
int DqCarsum=0; //当前车道内车辆总数
int DFchoose=0; //单复模式标志位 1 单 0 复
int Car2D=0;
int Car3D=0;
int Car2F=0;
int Car3F=0;
int Cmd4OKD2=0;
int Cmd5OKD2=0;
int Cmd6OKD2=0;
int Cmd4OKF2=0;
int Cmd5OKF2=0;
int Cmd6OKF2=0;
int Cmd4OKF3=0;
int Cmd5OKF3=0;
int Cmd6OKF3=0;
int Gcheci2=0;
int Gcheci3=0;
int Com2DelOK=0; //串口2(偶次车)删除完毕 0,未完毕 1,完毕
int Com3DelOK=0; //串口3(偶次车)删除完毕 0,未完毕 1,完毕
int ScanOK=0; //串口1扫描完毕 0,未完毕 1,完毕
unsigned int carsum=0; //车辆数
unsigned char SendCom2Para[SendTLen]; //发送除车辆数据以外的数据(1~5):5个字节:03fc 返回命令1字节,返回n字节数据,检查
unsigned char SendCom1Para[SendTLen];
void ScanCom1(unsigned char buf[],int len);
void Com3RD_P(void);
void Com3TD_P(void);
void Com2RD_P(void);
void Com2TD_P(void);
void Uart1_Txd_Data(unsigned char buf[],int numb);
void Uart2_Txd_Data(unsigned char buf[]);
void Uart3_Txd_Data(unsigned char buf[]);
void clearhc(void);//串口1缓存清零
void Gcmd2_P(void);
void Gcmd3_P(void);
void Del_P(void); //删除车辆数据处理 2个串口都发过删除命令时才删除2辆车
//单收费命令处理函数
void Gcmd2_PD(void);
void Gcmd3_PD(void);
void wait(int nWait);
void inttochar(unsigned char buf[],int buf1[],int j);
unsigned char JYH_P();//080610c 加入JYH_P() 计算3-47校验和,并存放在第48字节数,然后发送
void getallche(void); //取工控机现存全部车辆数据
void DFmodle(void); //单复模式判断
void CarSet(void); //单:Car2D=DqCarsum Car3D=0; 复:Car2F Car3F;
//void getonecar(unsigned char buf1[],unsigned char buf2[][],int checi);
void ledf();
void delay();
void UART_SETUP();
//FLASH WRITE AND ERASE
void flash_sector_erase(int i);
void f_w_p(int i,int addr,int data);
//void interrupt int0(void);
void interrupt int1(void);
void interrupt int2(void);
void interrupt time(void);
//int i,k=0,p,pi,rd=0,kk,rr;
//unsigned int uWork,br;
void main()
{ delay();delay();delay();delay();
delay();delay();delay();delay();
UART_SETUP();
port5=0x00;
//asm(" STM #0000h,CLKMD ");
// while(*CLKMD & 0x01 );
//asm(" STM #1007h,CLKMD "); //设置CPU运行频率=100M
/* 40C7h:5*clkin =100M
30c7h:4*clkin =80M
20c7h:3*clkin =60M
10C7h:2*clkin =40M
*/
//getallche();
//THR1=0x02;THR1=0xfd;THR1=0x05;THR1=0x00;THR1=0x05;
//ScanCom1(GCom1getchar,5);
//DqCarsum=GCom1getchar[4];
while(1)
{ wait(50);
getallche();
DFmodle();
CarSet();
Del_P();
}//while(1)
}//main
/*void interrupt int0(void)
{
do{p=IIR1;}
while((p&0x4)==0);
cReceive=RBR1;
THR1=cReceive;
}*/
void interrupt int1(void)
{
do{p=IIR2;}
while((p&0x4)==0);
if(geti==SendTLen) {geti=1;}
cReceive=RBR2;
GCom2getCmd[geti++]=cReceive;
Com2RD_P();
}
void interrupt int2(void)
{
do{p=IIR3;}
while((p&0x4)==0);
if(get3i==SendTLen) {get3i=1;}
cReceive=RBR3;
GCom3getCmd[get3i++]=cReceive;
Com3RD_P();
}
void interrupt time(void)
{//ledf();
//scancount();
}
////////////////////////////////
////////涉及串口2子程序/////////
////////////////////////////////
//Com2 接收命令模块
void Com2RD_P(void)
{
int i,j;
if(geti==SendTLen) //如果接收完毕,则进行指令分析
{
if((GCom2getCmd[1]==2) && (GCom2getCmd[2]==0xfd)) //起始符正确
if(GCom2getCmd[5]==(GCom2getCmd[3]^GCom2getCmd[4])) //效验和正确
CAflag=1; //允许分析
else //效验和不正确,则重新定位起始符位置
{
for(i=3;i<SendTLen;i++)
{if(GCom2getCmd[i]==2) break;}
geti=SendTLen-i+1;
for(j=1;j<geti;i++,j++)
{GCom2getCmd[j]=GCom2getCmd[i];}
CAflag=0;
}
else //起始符不正确,则重新定位起始符位置
{
for(i=2;i<SendTLen;i++)
{if(GCom2getCmd[i]==2) break;}
geti=SendTLen-i+1;
for(j=1;j<geti;i++,j++)
{GCom2getCmd[j]=GCom2getCmd[i];}
CAflag=0;
}
if(CAflag==1)
{
CAflag=0;geti=1;Com2Flag=1;
//inttochar(SendCom1Para ,GCom2getCmd,5);
Gcmd2=GCom2getCmd[3];
if(Gcmd2==6)
{Gcheci2=GCom2getCmd[4];}
Gcmd2_P();
}
else
Com2Flag=0;
}
}
//Com2 发送结果模块
void Com2TD_P(void)
{
if(Com2Dataflag==0)
Uart2_Txd_Data(SendCom2Para);
else
{
// Uart2_Txd_Data(SendCom2Dat[((GfeeBufT+Gpara2-1)>(GfeeBufC-1)? (Gpara2-(GfeeBufC-GfeeBufT)):(GfeeBufT+Gpara2-1))],SendDLen-1);
delDataFlag=1; //允许删除
}
Com2Flag=0;
}
//|Com1数据发送函数 |
//+---------------------------------------------------------------------------+
void Uart1_Txd_Data(unsigned char buf[],int n)
{
int i;
for(i=1;i<=n;i++)
{
THR1=buf[i];
}
}
//|Com2数据发送函数 |
//+---------------------------------------------------------------------------+
void Uart2_Txd_Data(unsigned char buf[])
{
int i;
if (Gcmd2!=6)//Com2Dataflag==0)
{
for(i=1;i<=5;i++)
{THR2=buf[i];}
}
else if(Gcmd2==6)//Com2Dataflag==1)
{
for(i=1;i<=48;i++)
{THR2=buf[i];wait(35);}
}
}
//|Com3数据发送函数 |
//+---------------------------------------------------------------------------+
void Uart3_Txd_Data(unsigned char buf[])
{
int i;
if (Gcmd3!=6)//Com3Dataflag==0)
{
for(i=1;i<=5;i++)
{THR3=buf[i];}
}
else if(Gcmd3==6)//Com3Dataflag==1)
{
for(i=1;i<=48;i++)
{THR3=buf[i];wait(35);}
}
}
//整形数组转换为字符型 供串口发送
void inttochar(unsigned char buf[],int buf1[],int j)
{int i;
for (i=1;i<=j;i++)
//{GCom1getchar[i]=GCom1get[i];}
{buf[i]=buf1[i];}
}
//串口1扫描数据子程序
void ScanCom1(unsigned char buf[],int len)
{
int i,uWork1,timecount=0;
for(i=1;i<=len;i++)
{
do
{
uWork1=LSR1;timecount+=1;
} while ( ((uWork1&1)==0)&& (timecount<0x4000) ); //080614 从5fff修改为4000
buf[i]=RBR1;
//THR2=buf[i];wait(35);
wait(30);
}
ScanOK=1;
}
////////////////////////////////
////////涉及串口3子程序/////////
////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -