本文主要介绍在使用汇承4.0蓝牙BLE串口助手HC-COM,通过手机向蓝牙模块发送数据、或者通过手机向与蓝牙模块连接的单片机发送指令时,串口中断函数的编写方法及出错的原因和改正方法
我们怎么把指令发送出去,以及单片机是如何实现接收的呢?,这就要通过串口中断来实现了,大多数单片机的串口例程或者汇承给的资料包里的例程都会给出类似下面给的一个串口中断的参考代码,但是它是有问题的,对于HC-COM来说,是不能正常工作的
void Com_Int ( void ) interrupt 4
{
uchar receive_data;
EA = 0 ;
if ( RI == 1 )
{
RI = 0 ;
receive_data = SBUF;
if ( receive_data == '1' )
{
LED = 0 ;
}
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 )
{
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代表,你要单片机去执行的任务或者在接收到相关指令后的反应
若想了解如何利用手机,通过蓝牙模块实现对小车的控制可以参考如下博文:
点击以上蓝色字体即可跳转。
或者直接访问如下网址: https://blog.csdn.net/qq_44339029/article/details/106562519