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

📄 bthcomm.c

📁 通过AT命令对串口蓝牙模块进行通信控制操作
💻 C
字号:
#include "bthcomm.h"
#include "W77E58.H"
#include "string.h"
#include "ctype.h"

char code bthat[]	= {"at\r"};
char code bthate[]	= {"ate\r"};
char code bthinq[] 	= {"at**bdinq\r"};
char code bthlist[]	= {"at**bdlist\r"};
char code bthlink[]	= {"atdd"};
char code bthserv[]	= {",s1\r"};
char code strplus[]	= {"+++"};
char code strok[]	= {"OK"};
char code stratok[] = {"atOK"};
char code strconn[] = {"CONNECT"};
char code strinqok[]= {"d1:BD:"};
char code strbd[]	= {"BD:"};

char code bthdisconn[]	= {"ath\r"};
char code bthinqact[] 	= {"inquiryactiveOK"};
char code bthinqemp[]	= {"listemptyOK"};
char code bthresetc[]	= {"at**reset\r"};

////////////////////////////////////////////////////
/*void WatchDog(void) interrupt 12
{
	if(WDIF) 
	{	
		TA=0xAA;
  		TA=0x55;
		WDIF = 0;
	}
	TA=0xAA;
  	TA=0x55;
  	RWT=1;//clear the watchdog flag	
}*/
//////////////////////////////////////////////////////
void Time1(void) interrupt 1	using 1
{	
	time++;
	if(time==15)
	{
//		onesecond=~onesecond;
		second++;
		time=0;
		second1++;
		
	}
	if(second==60)
	{
		second=0;
		minute++;
	}
	minute=minute%60;
	
}
///////////////////////////////////////////////////
void series0_send_char(char *p)
{
	char c;
	c=*p;
	while(1)
	 if(TI==1)	break;
	TI=0;
	SBUF = c;
}
////////////////////////////////////////////////////
/*void series1_send_char(char *p)
{
	char c;
	c=*p;
	while(1)
	 if(TI1==1)	break;
	TI1=0;
	SBUF1 = c;
}*/
/////////////////////////////////////////////////
void series0_send_array(char * pc)
{
	while(1)
	{
		series0_send_char(pc);
		WD_Reset
		pc++;
		if(*pc=='\0') 
			break;
	}
}
/////////////////////////////////////////////////
/*void series1_send_array(char * pc)
{
	while(1)
	{
		series1_send_char(pc);
		pc++;
		if(*pc=='\0') 
			break;
	}
}*/
////////////////////////////////////////////////
char series0_recv_char()
{
	char c;
	second = 0;
	while(1)
	{
		if(RI==1)	break;	 
		WD_Reset
		if(second>=3) return -1;
	}
	RI=0;
	c = SBUF;
	return c;
}
//////////////////////////////////////////////////	
void series0_recv_array()
{
	char c,t,t1,Count;
	bit  s,s0,s1,s2,s3,s5,s6;
	s  = 1;
	s0 = 0;
	s1 = 0;
	s2 = 0;
	s3 = 0;
	s5 = 0;
	s6 = 0;
	CommCnt	= 0;
	Count   = 0;
	while(1)
	{
		c=series0_recv_char();
		if(c==-1) 
			break;
		//	
		if(c=='n')
			t=Count;				
		if((c=='a')&&((t+1)==Count))
			s0 = 1;
		if((c=='m')&&((t+2)==Count))
			s1 = 1;
		if((c=='e')&&((t+3)==Count))
			s2 = 1;
		if((c==':')&&((t+4)==Count))
			s3 = 1;			
		if(s0&s1&s2&s3)
		{
			s  = 0;
			s0 = 0;
			s1 = 0;
			s2 = 0;
			s3 = 0;			
		}
			
		//			
		if(c=='d')
		{
			t1=Count;
			s6=1;
			s =1;
		}		
		if((c==':')&&s6)
		{
			if((t1+2)==Count)
			 	s6= 0;
			else s = 0;
			
		}				
		if(c>0x20&&s)
		{
		   	RecvBuf[CommCnt]=c;
  	     	CommCnt++;
    	}
    	Count++;
    }
}
///////////////////////////////////////////////
/*char series1_recv_char()
{
	char c;
	second = 0;
	while(1)
	{
		if(RI1==1)	break;	 	
		if(second>=3) return -1;
	}
	RI1=0;
	c = SBUF1;
	return c;
}
///////////////////////////////////////////////
void series1_recv_array()
{
   	char c;
   	CommCnt1 = 0;
   	while(1)
   	{
   		c = series1_recv_char();
   
   		if(Recving1==0)
    	{
       		if(c==0x02)//起始
       		{
       			RecvBuf1[0]=0x02;
       			CommCnt1 =1;
           		Recving1 =1;      	     		
     		}  
      		else
   			{ 
	    		Recving1=0;
 	   			CommCnt1=0;
   			}
    	}
    	else 
       	{            
	     	RecvBuf1[CommCnt1] = c;
   	     	if(c==0x03)
   		    {
   		    	ComLen1 =CommCnt1+2;        	    	
       	 	}
       	 	if(ComLen1 == CommCnt1)
       	 	{       	 		  
       	 		Recving1=0;
      		   	CommCnt1=0;  
      		   	RecvOk1 =1;  
      		   	return;       	 		
       	 	}
       	 	CommCnt1++;            
      	}
	}
}*/
///////////////////////////////////////////////
char * strnfind(char * p1, char * p2, char n)
{
	char *p;
	p = strchr(p1, *p2);
	if(p)
	{
		if(strncmp(p, p2, n) == 0)
			return p;
		else
			return NULL;		
	}
	else
		 return NULL;	
}
//////////////////////////////////////////////////
char BthDevInq(void)
{

	char *pa, *pc, *pt ;
	char n,m;
	TI = 1;
	pa = bthat;
	second1 = 0;
	do
	{
		series0_send_array(pa);
		series0_recv_array();
    	pc = RecvBuf;
    	pt = strok;
    	n  = strncmp(pc,pt,2);
    	pt = stratok;
    	m  = strncmp(pc,pt,4);
		WD_Reset
    	if(second1>50) return 1;	//1: at指令出错
	}while(n!=0&&m!=0);	

	second1 = 0;
	pa = bthate;
	do
	{
		series0_send_array(pa);
		series0_recv_array();	
		pc = RecvBuf;
    	pt = strok;
    	n  = strncmp(pc,pt,2);
		WD_Reset
    	if(second1>50) return 2;	//2:ate指令出错
	}while(n!=0);	
	
	second1 = 0;
	pa = bthinq;
	do
	{
		series0_send_array(pa);
		series0_recv_array();
		pc = RecvBuf;
    	pt = strok;
    	n  = strncmp(pc,pt,2);
		WD_Reset
    	if(second1>50) return 3;	//inqury 指令出错
	}while(n!=0);
    
	pa = bthlist;
	second1 = 0;
	while(1)
	{
		series0_send_array(pa);		
		series0_recv_array();
   		pc = bthinqact;
   		pt = RecvBuf;
   		n  = strncmp(pt,pc,15);
		WD_Reset
   		if(n==0) continue;
   		
   		pc = bthinqemp;
   		m  = strncmp(pc,pt,11);   		   	
		WD_Reset
   		if(m==0)   return 6;		//6:在天线范围内无蓝牙设备

   		pc = strinqok;
   		n  = strncmp(pc,pt,6);	 
   		if(n==0)
   		{
   			//将查询到的所有蓝牙设备记录到结构体BthDevice中
   			pc = strbd;
   			DeviceCoun = 0;
   			do
   			{   				
   				pt = strnfind(pt, pc, 3);					
   				if(pt!=NULL)
   				{
   					BD[DeviceCoun].DeviceNum[0] = *(pt-3);
   					BD[DeviceCoun].DeviceNum[1] = *(pt-2);   					
   				  					
   					for(m=0;m<12;m++)
   						BD[DeviceCoun].DeviceAdd[m] = *(pt+3+m);
   					DeviceCoun++;	
   					pt +=4;
   				}
   			}while(pt!=NULL);
   			
   			return 0;
   		}
   		WD_Reset
   		if(second1>60) return 4;   	//4:list指令出错  	
	
   	}	
}
///////////////////////////////////////////////////////////////////////////
/*void serier1_send_NoRep(void)
{
	SendBuf1[0] = 2;
	SendBuf1[1] = 0x33;
	SendBuf1[2] = 'N';
	SendBuf1[3] = 3;
	SendBuf1[4] = 0x38; 
	SendBuf1[5] = 0x34;
	SendBuf1[6] = 0x00;
	SBUF1 = SendBuf1;
}*/
///////////////////////////////////////////////////////////////////////////
bit LinkBth(char i)
{    
	char *pa, *pc, *pt;
	char n;
		
	pa = bthlink;
	series0_send_array(pa);	 
	pa = &(BD[i].DeviceNum[1]);
	series0_send_char(pa);
	pa = bthserv;
	series0_send_array(pa);	
	WD_Reset
	series0_recv_array();
	
	pc = strconn;
   	pt = RecvBuf;
   	n  = strncmp(pt,pc,8);
   	if(n==0) return 1;				//0:蓝牙设备连接正常
   	else 	 return 0;				//5:蓝牙设备连接异常
    
}
/////////////////////////////////////////////////////////////
bit Addrmatch(char n)
{
	char i,j;
	for(i=0;i<10;i++)
	{
		for(j=0;j<12;j++)
			if(BD[n].DeviceAdd[j]!=PDAMACAdd[i][j])
				break;
		if(j==12)	return 1;
	}
	if(i==10) return 0;
	
}
///////////////////////////////////////////////////
void BthDisconnect(void)
{
	char *pa;
	second = 0;
	while(1)
		if(second>=2) break;
	WD_Reset
	pa = strplus;
	series0_send_array(pa);

	series0_recv_array();
	WD_Reset
	second = 0;
	while(1)
		if(second>=2) break;	
	WD_Reset
	pa = bthdisconn;
	series0_send_array(pa);	 
	series0_recv_array();
}
///////////////////////////////////////////////////
void BthReset(void)
{
	char *pa;	
	pa = bthresetc;
	series0_send_array(pa);
	series0_recv_array();
}
////////////////////////////////////////////////////
/*bit  Bthlinking()
{	
	char *pa,*pc,*pt;
	char n;	
	pa = bthat;
	for(n=0;n<3;n++)
	{
		series0_send_array(pa);
		series0_recv_array();
	}
	pc = strok;
   	pt = RecvBuf;
   	n  = strncmp(pt,pc,2);
   	if(n==0) return 0;			//0:蓝牙设备处于非透明数据传输状态   
   	else  	 return 1;			//1:蓝牙设备处于透明数据传输状态或没有和蓝牙模块相连

}*/
////////////////////////////////////////////////////
void uart1_interrupt(void)  interrupt 4 using 2
{
	uchar c;
	if(TI)
	{
		TI=0;
		sendlen++;
		if(SendBuf[sendlen]!=0)
		{
			SBUF = SendBuf[sendlen];			
		}
		else	sendlen = 0;
	}
	if (RI)
	{
		RI=0;
		c=SBUF;
		if(c=='N')
		{
			Tag = 1;
			Count = 0;			
		}
		if(Tag)
		{
			if(Count==1)
				if(c!='O')
				{
					Count = 0;
					Tag	  = 0;
				}
			if(Count==2)
				if(c!=' ')			
				{
					Count = 0;
					Tag	  = 0;
				}
			if(Count==3)
				if(c!='C')
				{
					Count = 0;
					Tag	  = 0;
				}
			if(Count==4)
				if(c!='A')
				{
					Count = 0;
					Tag	  = 0;
				}
			if(Count==5||Count==6)
			{					
				if(c!='R')
				{
					Count = 0;
					Tag	  = 0;
				}
			}
			if(Count==7)
				if(c!='I')
				{
					Count = 0;
					Tag	  = 0;
				}
			if(Count==8)
				if(c!='E')
				{
					Count = 0;
					Tag	  = 0;
				}
			if(Count==9)
			{	
				if(c=='R')
					RecvOk = 1;	
				else
 			    {
					Count = 0;
					Tag	  = 0;
				}
			}
			Count++;
		}
		
		
		if(Recving==0)
       	{
       		if(c==0x02)//起始
       		{
       			RecvBuf[0]=0x02;
       			CommCnt =1;
               	Recving =1;      	     		
     	   	}  
       		else
   		   	{ 
	       		Recving=0;
 	       		CommCnt=0;
   		   	}
       	}
     	else 
       	{            
	     	RecvBuf[CommCnt] = c;
   	     	if(c==0x03)
   		    {
   		    	ComLen =CommCnt+2;        	    	
       	 	}
       	 	if(ComLen == CommCnt)
       	 	{       
	 			RecvBuf[CommCnt+1] = 0;  
       	 		Recving=0;
      		   	CommCnt=0;  
      		   	RecvOk =1;  
				
//				SBUF = RecvBuf[0];
      		   	return;       	 		
       	 	}
       	 	CommCnt++;            
      	}
	}
}

void uart2_interrupt(void)  interrupt 7 using 3
{
	unsigned char c;
	if(TI1)
	{
		TI1=0;
		sendlen1++;
		if(SendBuf1[sendlen1]!=0)
		{
			SBUF1 = SendBuf1[sendlen1];
			
		}
		else	sendlen1 = 0;
	}
	if (RI1)
	{
		RI1=0;
		c=SBUF1;
		if(Recving1==0)
       	{
       		if(c==0x02)//起始
       		{
       			RecvBuf1[0]=0x02;
       			CommCnt1 =1;
               	Recving1 =1;      	     		
     	   	}  
       		else
   		   	{ 
	       		Recving1=0;
 	       		CommCnt1=0;
   		   	}
       	}
     	else 
       	{            
	     	RecvBuf1[CommCnt1] = c;
   	     	if(c==0x03)
   		    {
   		    	ComLen1 =CommCnt1+2;        	    	
       	 	}
       	 	if(ComLen1 == CommCnt1)
       	 	{
		    	RecvBuf1[CommCnt1+1] = 0;  	 		  
       	 		Recving1=0;
      		   	CommCnt1=0;  
      		   	RecvOk1 =1;  
				
//				SBUF = RecvBuf1[0];
      		   	return;       	 		
       	 	}
       	 	CommCnt1++;            
      	}
	
	}
    
	
}































⌨️ 快捷键说明

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