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

📄 comm.c

📁 采用811芯片实现单片机读写U盘的源代码
💻 C
字号:
#define COMM_FILE
#include "include.h"

//uchar data time;
//uint data r_in=0,r_out=0,t_in=0,t_out=0; /*队列指针*/
//bit r_full=0,t_empty=0,t_done=0;
/*0=接收缓冲区空,1=满;
0=发送缓冲区空,1=正在发送
1=正在发送最后字节;
*/

//uchar xdata t_buf[1024];      /* 串行发送缓冲 */
//uchar xdata r_buf[1024];      /* 串行接收缓冲 */

/*-----------------------------------------------------
;     串口数据块发送程序
;     入口参数:  buffer == 数据缓冲区指针
;                length == 数据的长度
;     出口参数:  无
-----------------------------------------------------*/
void send_str(uint length,uchar *buffer)
{
	do{
      if((((t_in+1)^t_out)&0x3ff)!=0)         /*t_in+1=t_out 测试缓冲区满*/
    	{
 			t_buf[t_in]=*buffer;
 			buffer++;
 			t_in=++t_in&0x3ff;
 			length--;
  			while(t_done);	//如果正在发送最后字节则等待发送完成
    		if(!t_empty)
    		{
  				t_empty=1;
  				TI=1;	//启动新一轮发送
    		}
	   }
	}while(length);
}

/*-----------------------------------------------------
;     串口字符发送程序
;     入口参数:  ch == 欲发送的字符串
;     出口参数:  无
-----------------------------------------------------*/
//void send_char(uchar ch)
//{
// 	while(1)
//	{
//   	if((((t_in+1)^t_out)&0x3ff)!=0)         /*测试缓冲区满*/
//    	{
//			t_buf[t_in]=ch;
// 			t_in=++t_in&0x3ff;
//  			while(t_done);	//如果正在发送最后字节则等待发送完成
//    		if(!t_empty)
//    		{
//  				t_empty=1;
//  				TI=1;	//启动新一轮发送
//    		}
// 			return;
//   	}
//	}
//}

/*--------------------------------------------------------------
	等待发送结束
	出口参数:
		== 0 正确
		== 1 超时
--------------------------------------------------------------*/
uchar wait_send_end(void)
{
	uchar i;
	i = 5;
	time = 200;                     /*设TIME的初值为200,字符间隔时间为1秒*/
	do
	{
		if(!t_empty) {return(0);}
		if(!time)
   	{
   		time = 200;               /*设TIME的初值为200,字符间隔时间为1秒*/
   		i--;
   	}
	}while(i);
	return(1);
}

/*-----------------------------------------------------
;     串口接收程序
;     入口参数:  buffer == 数据缓冲区指针
;                length == 数据的长度
;     出口参数:  == 0 正确
;                != 0 超时(TIMEO)
-----------------------------------------------------*/
uchar rece(uint length,uchar *buffer)
{
	uchar rece_one;         /*==1,已接收了一个字节*/
	uint len;

	rece_one = 0;
	len=0;
	time = 200;                     /*设TIME的初值为200,字符间隔时间为1秒*/
	while(time)
	{
   	if(r_out!=r_in)         /*缓冲区非空*/
	 		{
	 			buffer[len]=r_buf[r_out];
	 			length--;
	 			r_out=++r_out&0x3ff;
	 			if(length==0)	return(0);
	 			time=200;            /*字符间隔时间为1秒*/
	 			len++;
	 		}
	}
	if(len) return(0xd3);
	else return(0xd4);
}

/*-----------------------------------------------------
     清除串口缓冲区
-----------------------------------------------------*/
void clear_rece_buffer(void)
{
	r_out=r_in;
	r_full=0;
}

/*-----------------------------------------------------
;     串口接收一行程序
;     入口参数:  buffer == 数据缓冲区指针
;     出口参数:  == 0 正确
;                != 0 超时(TIMEO)
-----------------------------------------------------*/

//uchar receline(uchar *buffer)
//{
//	uchar *buf;
//	buf=buffer;
//	time = 200;                     /*设TIME的初值为200,字符间隔时间为1秒*/
//	while(time)
//   	{
//   		if(r_out!=r_in)              /*缓冲区非空*/
//      	{
//	      	*buffer = r_buf[r_out];
//      		r_out=++r_out&0x3ff;
//      		time = 200;       /*设TIME的初值为200,字符间隔时间为1秒*/
//	      	if(*buffer == 0x0a) return 0;
//      		buffer++;
//      	}
//   	}
//	if(buf!=buffer) return 0xd3;
//	else return 0xd4;	
//}

/*-----------------------------------------------------
;     串口接收1byte程序
;     入口参数:  buffer == 数据缓冲区指针
;     出口参数:  == 0 没有数据
;                == 1 返回1Byte,还有接收数据没有被读取
;                == 3 返回1Byte,没有剩余数据
-----------------------------------------------------*/

uchar rece_s(uchar *buffer)
{
	if(r_out!=r_in)         /*缓冲区非空*/
   	{
   		*buffer=r_buf[r_out];
   		r_out=++r_out&0x3ff;
   		if(r_out!=r_in) return 1;
   		return 3;
   	}
	return 0;
}

/***********************************************************************************
接收命令包
***********************************************************************************/
uchar rece_cmd(uchar *cmd,uchar *package,uint *len,uchar *para)
{
	uchar error,error1,buf[10],xor;
	uint temp,i;
	
	error=rece(2,buf);
	#ifdef ZLH_DEBUG
//	disp_data(2,"A4");
//	disp_data(1,&error);
//	disp_data(2,buf);
	#endif
	if(error){
		if((error==0xd3)&&(buf[0]==0x1b)){
   		error1=rece_s(&buf[1]);
   		if(error1&&(buf[1]==0x10)) goto RECE_DATA;
	   }			 
	   return OVER_TIME;
	}
	if(buf[1]==0x1b){
		error1=rece_s(&buf[2]);
   	if(error1&&(buf[2]==0x10)) goto RECE_DATA;  
   	else return OVER_TIME;
   }
   if((buf[0]!=0x1b)||(buf[1]!=0x10)) return OVER_TIME;
   
RECE_DATA:
	buf[0]=0x1b;buf[1]=0x10;
   error=rece(4,&buf[2]);
   if(error) return CMD_HEAD_ERR;
   	   		
	*cmd=buf[2];
	*package=buf[3];
	temp=*((uint *)&buf[4]);
	temp=temp-6+1;
	
	error=rece(temp,para);
	if(error) return RECE_DATA_ERR;
	
	xor=buf[0];
	for(i=1;i<6;i++)
		xor^=buf[i];
	for(i=0;i<temp-1;i++)
		xor^=para[i];	

	#ifdef ZLH_DEBUG
//	disp_data(2,"A4");
//	disp_data(1,&xor);
//	disp_data(1,&para[temp-1]);
	#endif
//	if(xor==para[temp-1])
//	{
		*len=temp-1;
		return 0;
//	}	
//	else return XOR_ERR;
}

/****************************************************************************************
发送应答数据包
****************************************************************************************/
uchar send_data(uchar package,uint len,uchar *para)
{
	uchar buf[20],xor,j,error;
	uint i,temp;
	
	buf[0]='O';buf[1]='K';
	buf[2]=package;
	temp=len+5;
	buf[3]=(uchar)(temp>>8);
	buf[4]=(uchar)temp;
	
	xor=buf[0];
	for(i=1;i<5;i++)
		xor^=buf[i];
	if(len){	
		for(i=0;i<len;i++)
			xor^=para[i];
	}		
	for(i=0;i<3;i++){		
		send_str(5,buf);
		if(len) send_str(len,para);
		send_str(1,&xor);
		clear_rece_buffer();
		if(package){
			wait_send_end();
			for(j=0;j<10;j++){
				error=rece(1,&buf[10]);
				if((!error)&&((buf[10]==0x32)||(buf[10]==0x33)))
					break;
			}
			if(j==10) continue;
			if(buf[10]==0x32) return 0;
		}else{
			return 0;
		}
	}
	return COMM_ERR;					
}

/*****************************************************************************************
发送出错应答
*****************************************************************************************/	
void send_error(uchar error)
{
	uchar buf[20];
	uchar i;
	
	buf[0]='E';
	buf[1]='R';
	buf[2]=0;
	buf[3]=0;buf[4]=6;
	buf[5]=error;
	buf[6]=buf[0];
	for(i=1;i<6;i++)
		buf[6]^=buf[i];
	send_str(7,buf);
}

		
	
	
	

⌨️ 快捷键说明

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