简单记录一下使用Qserial模块实现Qt的串口通信,我使用的环境是VS+qt,因此需要在创建项目的时候勾选Serial Port模块。
提前准备:
1、虚拟串口工具
创建一组虚拟串口,我是COM2和COM3;
2、串口调试助手
用于和上位机进行信息交互;
步骤:
1、设计交互UI界面;
2、查找可用串口(我省略了,直接开的虚拟串口);
3、串口初始化 —— 打开串口、设置串口参数;
4、在发送槽函数里面发送数据;
5、在接收槽函数里面接收和显示数据;
6、关闭串口,释放串口变量。
代码:
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_serial_test.h"
#include <QSerialPort>
#include <QSerialPortInfo>
class serial_test : public QMainWindow
{
Q_OBJECT
public:
serial_test(QWidget *parent = Q_NULLPTR);
//QStringList getPortNameList();//获取所有可用的串口列表
void initserial();
public slots:
void sendInfo();
void receiveInfo();
void closeSerial();
private:
Ui::serial_testClass ui;
QSerialPort* m_serialPort; //串口类
QStringList m_portNameList;
};
我发现在cpp文件中,不需要创建按钮的信号和槽函数,也就是说不用connect按钮和槽也能使用按钮,不知道是不是因为在 ui 的h文件中已经创建了connect的原因,麻烦知道的朋友留言,谢谢。
#include "serial_test.h"
serial_test::serial_test(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_serialPort = new QSerialPort();
initserial();
connect(ui.ptn1, SIGNAL(clicked()), this, SLOT(sendInfo()), Qt::UniqueConnection);
connect(m_serialPort, &QSerialPort::readyRead, this, &serial_test::receiveInfo);
connect(this, &serial_test::destroyed, this, &serial_test::closeSerial);
}
void serial_test::initserial() {
if (m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了
{
m_serialPort->clear();
m_serialPort->close();
}
m_serialPort->setPortName("COM2");
if (!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
{
// qDebug() << "打开失败!";
ui.label->setText("couldn't open");
return;
}
// qDebug() << "串口打开成功!";
ui.label->setText("open ok");
m_serialPort->setBaudRate(QSerialPort::Baud115200, QSerialPort::AllDirections);//设置波特率和读写方向
m_serialPort->setDataBits(QSerialPort::Data8); //数据位为8位
m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
m_serialPort->setParity(QSerialPort::NoParity); //无校验位
m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
}
void serial_test::sendInfo() {
m_serialPort->write(ui.lineEdit->text().toLatin1());
}
void serial_test::receiveInfo() {
QByteArray buf;
buf = m_serialPort->readAll();
if (!buf.isEmpty()) {
QString str = ui.textEdit->toPlainText();
str += tr(buf);
ui.textEdit->clear();
ui.textEdit->append(str);
}
buf.clear();
}
void serial_test::closeSerial() {
m_serialPort->clear();
m_serialPort->close();
delete m_serialPort;
}
结果:
上位机:
串口助手:
附上:查找可用串口的代码
//查找可用的串口
foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite))
{
ui->PortBox->addItem(serial.portName());
serial.close();
}
}
本文代码来自:https://www.cnblogs.com/wurenzhong/p/8186437.html