⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fssf.c

📁 经典的奇偶输出控制源代码.里面有比较典型的对两处理器通讯速度不匹配的处理模式。好好看看吧!
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -