在使用指令之前先了解
进入配置模式指令
所有的指令使用之前,首先进入配置模式,使用进入配置模式指令;
进入透传模式指令
配置完了,进入数据传输就得用这个指令;
无论是从机还是主机,都要这个指令才能传输,没有上电就可以传输的指令;
我用的两个模块,要主次分明
模块分主次模块,用指令设置一个为主模块,一个为次模块。不然扫不出来周围蓝牙;
程序设计:关键部分
/*
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<j;i++)
{
while( !(USART_GetFlagStatus( USART3, USART_FLAG_TXE)) ); //发送
USART_SendData(USART3,usart3_tx_buff[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,所以干脆写两次命令;