Qt 5.7串口开发教程
Qt5.7已经封装了关于串口操作的类QSerialPort,QSerialPortInfo等,不需要再使用第三方串口类。串口应用程序的开发,包括查找串口,打开串口,发送数据,读取数据等。完整程序源码,请点击【串口助手源码下载】。
界面如下:
先看看类QSerialPortInfo, Qt的解释如下:
Provides information about existing serial ports.
Use the static functions to generate a list of QSerialPortInfo objects. Each QSerialPortInfo object in the list represents a single serial port and can be queried for the port name, system location, description, and manufacturer. The QSerialPortInfo class can also be used as an input parameter for the setPort() method of the QSerialPort class.
英语差的没关系,看看有道翻译:
提供现有的串行端口的信息。
使用静态函数生成QSerialPortInfo对象的列表。列表中的每个QSerialPortInfo对象代表了一个串行端口和端口名称,可以查询系统位置、描述和制造商。QSerialPortInfo类也可以作为输入参数用于setPort QSerialPort()方法的类。
一. 我们先来查找系统可用的串口:
//循环查找串口
foreach(const QSerialPortInfo &Info, QSerialPortInfo::availablePorts())
{
QSerialPort availablePort;
QString str = Info.portName(); //调试看串口的名字
availablePort.setPortName(Info.portName());
if (availablePort.open(QIODevice::ReadWrite))
{
int index = ui.COM->findText(Info.portName());
ui.COM->setItemText(index, Info.portName() + QString::fromLocal8Bit("可用"));
ui.COM->setCurrentIndex(index);
m_iVec.push_back(index);
availablePort.close(); //打开后关闭
}
}
二. 打开串口
QtSerialPort的成员函数已经有了该功能,如下:
bool open(OpenMode mode) Q_DECL_OVERRIDE;
void close() Q_DECL_OVERRIDE;
具体代码如下:
//打开串口
void MySerial::slotOpenSerialPort()
{
if(ui.btn_OpenSerialPort->text() == QString::fromLocal8Bit("打开串口"))
{
m_pSerialPort = new QSerialPort(this);
QString tempStr = ui.COM->currentText();
tempStr.remove(QString::fromLocal8Bit("可用"), Qt::CaseSensitive); //去掉“可用”这两个字
//选择串口号
m_pSerialPort->setPortName(tempStr);
if (m_pSerialPort->open(QIODevice::ReadWrite))
{
portIsOpen = true;
//设置波特率,校验位,数据位,停止位
setBaudRate();
setParity();
setDataBits();
setStopBits();
setFlowCtrl();
statusBar()->showMessage(m_pSerialPort->portName() + " is opened");
connect(Timer_CP, SIGNAL(timeout()), this, SLOT(checkPort()));
Timer_CP->start(1000);
//接收数据时会触发信号readyRead()
connect(m_pSerialPort, SIGNAL(readyRead()), this, SLOT(readMyCom()));
ui.btn_OpenSerialPort->setText(QString::fromLocal8Bit("关闭串口"));
ChangeLabelColor(0, 255, 0);
}
else
{
QMessageBox::warning(this, QString::fromLocal8Bit("串口打开失败"), QString::fromLocal8Bit("串口不存在或本串口已经被占用,请重试!"), QMessageBox::Cancel);
ui.btn_OpenSerialPort->setChecked(false);
return;
}
}
else
{
if (m_pTimer_AutoSend->isActive())
{
m_pTimer_AutoSend->stop();
}
if (Timer_CP->isActive())
Timer_CP->stop();
Timer_CP->disconnect();
if (m_pSerialPort->isOpen()) m_pSerialPort->close();
resetCnt();
ui.btn_OpenSerialPort->setText(QString::fromLocal8Bit("打开串口"));
statusBar()->showMessage(m_pSerialPort->portName() + " is closed", 2000);
portIsOpen = false;
ChangeLabelColor(0, 0, 0);
}
}
具体代码请参考源码,上面有链接。
三. 发送数据
串口操作是对设备的输入输出进行操作,可以知道QSerialPort是派生于QIODevice,发数据相当于给串口写入数据,需要调用QIODevice的write方法。先连接【发送】按钮对应的槽;
connect(ui.sendButton_1, SIGNAL(clicked()), this, SLOT(writeToBuf())); //发送
writeToBuf()的实现如下:
void MySerial::writeToBuf()
{
QObject *signalSender = sender();
if (signalSender->objectName() == "sendButton_1")
{
if (ui.hexRB_1->isChecked())
{
writeHex(ui.senderTextEdit_1);
}
else
{
writeChr(ui.senderTextEdit_1);
}
}
四. 读取串口的数据
在打开串口时,有一行代码如下:
//接收数据时会触发信号readyRead()
connect(m_pSerialPort, SIGNAL(readyRead()), this, SLOT(readMyCom()));
触发信号readyRead()后,就会接受串口的数据,具体的实现请下载源码分析。
界面我用qss做了优化,不会的可以百度自学。
关于串口的代码分析就到此为止,请参考开头的源码进行分析,有一定C++基础的都可以看懂。