stm32的蓝牙串口模块的总结,ATK-MW579 模块

在使用指令之前先了解

进入配置模式指令

所有的指令使用之前,首先进入配置模式,使用进入配置模式指令;

 进入透传模式指令

配置完了,进入数据传输就得用这个指令;

 无论是从机还是主机,都要这个指令才能传输,没有上电就可以传输的指令;

我用的两个模块,要主次分明

模块分主次模块,用指令设置一个为主模块,一个为次模块。不然扫不出来周围蓝牙;

程序设计:关键部分

/*
    cmd      发送的指令
    ack      响应指令中的部分
    timeout  时间限时
有返回参数指示

*/

uint8_t atk_mw579_send_at_cmd(char *cmd ,char *ack ,uint32_t timeout)
{
	uint8_t *reg=NULL;
  atk_mw579_uart_rx_restart(); //初始化接收长,清空接收数组
	u3_printf("%s" , cmd);
  if(cmd == NULL || timeout == 0 ) //cmd是空的参数返回,或者延时为0,返回表明参数错误
	{
		return atk_mw579_EOEER;
	}
	else
	{
			while( timeout > 0)
			{
				//if(atk_mw579_receive_finish_flag == true)
				if(USART_GetFlagStatus( USART3, USART_FLAG_IDLE )  )//接收空闲就表示接收完,即便没有接收后的空闲也没事
				{
					if(usart3_rx_len>2) //如果接收到了
					{
						 usart3_rx_buff[usart3_rx_len] = '\0';
						 
						 reg=usart3_rx_buff;
						atk_mw579_receive_finish_flag=false;
					}
					 
				}else reg = NULL;
				if(reg != NULL)  //如果接收到了,给出了地址
				{ 
						if(strstr((const char *)reg,(const char *)ack)!=NULL)//对比,reg存在ack,就成功
						{  
							 return atk_mw579_EOK; //返回正确
						}
						else{
							 atk_mw579_uart_rx_restart();//初始化接收长,清空接收数组
								 
						}
				}
				timeout--;
				delay_Ms_Block(1);
			}
			return atk_mw579_OUTTIME;//返回超时
	
	}
}

其中关键函数

部分解释如下链接:

函数形参之不定长参数列表va_lis,va_start,va_arg,va_end,vsprintf_qq_36658033的博客-CSDN博客

/***************/
/*
  使用不定长参数输出
*/

void u3_printf(char *fmt , ...)
{
	int i,j;
  va_list ap;//不定长参数,固定用法,其实这也是一个指针;
	va_start(ap,fmt);//不定长参数,固定用法,也就是第一个参数地址
	vsprintf( (char *)usart3_tx_buff ,fmt ,ap);
	va_end(ap);//固定
  j=strlen((const char *)usart3_tx_buff );
	for(i=0;i

为了仿真方便修改进入配置指令

/* 进入配置模式 */
uint8_t atk_mw579_enter_config_mode()
{
	uint8_t reg;
  reg=atk_mw579_send_at_cmd("+++a","ok" ,1000);
	reg=atk_mw579_send_at_cmd("+++a","OK" ,1000);
	if( reg == atk_mw579_EOK)
	{
	   return atk_mw579_EOK;
	}
	else return atk_mw579_EOEER;

}

因为,在上电时候,因为第一次是正常的指令,返回也是小写ok。再仿真的时候其实已经进入了配置模式,但是呢返回却是大写OK,所以干脆写两次命令;

你可能感兴趣的:(stm32,java,linux)