串口蓝牙控制----小车源码

USART2_Init

1.TIM4_PWM_Init(7199,0); //初始化PWM,控制电机转动
2.uart_init初始化下载串口,程序由这个代码烧录进去
3.USART2_Init蓝牙串口初始化

前进 按下发出 ONA 松开ONF
后退:按下发出 ONB 松开ONF
左转:按下发出 ONC 松开ONF
右转:按下发出 OND 松开ONF
停止:按下发出 ONE 松开ONF

在这里插入图片描述

	USART_DMACmd(USART2,USART_DMAReq_Tx,ENABLE);  	//使能串口2的DMA发送
	UART_DMA_Config(DMA1_Channel7,(u32)&USART2->DR,(u32)USART2_TX_BUF);//DMA1通道7,外设为串口2,存储器为USART2_TX_BUF 
	USART_Cmd(USART2, ENABLE);                    //使能串口 

串口收到的信息保存在DR寄存器中,
DR寄存器中的数据通过DMA传送到输出缓冲数组USART2_TX_BUF

在这里插入图片描述打开中断,当数据寄存器DR非空时进入中断函数
设置定时器2,每十秒进入一次更新中断,检测接收完成USART2_RX_STA|=1<<15;

main


 int main(void)
 {	
	 u8 reclen=0;
	 delay_init();
	 TIM4_PWM_Init(7199,0);  //初始化PWM
	 uart_init(9600);     //下载串口
	 USART2_Init(9600);	  //蓝牙串口
	 ZYSTM32_brake(500);
	 while(1)
		{  		
		if(USART2_RX_STA&0X8000)	//接收到一次数据了
		{
			reclen=USART2_RX_STA&0X7FFF;	//得到数据长度
			USART2_RX_BUF[reclen]=0;	 	//加入结束符
			printf("USART2_RX_BUF:%s\n",USART2_RX_BUF);
  		printf("reclen:%d\n",reclen);
			if(reclen==3||reclen==4) 		//控制DS1检测
			{
				if(strcmp((const char*)USART2_RX_BUF,"ONA")==0)
				{
					u2_printf("go forward!"); 
          ZYSTM32_run(80,100);
				}
				else if(strcmp((const char*)USART2_RX_BUF,"ONB")==0)
				{
					u2_printf("go back!"); 
          ZYSTM32_back(80,100);
				}
				else if(strcmp((const char*)USART2_RX_BUF,"ONC")==0)
				{
         u2_printf("go right!"); 
         ZYSTM32_Right(80,100);
				}
			  else if(strcmp((const char*)USART2_RX_BUF,"OND")==0)
				{
					u2_printf("go left!"); 
         ZYSTM32_Left(80,100);
				}
			  else if(strcmp((const char*)USART2_RX_BUF,"ONF")==0)
				{
         u2_printf("Stop!"); 
         ZYSTM32_brake(100);
				}
				else if(strcmp((const char*)USART2_RX_BUF,"ONE")==0)
				{
         u2_printf("Stop!"); 
         ZYSTM32_brake(100);
				}
			}
			USART2_RX_STA=0;		
		}	
	}
 }

总结:

手机端蓝牙上位机发送指令,例如:ENA 前进
HC06蓝牙模块接收到指令之后,将指令传给串口2
串口收到指令之后,触发串口接收中断
在接收中断中,将DR里面的数据传送到USART2_RX_STA接收缓冲器中

定时器TIM2每10秒进入一次中断,并且标记接收完成
标记完之后就能进入main函数的第一个if里面

如果真的接收到ENA,则reclen3||reclen4,为正确指令
进入第二个if语句进行判断是什么指令
如果没有接受到指令,则无法进入if。进入下一步

最后清除标志位USART2_RX_STA=0;

在while中重新检测。等待下一个10ms检测是否按下按键

详细源码资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值