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

📄 comm.c

📁 SM5964在系统编程的源代码,通过COMM串行口进行程序下载,方便嵌入式系统开发
💻 C
字号:
#include "main.h"
#include "comm.h"

//////////////////////////////////////////////////////////
//stx addr cmd lenh lenl data  xor
//0    1    2   3    4    5..
//////////////////////////////////////////////////////////

xdata  unsigned char g_CommBuffer[600];
unsigned int g_CommLen;


/////////////////////////////////////////
//CPU种类:12分频时钟周期
//定时器: T2定时器
//误差: 4.5%
//公式: 波特率= 晶振频率/(32*(65536 - [RCAP2H,RCAP2L]))
//CopyRight by YTH 2002.11.11
/////////////////////////////////////////
#ifdef CRYTAL221184MHZ
void InitComm(unsigned char nBaudRate)
{
            TMOD=0x20 |(TMOD&0x0f0);
            PCON=0x80;
            switch(nBaudRate)
            {            
            case  Baud9600:
                     TH1=244;
                     break;            
            case  Baud19200:
                     TH1=250;
                     break;
            case  Baud38400:
                     TH1=253;
                     break;            
            case  Baud115200:
                     TH1=255;
                     break;
            }
			TL1=TH1;
            SCON=0x50;            

			//ES=1;
			TR1=1;
			

}
#endif



#ifdef CRYTAL147456MHZ
void InitComm(unsigned char nBaudRate)
{
            TMOD=0x20 |(TMOD&0x0f0);
            PCON=0x00;
            switch(nBaudRate)
            {
            case  Baud9600:
                     TH1=252;
                     break;
            case  Baud19200:
                     TH1=254;
                     break;
            case  Baud38400:
                     TH1=255;
                     break;
            }
			TL1=TH1;
            SCON=0x50;            

			//ES=1;
			TR1=1;
			
}
#endif
#ifdef CRYTAL110592MHZ
void InitComm(unsigned char nBaudRate)
{
            T2CON=0x30;
            switch(nBaudRate)
            {
            
            case  Baud9600:
                     RCAP2H=255;RCAP2L=220;
                     break;            
            case  Baud19200:
                     RCAP2H=255;RCAP2L=238;
                     break;
            case  Baud38400:
                     RCAP2H=255;RCAP2L=247;
                     break;            
            case  Baud115200:
                     RCAP2H=255;RCAP2L=253;
                     break;
            }
            SCON=0x50;
            TR2=1;
}

#endif

unsigned char ReadComm1(unsigned char *ch)
{

        unsigned int timeout= COMM_TIMEOUT1;

        while(--timeout)
        {
			 WatchDog();
             if(RI==1)
             {
                 RI=0;
                 *ch=SBUF;
                 return ID_OK;
             }
        }
        return ID_ERR;

}

unsigned char ReadComm(unsigned char *ch)
{

        unsigned long timeout= COMM_TIMEOUT;

        while(--timeout)
        {
			 WatchDog();
             if(RI==1)
             {
                 RI=0;
                 *ch=SBUF;
                 return ID_OK;
             }
        }
        return ID_ERR;

}
unsigned char WriteComm(unsigned char ch)
{
        unsigned long timeout= COMM_TIMEOUT;

        SBUF=ch;
        while(--timeout)
        {
			 WatchDog();
             if(TI==1)
             {
                 TI=0;
                 return ID_OK;
             }
        }
        return ID_ERR;
}
/*
********************************************************
**格式:60 addr cmd len data xor
********************************************************
*/


unsigned char ReceiveData(void)
{

   unsigned char  ch;
   unsigned char  xorcode=0;
   unsigned int len;

   NumCounter=0;
   //startcode   
   while(1)
   {
   		WatchDog();

        ReadComm(&ch);
        if(ch==0x60)break;

		
		if(ch==0x55)NumCounter++;
		if(NumCounter>5)
		{
			WriteComm(0xaa);//Comm Start Byte
			WriteComm(0xaa);//Comm Start Byte
			WriteComm(0xaa);//Comm Start Byte
			WriteComm(0xaa);//Comm Start Byte
			WriteComm(0xaa);//Comm Start Byte

		}
		
   }
   //if(ch!=0x60)return COMM_STX_ERR;

   g_CommBuffer[0]=ch;
   xorcode ^=ch;


   //addr
   if(ReadComm(&ch)) return COMM_TMO_ERR;
   g_CommBuffer[1]=ch;
   xorcode ^=ch;

   //cmd
   if(ReadComm(&ch)) return COMM_TMO_ERR;
   g_CommBuffer[2]=ch;   
   xorcode ^=ch;

   WatchDog();

   //len1
   if(ReadComm(&ch)) return COMM_TMO_ERR;
   g_CommBuffer[3]=ch;
   xorcode ^=ch;
   len=ch;


   //len2
   if(ReadComm(&ch)) return COMM_TMO_ERR;
   g_CommBuffer[4]=ch;
   xorcode ^=ch;
   len<<=8;
   len+=ch;

//   *((unsigned char *)(&len)+0)=g_CommBuffer[3];
  // *((unsigned char *)(&len)+1)=g_CommBuffer[4];
   g_CommLen=len;



   if(len>600)return COMM_LEN_ERR;


   //data
   for(i=0;i<len;i++)
   {
   		WatchDog();
        if(ReadComm(&ch))  return COMM_TMO_ERR;        
		g_CommBuffer[5+i]=ch;
		xorcode ^=ch;
   }

   //xor
   if(ReadComm(&ch)) return COMM_TMO_ERR;
   xorcode ^=ch;

   //check veryfy
   if(xorcode==0)return ID_OK; //校验对
   else          return COMM_XOR_ERR;//校验错
  
}


void SendResponse(unsigned char StateCode,unsigned char *StrData,unsigned int Len)
{
        
		unsigned char CrcCode=0;
		unsigned char ch;


		WatchDog();

		PIN_TXEN=RS485_COMM_ENABLE;//不允许发送
		//for(i=0;i<100;i++)  WatchDog();              

		//start
        WriteComm(0x60);//Comm Start Byte
		CrcCode ^=0x60;

		//addr
		WriteComm(0x01);
		CrcCode ^=0x01;


		

		//status
		WriteComm(StateCode);
		CrcCode ^=StateCode;

		WatchDog();

		//len
		ch=((Len>>8)&0xff);
        WriteComm(ch);
		CrcCode ^=ch;

		ch=(Len&0xff);
		WriteComm(ch);
		CrcCode ^=ch;


		//data
        for(i=0;i<Len;i++)
        {
                WatchDog();
				ch=StrData[i];
                WriteComm(ch);
                CrcCode ^=ch;
                
        }

		//xor
	  	WriteComm(CrcCode);


		//for(i=0;i<100;i++)WatchDog();
		PIN_TXEN=RS485_COMM_DISENABLE;//不允许发送
        

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -