树莓派3B板载蓝牙与HC05蓝牙模块通讯(C++编程实现)
在项目中需要使用树莓派的板载蓝牙与HC05蓝牙模块进行通讯,但目前HC05和树莓派的原生接口兼容性并不完善,尝试了很多方案,以下是一个目前能用的方案.
一、树莓派与HC05蓝牙模块进行连接
在树莓派的图形界面单机右上角蓝牙图标>Add Device,如下图所示,
点击Pair,输入配对密码,一直OK,最后会弹出连接失败.如下图所示,没关系,这里只是输入配对密码.
在puTTY客户端里连接树莓派,使用命令搜索蓝牙模块的mac地址
hcitool scan
再用命令,连接蓝牙模块
sudo rfcomm connect 0 20:16:05:24:15:14 1&
至此连接蓝牙模块成功,此时可以看到蓝牙模块上的LED灯频率改变.
输入命令 ,可以看到蓝牙端口
ls /dev -l
二、C++编程连接打开蓝牙串口
1.蓝牙串口操作所需头文件
#include <stdio.h> /*标准输入输出定义*/
#include <stdlib.h> /*标准函数库定义*/
#include <unistd.h> /*Unix 标准函数定义*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> /*文件控制定义*/
#include <termios.h> /*PPSIX 终端控制定义*/
#include <errno.h> /*错误号定义*/
2.打开蓝牙串口,并发送数据
int fd = open("/dev/rfcomm0", O_RDWR | O_NOCTTY | O_NDELAY);
int nByte = 0;
if (fd < 0)
return;
struct termios options;
tcgetattr(fd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_lflag &= ~(ICANON | ECHO | ECHOE); /*Input*/
options.c_oflag &= ~OPOST;
char data2[11] = { 0xFF,0xAA, 0x3,0xC,0x0,0x0,0x0,0x0, 0x0,0x0 };
data2[10] = generateSign(data2);
nByte = write(fd, data2, 11);
close(fd);
至此编程部分结束,但我的程序需要开机自动运行,因此需要自动连接蓝牙.
三、蓝牙开机自动连接
在树莓派 /etc/init.d 新建文件connectBluetooth.sh,输入:
#!/bin/sh
sleep 3 #等待系统加载好相关库
sudo rfcomm connect 0 20:16:05:24:15:14 1&
改用root 帐号登录,为connectBluetooth.sh文件授权
sudo chmod 777 connectBluetooth.sh
设置connectBluetooth.sh自动启动
sudo update-rc.d connectBluetooth.sh defaults
如此还有一个小问题,当HC05模块比树莓派开机早了,就无法连接上,我用了比较粗暴的方法,使用代码直接让树莓派重启.
system("sudo reboot");
四、存在问题
1、HC05模块和树莓派的蓝牙配对还存在问题,必须在图形界面下完成.
2、未实现使用代码连接蓝牙模块,连接蓝牙模块就必须使用重启树莓派的方式。
-------------------------20180915更新------------------------
在下一篇博客 树莓派3B板载蓝牙与HC05蓝牙模块配对(shell命令实现),实现了在命令界面下实现树莓派与蓝牙模块的配对