QT应用编程: 编写HC05串口蓝牙调试助手(Android系统APP)

简介: QT应用编程: 编写HC05串口蓝牙调试助手(Android系统APP)

一、环境介绍

QT版本: 5.12.6


编译环境: win10 64位


目标系统: Android


完整工程源码下载地址(包含APK文件):  https://download.csdn.net/download/xiaolong1126626497/19051787


想学习QT的Android环境搭建看这里(win10版本): https://blog.csdn.net/xiaolong1126626497/article/details/117254453


                                                         (ubuntu版本): https://blog.csdn.net/xiaolong1126626497/article/details/117256660


想学习QT入门到精通编程的看这里:https://blog.csdn.net/xiaolong1126626497/article/details/116485145


二、功能介绍

设计本软件的目的是作为HC05/06系列蓝牙串口的调试助手,方便嵌入式工程师、电子工程师调试蓝牙串口模块,HC05/06是经典的2.0串口蓝牙模块。

image.png

image.pngimage.png

三、软件核心源码

#include "mainwindow.h"
#include "ui_mainwindow.h"
/*
 * 设置QT界面的样式
*/
void MainWindow::SetStyle(const QString &qssFile) {
    QFile file(qssFile);
    if (file.open(QFile::ReadOnly)) {
        QString qss = QLatin1String(file.readAll());
        qApp->setStyleSheet(qss);
        QString PaletteColor = qss.mid(20,7);
        qApp->setPalette(QPalette(QColor(PaletteColor)));
        file.close();
    }
    else
    {
        qApp->setStyleSheet("");
    }
}
static const QLatin1String serviceUuid("00001101-0000-1000-8000-00805F9B34FB");
//这个字符串里面的内容就是串口模式的Uuid
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->SetStyle(":/qss/blue.css");     //设置样式表
    this->setWindowTitle("HC05蓝牙调试助手"); //设置标题
    this->setWindowIcon(QIcon(":/wbyq.ico")); //设置图标
    /*1. 实例化蓝牙相关的对象*/
    discoveryAgent = new QBluetoothDeviceDiscoveryAgent();
    localDevice = new QBluetoothLocalDevice();
    socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
    //RfcommProtocol表示该服务使用RFCOMM套接字协议。RfcommProtocol属于模拟RS232模式,就叫串口模式
    /*2. 关联蓝牙设备相关的信号*/
    /*2.1 关联发现设备的槽函数,当扫描发现周围的蓝牙设备时,会发出deviceDiscovered信号*/
    connect(discoveryAgent,
            SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
            this,
            SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo))
            );
    //蓝牙有数据可读
    connect(socket,
            SIGNAL(readyRead()),
            this,
            SLOT(readBluetoothDataEvent())
            );
    //蓝牙连接建立成功
    connect(socket,
            SIGNAL(connected()),
            this,
            SLOT(bluetoothConnectedEvent())
            );
    //蓝牙断开连接
    connect(socket,
            SIGNAL(disconnected()),
            this,
            SLOT(bluetoothDisconnectedEvent())
            );
    //蓝牙连接错误
    connect(socket, static_cast<void(QBluetoothSocket::*)(QBluetoothSocket::SocketError)>(&QBluetoothSocket::error),
          [=](QBluetoothSocket::SocketError error)
    {
            ui->plainTextEdit_BluetoothInfiShow->insertPlainText(socket->errorString()); //显示错误信息
            if(QBluetoothSocket::UnknownSocketError ==error)
            {
               ui->plainTextEdit_BluetoothInfiShow->insertPlainText("位置错误\n"); //显示错误信息
            }
            if(QBluetoothSocket::NoSocketError ==error)
            {
                ui->plainTextEdit_BluetoothInfiShow->insertPlainText(" 没有错误 用于测试\n"); //显示错误信息
            }
            if(QBluetoothSocket::HostNotFoundError ==error)
            {
                  ui->plainTextEdit_BluetoothInfiShow->insertPlainText("找不到远程主机\n"); //显示错误信息
            }
            if(QBluetoothSocket::ServiceNotFoundError ==error)
            {
                     ui->plainTextEdit_BluetoothInfiShow->insertPlainText(" 无法在远程主机上找到服务UUID\n"); //显示错误信息
            }
            if(QBluetoothSocket::NetworkError ==error)
            {
                 ui->plainTextEdit_BluetoothInfiShow->insertPlainText("尝试从套接字读取或写入返回错误\n"); //显示错误信息
            }
            if(QBluetoothSocket::UnsupportedProtocolError ==error)
            {
                 ui->plainTextEdit_BluetoothInfiShow->insertPlainText(" 该平台不支持该协议\n"); //显示错误信息
            }
            if(QBluetoothSocket::OperationError ==error)
            {
                 ui->plainTextEdit_BluetoothInfiShow->insertPlainText("当套接字处于不允许的状态时尝试进行操作\n"); //显示错误信息
            }
    });
    /*3. 检查蓝牙的状态,用于设置按钮的初始状态*/
    /*3.1 检查蓝牙是否开启*/
    if(localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff)
    {
            //如果蓝牙处于关闭状态
            ui->pushButton_OpenBluetooth->setEnabled(true);   //打开按钮
            ui->pushButton_CloseBluetooth->setEnabled(false); //关闭按钮
            ui->pushButton_BluetoothScan->setEnabled(false);
    }
    else    //如果蓝牙处于开启状态
    {
            ui->pushButton_OpenBluetooth->setEnabled(false);//打开按钮
            ui->pushButton_CloseBluetooth->setEnabled(true);//关闭按钮
             ui->pushButton_BluetoothScan->setEnabled(true); //设置扫描按钮可用
    }
    /*3.2 设置标签显示本地蓝牙的名称*/
    QString name_info("本机蓝牙:");
    name_info+=localDevice->name();
    ui->label_BluetoothName->setText(name_info);
     ui->pushButton_StopScan->setEnabled(false);      //设置停止扫描蓝牙的按钮不可用
     ui->plainTextEdit_BluetoothInfiShow->setEnabled(false); //设置不可编辑
}
MainWindow::~MainWindow()
{
    delete ui;
    delete discoveryAgent;
    delete localDevice;
    delete socket;
}
void MainWindow::on_pushButton_OpenBluetooth_clicked()
{
    /*请求打开蓝牙设备*/
    localDevice->powerOn();
    ui->pushButton_OpenBluetooth->setEnabled(false);//打开按钮
    ui->pushButton_CloseBluetooth->setEnabled(true);//关闭按钮
    ui->pushButton_BluetoothScan->setEnabled(true); //设置扫描按钮可用
    ui->pushButton_StopScan->setEnabled(true);
}
void MainWindow::on_pushButton_CloseBluetooth_clicked()
{
    /*关闭蓝牙设备*/
    localDevice->setHostMode(QBluetoothLocalDevice::HostPoweredOff);
    ui->pushButton_OpenBluetooth->setEnabled(true);//打开按钮
    ui->pushButton_CloseBluetooth->setEnabled(false);//关闭按钮
    ui->pushButton_BluetoothScan->setEnabled(false); //设置扫描按钮不可用
    ui->pushButton_StopScan->setEnabled(false);
}
void MainWindow::on_pushButton_BluetoothScan_clicked()
{
     /*开始扫描周围的蓝牙设备*/
    discoveryAgent->start();
    ui->comboBox_BluetoothDevice->clear(); //清除条目
    ui->pushButton_BluetoothScan->setEnabled(false); //设置扫描按钮不可用
    ui->pushButton_StopScan->setEnabled(true);     //设置停止扫描按钮可用
}
void MainWindow::on_pushButton_StopScan_clicked()
{
    /*停止扫描周围的蓝牙设备*/
    discoveryAgent->stop();
    ui->pushButton_StopScan->setEnabled(false);     //设置停止扫描按钮不可用
    ui->pushButton_BluetoothScan->setEnabled(true); //设置扫描按钮可用
}
/*当扫描到周围的设备时会调用当前的槽函数*/
void MainWindow::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info)
{
   // QString label = QString("%1 %2").arg(info.name()).arg(info.address().toString());
    QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
    ui->comboBox_BluetoothDevice->addItem(label); //添加字符串到comboBox上
}
//有数据可读
void MainWindow::readBluetoothDataEvent()
{
    QByteArray all = socket->readAll();
    ui->plainTextEdit_BluetoothInfiShow->insertPlainText(QString::fromLocal8Bit(all));
}
//建立连接
void MainWindow::bluetoothConnectedEvent()
{
    QMessageBox::information(this,tr("连接提示"),"蓝牙连接成功!");
    /*停止扫描周围的蓝牙设备*/
    discoveryAgent->stop();
    ui->pushButton_StopScan->setEnabled(false);     //设置停止扫描按钮不可用
    ui->pushButton_BluetoothScan->setEnabled(false); //设置扫描按钮不可用
}
//断开连接
void MainWindow::bluetoothDisconnectedEvent()
{
    QMessageBox::information(this,tr("连接提示"),"蓝牙断开连接!");
    ui->pushButton_BluetoothScan->setEnabled(true); //设置扫描按钮可用
}
/*
在说蓝牙设备连接之前,不得不提一个非常重要的概念,就是蓝牙的Uuid,引用一下百度的:
在蓝牙中,每个服务和服务属性都唯一地由"全球唯一标识符" (UUID)来校验。
正如它的名字所暗示的,每一个这样的标识符都要在时空上保证唯一。
UUID类可表现为短整形(16或32位)和长整形(128位)UUID。
他提供了分别利用String和16位或32位数值来创建类的构造函数,提供了一个可以比较两个UUID(如果两个都是128位)的方法,还有一个可以转换一个UUID为一个字符串的方法。
UUID实例是不可改变的(immutable),只有被UUID标示的服务可以被发现。
在Linux下你用一个命令uuidgen -t可以生成一个UUID值;
在Windows下则执行命令uuidgen 。UUID看起来就像如下的这个形式:2d266186-01fb-47c2-8d9f-10b8ec891363。当使用生成的UUID去创建一个UUID对象,你可以去掉连字符。
*/
//发送数据
void MainWindow::on_pushButton_SendData_clicked()
{
    QString text=ui->lineEdit_SendData->text();
    QByteArray send_data=text.toLocal8Bit();
    socket->write(send_data); //发送数据
}
//清空收到的数据
void MainWindow::on_pushButton_Clear_clicked()
{
    ui->plainTextEdit_BluetoothInfiShow->setPlainText("");
}
//连接蓝牙
void MainWindow::on_pushButton_ConnectDev_clicked()
{
    QString text = ui->comboBox_BluetoothDevice->currentText();
    int index = text.indexOf(' ');
    if(index == -1) return;
    QBluetoothAddress address(text.left(index));
    QString connect_device="开始连接蓝牙设备:\n";
    connect_device+=ui->comboBox_BluetoothDevice->currentText();
    QMessageBox::information(this,tr("连接提示"),connect_device);
    //开始连接蓝牙设备
    socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
}
//帮助提示
void MainWindow::on_pushButton_help_clicked()
{
    QMessageBox::information(this,tr("帮助提示"),"本软件用于HC-05/06系列串口蓝牙调试!\n"
                                             "不支持BLE4.0版本蓝牙调试!\n"
                                             "软件作者:DS小龙哥\n"
                                             "BUG反馈:1126626497@qq.com");
}


目录
相关文章
|
1月前
|
人工智能 自然语言处理 前端开发
100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
打开手机,录制下你完成的代码效果,发布到你的社交媒体,前 100 个@玺哥超Carry、@通义灵码的粉丝,可以免费获得一个降噪蓝牙耳机。
6076 16
|
4月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
120 0
|
27天前
|
人工智能 自然语言处理
完成 100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
通义灵码 打造全网第一个完整的、面向普通人的自然语言编程教程。完全使用 AI,再配合简单易懂的方法,只要你会打字,就能真正做出一个完整的应用。
78 2
|
1月前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
51 8
|
27天前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
29天前
完成 100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP
完成 100个降噪蓝牙耳机免费领,用通义灵码从 0 开始打造一个完整APP @玺哥超Carry @通义灵码
|
4月前
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
257 1
|
4月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
231 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
5月前
|
存储 物联网 数据库
App Inventor 2 低功耗蓝牙 BlueToothLE 拓展中文文档(完整翻译加强版)
低功耗蓝牙,也称为蓝牙LE 或简称 BLE,是一种类似于经典蓝牙的新通信协议,不同之处在于它旨在消耗更少的功耗和成本,同时保持同等的功能。 因此,低功耗蓝牙是与耗电资源有限的物联网设备进行通信的首选。
187 0
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
199 1