Qt windows端的蓝牙串口服务

时光毁灭记忆、已成空白 提交于 2020-03-04 15:48:56

环境

系统

只测试过自己电脑,系统版本如下:
在这里插入图片描述
查看方式按win+R,然后输入winver确定即可:
在这里插入图片描述
查看设备管理器,确定自己电脑是否支持蓝牙模块:
在这里插入图片描述

Qt

需要选择MSVC版本编译,MinGW不支持Windows下的蓝牙模块,这也就限制了Qt的版本(早期有些版本没有MSVC编译器),本文使用的是Qt 5.12.6 MSVC2017 64bit

蓝牙模块

电脑端作为主机,蓝牙模块作为从机,测试用的是在某宝买的蓝牙模块:
在这里插入图片描述

使用步骤

蓝牙模块参数获取

使用USB转串口模块和蓝牙模块按如下连接:
在这里插入图片描述
电脑端打开串口助手,连接USB转串口模块的端口,默认波特率是9600:
在这里插入图片描述

AT+BAUD7
(网络截图)

配对

双击电脑的右下角的蓝牙图标:
在这里插入图片描述

如果右下角没有,如下也可以找到:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在本文的上面一点有提到如何修改蓝牙名字,和PIN码,配对时就需要用到PIN码:
在这里插入图片描述
输入后点击连接即可配对成功:
在这里插入图片描述

扫描、连接、数据收发

新建工程,在.pro加入bluetooth
在这里插入图片描述

扫描

头文件主要代码:

#include <QBluetoothDeviceInfo>
#include <qbluetoothdevicediscoveryagent.h>

private slots:
    void discoverBlueTooth(QBluetoothDeviceInfo info);
    void scanFinished();
    
private:
	QBluetoothLocalDevice *localDevice;

cpp文件主要代码:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QBluetoothDeviceDiscoveryAgent *discoveryAgent;
    discoveryAgent = new QBluetoothDeviceDiscoveryAgent;
    connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), this, SLOT(discoverBlueTooth(QBluetoothDeviceInfo)));
    connect(discoveryAgent, SIGNAL(finished()), this, SLOT(discoveryFinished()));
    discoveryAgent->start();
}
void MainWindow::discoveryFinished()
{
    qDebug()<<"discoveryFinished";
}

void MainWindow::discoverBlueTooth(QBluetoothDeviceInfo info)
{
    QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
    qDebug()<<label;
}

运行起来后就可以看到搜索到的蓝牙列表:
在这里插入图片描述

连接

头文件主要代码:

#include <QBluetoothSocket>
#include <QBluetoothUuid>
#include <QBluetoothAddress>
#include <QIODevice>

private slots:
    void readBluetoothDataEvent();
    void bluetoothConnectedEvent();
    
private:
	QString BTaddress;		// 记录MAC地址
    QBluetoothSocket *socket;	

cpp文件主要代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    QBluetoothDeviceDiscoveryAgent *discoveryAgent;
    discoveryAgent = new QBluetoothDeviceDiscoveryAgent;
    connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)), this, SLOT(discoverBlueTooth(QBluetoothDeviceInfo)));
    connect(discoveryAgent, SIGNAL(finished()), this, SLOT(discoveryFinished()));
    discoveryAgent->start();
}
void MainWindow::discoveryFinished()
{
    qDebug()<<"discoveryFinished";

    static QString serviceUuid("00001101-0000-1000-8000-00805F9B34FB");
    socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
    socket->connectToService(QBluetoothAddress(BTaddress), QBluetoothUuid(serviceUuid),QIODevice::ReadWrite);
    connect(socket,SIGNAL(readyRead()), this, SLOT(readBluetoothDataEvent()));
    connect(socket,SIGNAL(connected()), this, SLOT(bluetoothConnectedEvent()));
}

void MainWindow::discoverBlueTooth(QBluetoothDeviceInfo info)
{
    QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
    if(info.name()=="HC-06")
    {
        BTaddress = info.address().toString();
    }
    qDebug()<<label;
}


void MainWindow::readBluetoothDataEvent()
{
   char data[100];
   qint64 len = socket->read((char *)data, 100);

   QByteArray qa2((char*)data,len);
   QString qstr(qa2.toHex());//
   qDebug()<<"----"<<qstr.toUpper();
}
void MainWindow::bluetoothConnectedEvent()
{
    qDebug()<<"bluetoothConnectedEvent";
}

MainWindow::~MainWindow()
{
    delete ui;
}

运行后就可以看到连接成功:
在这里插入图片描述

代码中有一行:

static QString serviceUuid("00001101-0000-1000-8000-00805F9B34FB");

蓝牙不仅仅有串口服务,还具有比如蓝牙耳机的音频服务,文件传输服务等,就是通过这个UUID来区分,不同的UUID有不同的含义,点击这里可以看到网友列出来的相关UUID:

数据收发

数据接收在上面的槽函数readBluetoothDataEvent()里面:

void MainWindow::readBluetoothDataEvent()
{
   char data[100];
   qint64 len = socket->read((char *)data, 100);

   QByteArray qa2((char*)data,len);
   QString qstr(qa2.toHex());//
   qDebug()<<"----"<<qstr.toUpper();
}

数据发送可以用连接的socket来实现:

void MainWindow::bluetoothDataSend(QString str)
{
    QByteArray arrayData;
    arrayData = str.toUtf8();
    socket->write(arrayData);
}

// 连接成功的事件中添加一行发送数据:
void MainWindow::bluetoothConnectedEvent()
{
    qDebug()<<"bluetoothConnectedEvent";

    bluetoothDataSend("hellow bluetooth");
}

即可实现蓝牙的串口交互(这里的波特率是根据上面的修改方式改过,如果没改默认是9600):
在这里插入图片描述
本文的demo工程

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!