这篇文章让你懂->Qt串口通信(嵌入式上位机开发)
在开发上位机的过程中,我深入学习了Qt的串口通信,遇到了不少坑,也积累了一些经验。希望这篇文章能帮助正在学习Qt串口通信的你少走弯路,也方便自己以后快速回顾。
本文章从0基础讲述Qt如何连接端口号互发送和互接受信息,在讲述数据帧
环境Qt5、虚拟串口驱动、串口调试助手(文章结尾会给出链接)
一、串口通讯
主要参数:波特率、校验位、数据位、停止位、控制流
主要操作:串口的打开和关闭,刷新串口设备、接收数据
二、实现串口通信
1、在头文件中引入串口通信的QtSerialPort类的两个头文件
// 引入串口通信的头文件
#include <QtSerialPort/QSerialPort> //提供访问串口的功能
#include <QtSerialPort/QSerialPortInfo> //提供系统中的存在的串口信息

2、在工程文件中.pro添加以下代码
QT += serialport

3、在头文件中定义全局的串口对象
QSerialPort *serialPort;
做完前两个步骤,我们即将开始实现一个串口通信
4、创建串口对象和连接信号槽
// 创建串口对象
serialPort = new QSerialPort(this);
// 连接信号槽:当串口有数据达到时,自动调用serialPortReadyRead_stol()
connect(serialPort, SIGNAL(readyRead()),
this, SLOT(serialPortReadyRead_Slot()));

5、通过一个按键实现串口的开和关


1、关联打开串口的点击事件
2、在打开按键中实现
void Widget::on_openBt_clicked()
{
if(open_flag == false) // 串口未打开,执行打开操作
{
// 检查是否选择了串口
if(ui->serialBox->currentText() == "无可用串口" || ui->serialBox->count() == 0)
{
QMessageBox::warning(this, "提示", "没有可用的串口!");
return;
}
QSerialPort::BaudRate baudBite = QSerialPort::Baud115200;//波特率115200
QSerialPort::DataBits dataBite = QSerialPort::Data8; //数据位8位
QSerialPort::StopBits stopBite = QSerialPort::OneStop; //停止位1位
QSerialPort::Parity checkBite = QSerialPort::NoParity; //无校验
serialPort->setPortName(ui->serialBox->currentText()); //设置串口号
serialPort->setBaudRate(baudBite); //设置波特率
serialPort->setDataBits(dataBite); //设置数据位
serialPort->setStopBits(stopBite); //设置停止位
serialPort->setParity(checkBite); //设置校验位
qDebug() << "尝试打开串口:" << ui->serialBox->currentText();
//尝试打开窗口
if(serialPort->open(QIODevice::ReadWrite)){//以读写方式打开
open_flag = true; // 标记已打开
ui->openBt->setText("关闭串口"); //改变按钮文字
QMessageBox::information(this, "提示", "串口打开成功");
qDebug() << "串口打开成功";
// 串口打开后再发送数据
on_Send_clicked();
}
else {
QMessageBox::critical(this, "提示", "串口打开失败");
qDebug() << "串口打开失败,错误:" << serialPort->errorString();
}
}
else // 串口已打开,执行关闭操作
{
serialPort->clear(); //清空缓冲区
serialPort->close();//关闭串口
open_flag = false;//标记已关闭
ui->openBt->setText("打开串口");//改变按钮文字
QMessageBox::information(this, "提示", "串口关闭成功");
qDebug() << "串口已关闭";
}
}
3、刷新串口
如果在打开软件后才插上串口设备的话,下拉列表不会显示,需要重新搜索串口
点击刷新串口按钮,刷新串口号,并显示出来
void Widget::on_refreshBt_clicked()
{
qDebug() << "刷新串口";
ui->serialBox->clear(); //清空下拉框
// 获取当前电脑上所有可用的串口
this->avaiPortsList = QSerialPortInfo::availablePorts();
if(avaiPortsList.isEmpty())// 如果没有串口
{
ui->serialBox->addItem("无可用串口");
qDebug() << "没有发现串口";
return;
}
// 遍历所有串口,添加到下拉框中
for(int i = 0; i < avaiPortsList.length(); i++)
{
ui->serialBox->addItem(avaiPortsList[i].portName());
qDebug() << "发现串口:" << avaiPortsList[i].portName();
}
}
6.串口发送数据
将输入框内容发送:
void Widget::on_Send_clicked()
{
// 从界面输入框获取卡号
QString data = QString("W:%1").arg(ui->t5cardEdit->text());
//将字符串转换出UTF8
QByteArray dataArray = data.toUtf8(); // 将字符串转换成字节数组
//通过串口发送出去
serialPort->write(dataArray); // 发送数据到串口
qDebug() << "发送命令成功!";
}
7.串口接收数据
串口接收槽函数
void Widget::serialPortReadyRead_Slot()
{
QByteArray data = serialPort->readAll();
// 尝试UTF-8解码
QString utf8Text = QString::fromUtf8(data);
qDebug() << "UTF-8解码:" << utf8Text;
// 如果UTF-8乱码,尝试GBK
if(utf8Text.contains("�")) {
QTextCodec *codec = QTextCodec::codecForName("GBK");
QString gbkText = codec->toUnicode(data);
qDebug() << "GBK解码:" << gbkText;
}
}
测试:
然后我们开始测试,使用软件,连接我们的端口号,COM6和COM7

运行我们的Qt串口调试和打开另一个虚拟窗口调试,我们尝试能不能连接,去实现互发互收
这是我们的Qt串口界面:

这是另一个虚拟窗口界面:

我们已经把虚拟界面COM7打开了,Qt打开串口COM6,尝试能不能连接成功

此时弹窗,我们已经打开成功了!
那么我们开始输入一些信息,实现互相接收、发送

这是我们的虚拟串口,发送的Hello World!我们可以发现,这个虚拟串口它是以GBK编码发送的,但是我们通过虚拟串口发送,可以验证出,我们的发送和接收没有问题,我们在试试Qt去发送

接下来,我们就发送成功啦!
看到这里,恭喜你学会了上位机的串口通信!
虚拟串口驱动、串口调试助手来链接:
链接: https://pan.baidu.com/s/1d7jVdu5O3cIb-5GPjdhzew?pwd=px58 提取码: px58 复制这段内容后打开百度网盘手机App,操作更方便哦
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)