stm32之无线通信模块(AT指令)

一、stm32cubeMX配置

1.1 GPIO配置

略....

1.2 USART配置

见其他....

二、代码

变量

//获取RSSI
char *strx;

char *str_xx=",-";
char *loc;
char *token;
int RSSI=0;

2.1 无线模块配置

void wireless_Config(void){

	printf("开始初始化L610\n");
	
	send_cmd("AT","OK",50);
	Clear_USART3_RX_Buffer();
	
	send_cmd("ATI","Fibocom",50);//查询版本号
	Clear_USART3_RX_Buffer();
	
	send_cmd("AT+CPIN?","+CPIN: READY",50);//SIM是否准备好
	Clear_USART3_RX_Buffer();
	
	send_cmd("AT+MIPCALL?","+MIPCALL:",50);//获取IP地址
	Clear_USART3_RX_Buffer();

	printf("4G模块初始化已完成\r\n");
}

2.2 send_cmd(u8 *cmd,u8 *ack,u16 waittime)

//通过无线模块发送命令,同时将返回的数据与ack对比
//cmd:发送的命令字符串;ack:期待的应答结果,如果为空,则表示不需要等待应答;waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果);1,发送失败
u8 send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
	u8 res=0; 
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd);	//发送命令
	if(ack&&waittime)		//需要等待应答
	{
//		u1_printf("OK\r\n");	//发送命令	
		
		while(--waittime)	//等待倒计时
		{
			HAL_Delay(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				if(check_cmd(ack))
				{
					printf("ack:%s\r\n",(u8*)ack);
					break;//得到有效数据 
				}
//				USART3_RX_STA=0;
			} 
		}
		if(waittime==0)res=1; 
	}
	return res;
}

2.3 check_cmd(u8 *str)

//发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果;其他,期待应答结果的位置(str的位置)
u8* check_cmd(u8 *str)
{
	char *strx=0;
	if(USART3_RX_STA&0X8000)		//接收到一次数据了
	{ 
		USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//添加结束符
		strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
	} 
	return (u8*)strx;
}

2.4 send_data(u8 *cmd,u16 waittime)

提取接收回传的数据

//收到返回的数据,获取信号量
//cmd:发送的命令字符串;waittime:等待时间(单位:10ms)
//返回值:发送数据后,服务器的返回验证码
u8* send_data(u8 *cmd,u16 waittime)
{
	char temp[5];
	char *ack=temp;
	USART3_RX_STA=0;
	u3_printf("%s\r\n",cmd);	//发送命令
	if(waittime)		//需要等待应答
	{
		while(--waittime)	//等待倒计时
		{
			HAL_Delay(10);
			if(USART3_RX_STA&0X8000)//接收到期待的应答结果
			{
				USART_RX_BUF[USART_RX_STA&0X7FFF]=0;//添加结束符
				ack=(char*)USART_RX_BUF;
				printf("ack:%s\r\n",(u8*)ack);

				loc=strstr((char*)USART3_RX_BUF,str_xx);
				token = strtok(loc,str_xx);
				RSSI = atoi((char*)token);
				
//				USART_RX_STA=0;
			} 
		}
	}
	return (u8*)ack;
}

2.5 Clear_USART3_RX_Buffer()

void Clear_USART3_RX_Buffer(void)//清空缓存
{
   if(USART3_RX_STA&0x8000)
	{	
		printf("\r\n返回值:%s\r\n",USART3_RX_BUF);
		memset(USART3_RX_BUF,0,strlen((const char*)USART3_RX_BUF)); 
		USART3_RX_STA=0;		
	}
	else
	{
		printf("\r\nerror\r\n");
	}
	
}
posted @ 2023-05-11 01:05  登云上人间  阅读(198)  评论(0)    收藏  举报