汇承4.0蓝牙BLE串口助手HC-COM的使用方法及出错的原因和改正方法

   本文主要介绍在使用汇承4.0蓝牙BLE串口助手HC-COM,通过手机向蓝牙模块发送数据、或者通过手机向与蓝牙模块连接的单片机发送指令时,串口中断函数的编写方法及出错的原因和改正方法

   我们怎么把指令发送出去,以及单片机是如何实现接收的呢?,这就要通过串口中断来实现了,大多数单片机的串口例程或者汇承给的资料包里的例程都会给出类似下面给的一个串口中断的参考代码,但是它是有问题的,对于HC-COM来说,是不能正常工作的
void Com_Int(void) interrupt 4
{

  uchar receive_data;
	
  EA = 0;
	
  if(RI == 1) //当硬件接收到一个数据时,RI会置位
	{ 		
		RI = 0;
		receive_data = SBUF;//接收到的数据
			
		if(receive_data == '1')	 
		{
				LED =0;//接收到1亮灯
		}
		else
		{
				LED =1; //其他情况灯灭
		}
		
	}
	  SBUF=receive_data;//将接收到的数据放入到发送寄存器
	  while(!TI);			 //等待发送数据完成
	  TI=0;						 //清除发送完成标志位		
		EA = 1;
}
    按照上面的代码,当我们利用手机上的app HC-COM向单片机发送1的的时候,接收的数据receive_data=1,此时呢LED应该等于0,也就是LED会被点亮,但是实际上它只会闪一下,这就说明,我们通过HC-COM发送1的时候,单片机先接收到我们发的1,之后又接收到其他的信息,在上面的程序中,我们让单片机把接收到的信息又通过蓝牙模块发送给手机,利用HC-COM进行显示,如下图所示:
    乍一看,我们发送1的时候,只返回了一个1 ,发送0的时候,只返回了一个0,那单片机接收的其他信息是从何而来的呢?,为啥手机没有显示返回的其他信息呢?对此我进行了大量的实验,最终发现这个app,它一次发送实际上是发送20位,什么意思呢? 当我们输入一个1点击发送的时候,它实际上发送的是1000 0000 0000 0000 0000,也就是说当我们输入的数据的位数不足20位时它会自动补零,这就解释了为什么LED灯不会常亮,只会闪一下,因为在接收完我们发送的1后,它又接收了19个0,把这20个数据返回我们手机上的时候,它这个app把它补得这19个0又以空格的格式进行显示,而不是显示0(有点坑)。
    为了让LED常亮,我们需要输入20个1,如上图所示,也就是不给它补零的机会。这种方法呢用起来十分的不方便,可能个别有耐心的朋友也能接受,但是如果我们要通过HC-COM发送指令,实现对小车的遥控,也就说需要我们快速的输入指令,这种方法是不行的,怎么办呢?,对大部分人了说不具备修改这个app的能力,那么只能修改单片机的接收和发送函数了,因此我把上面的串口中断函数进行了简单的修改,如下:
void Com_Int(void) interrupt 4
{
    EA = 0;	
  
  if(RI == 1) //当硬件接收到一个数据时,RI会置位
	{ 
   	LED=0;
		RI = 0;
		receive_data = SBUF;//接收到的数据
		if(receive_data!=0)
		receive_real_data=receive_data;
	 
		SBUF=receive_real_data;//将接收到的数据放入到发送寄存器
	  while(!TI);			 //等待发送数据完成
	  TI=0;						 //清除发送完成标志位
		
		
}
    EA = 1;	
}
    只有接收到的数据不为0时,才赋值给新的变量receive_real_data,我们通过判断receive_real_data的值,来控制LED或者小车,而不是直接用接收到的值receive _data,同样我们返回到手机的数据,也改为receive_real_data。这样我们只需要发送一位的 1、2、3、4、5、6、7、8、等就可以了,用起来很方便。
	switch(receive_real_data) 
        { 
        
		      case '1': xxx; break; 
		      case '2':xxx; break; 
		      case '3': xxx; break; 
	     	  case '4':xxx; break; 
		      case '5': xxx; break; 
	     	  case '6': xxx; break; 
			  case '7':xxx; break; 
	         case '8': xxx; break; 
	        }
			
    上面代码中的XXX代表,你要单片机去执行的任务或者在接收到相关指令后的反应
    若想了解如何利用手机,通过蓝牙模块实现对小车的控制可以参考如下博文:

    详细介绍如何从零开始制作51单片机控制的智能小车(四)———通过蓝牙模块实现数据传输以及通过手机蓝牙实现对小车运动状态的控制

   点击以上蓝色字体即可跳转。
或者直接访问如下网址: https://blog.csdn.net/qq_44339029/article/details/106562519
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慕羽★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值