一段时间以来,Qt的串口通讯一直是一个亟待解决的问题。上网调研了一段时间后,有了以下发现:
1.在早期的Qt版本中,主要是采用第三方类作为Qt对串口通讯的支持,具体可参考http://blog.csdn.net/yafeilinux/article/details/4717706,
2.在进入Qt5的时代后,串口通讯已经作为Qt的一个附件部分,但没有作为Qt的正式模块。使用这样的串口模块时,需要自行编译串口部分,具体可参考:http://blog.csdn.net/chenlong12580/article/details/8976176。
鉴于以上两种做法都比较复杂,本人一直没有调试串口通讯部分,直到最近才不得不重新审视这部分的工作。刚好在这段时间Qt5.1.0的稳定版本发布,在阅读新特性时才发现,串口模块已经正式成为了Qt的官方部分(参考:http://www.ics.com/blog/whats-new-qt-51-qtserialport#.Ue9zBocsnXA:It officially becomes part of Qt with the 5.1.0 release.)。于是我下载了最新的Qt版本Qt 5.1.0 for Windows 32-bit (VS 2010, OpenGL, 504 MB) ,安装完成后,发现果然在安装文件中多了QtSerialPort部分。同时我在VS2010中新建了一个Qt工程,用以测试Qt的串口通讯,只可惜在添加Qt的模块时,并没有找到SerialPort,这就必须在建立工程后手动添加了,比较麻烦!
最后附上一个测试程序,参考网页:http://www.ics.com/blog/whats-new-qt-51-qtserialport#.Ue9zBocsnXA
#include <QCoreApplication>
#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "Number of serial ports:" << QSerialPortInfo::availablePorts().count();
foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {
qDebug() << "
Port:" << serialPortInfo.portName();
qDebug() << "Location:" << serialPortInfo.systemLocation();
qDebug() << "Description:" << serialPortInfo.description();
qDebug() << "Manufacturer:" << serialPortInfo.manufacturer();
qDebug() << "Vendor Identifier:" << (serialPortInfo.hasVendorIdentifier() ? QByteArray::number(serialPortInfo.vendorIdentifier(), 16) : QByteArray());
qDebug() << "Product Identifier:" << (serialPortInfo.hasProductIdentifier() ? QByteArray::number(serialPortInfo.productIdentifier(), 16) : QByteArray());
qDebug() << "Busy:" << (serialPortInfo.isBusy() ? QObject::tr("Yes") : QObject::tr("No"));
QSerialPort *port = new QSerialPort(serialPortInfo);
if (port->open(QIODevice::ReadWrite)) {
qDebug() << "Baud rate:" << port->baudRate();
qDebug() << "Data bits:" << port->dataBits();
qDebug() << "Stop bits:" << port->stopBits();
qDebug() << "Parity:" << port->parity();
qDebug() << "Flow control:" << port->flowControl();
qDebug() << "Read buffer size:" << port->readBufferSize();
port->close();
} else {
qDebug() << "Unable to open port, error code" << port->error();
}
delete port;
}
return 0;
}