该篇介绍 Qt
串口相关类 - QSerialPort
& QSerialPortInfo
。
主要参考自 Qt
的官方文档,边学习边梳理,记录一下自己的思考及想法,仅此而已。
如有错漏,望不吝指教。
该类在 Qt5.1
中首次引入;作为串口辅助类,主要是提供系统已存在串口的信息(端口号,端口类型,系统位置,厂商信息等)。
上述信息可通过静态函数 availablePorts()
获取。这也是该类中最为重要的一个函数。
QSerialPortInfo
类也可以被用于 QSerialPort::setPort()
方法的输入参数。
通常我们先使用该类检测可用端口,再创建 QSerialPort对象
。
此外该类中还有另一静态方法,可返回目标平台支持的可用标准波特率。
void MainWindow::on_pushButton_clicked()
{
// QList qlist = QSerialPortInfo::availablePorts();
foreach (const QSerialPortInfo &port, QSerialPortInfo::availablePorts()){
ui->textBrowser->append("名称:" + port.portName());
ui->textBrowser->append("产品编码:" + port.productIdentifier());
ui->textBrowser->append("系统位置:" + port.systemLocation());
ui->textBrowser->append("序列号字符串:" + port.serialNumber());
ui->textBrowser->append("描述字符串:" + port.description());
ui->textBrowser->append("制造商:" + port.manufacturer());
ui->textBrowser->append("供应商编码:" + port.vendorIdentifier());
}
}
void MainWindow::on_pushButton_2_clicked(){
// QList qlist = QSerialPortInfo::standardBaudRates();
foreach (const qint32 &baudrate, QSerialPortInfo::standardBaudRates()) {
ui->textBrowser_2->append("BaudRates:" + QString::number(baudrate));
}
}
效果
学习 QSerialPort
,个人建议先到 Qt
的 Class
文档中将其属性、方法、信号等过一遍。这样对类内容有个大致了解。同时根据文档也能梳理出大致的使用流程。
QSerialPort Class
QSerialPortInfo Class
下面是我个人梳理的部分内容,如有错误还望指正。
true
setBaudRate(波特率,传播方向)
baudRaltChanged
Windows
上仅支持双向set方法
+ Changed信号
true
set方法
+ Changed信号
DTR
的状态set方法
+ Changed信号
error()
、clearError()
true
NoFlowControl
set方法
+ Changed信号
true
NoParity
set方法
+ Changed信号
RTS
状态RTS
信号的尝试将失败,该信号由驱动程序自动控制set方法
+ Changed信号
true
OneStop
set方法
+ Changed信号
QSerialPort
提供了以下构造方法,可以发现我们可以通过QSerialPortInfo
去创建,也可以通过端口名去设置,亦可不要参数,后面通过setPortName
进行端口绑定。
QSerialPort(const QSerialPortInfo&serialPortInfo,QObject * parent = nullptr)
QSerialPort(const QString&name,QObject * parent = nullptr)
QSerialPort(QObject * parent = nullptr)
flush()
方法时,将写入字节UART驱动程序缓冲区
QSerialPort类
将自动开始发送;waitForByteWritten()
ture
setPort()
设置或传递给QSerialPort
构造函数的名称。该名称很短,即从设备的内部变量系统位置提取并转换,转换算法有别于平台。Windows
:删除前缀\\. \ // /.
Unix
,BSD
:删除前缀/dev
read()
、readAll()
方法前可接收的数据量0
,表示缓冲区没有大小限制0
,则零位传输0.25-0.5s
不为0
,则根据实现方式在某个时间端内传输零位SerialPortInfo
中的端口0
意味着大小不受限制readyRead()
信号为止300ms
,若msecs
设置为-1
,则该功能不会超时maxsize
写入设备写入的x字节数
,发送错误返回-1
除 errorOccurred
外,其他都是改变端口属性时触发的信号
mSerial = new QSerialPort();
mSerial->setPortName(mPortName);
mSerial->setBaudRate(mBaudRate);
mSerial->setDataBits(mDataBits);
mSerial->setFlowControl(mFlowControl);
mSerial->setParity(mParity);
mSerial->setStopBits(mStopBits);
if(mSerial->open((QIODevice::ReadWrite))){
//打开成功则绑定readyRead()信号,在slot_uartReadData()读取
connect(mSerial,SIGNAL(readyRead()),this,SLOT(slot_uartReadData()));
connect(mSerial,SIGNAL(errorOccurred(QSerialPort::SerialPortError)),
this,SLOT(slot_uartError(QSerialPort::SerialPortError)));
}
else{
//xxx
}
//W
mSerial->write(ui->textEdit_output->toPlainText().toLocal8Bit().data());
//R
QByteArray bytearray = mSerial->readAll();
mSerial->close();
可以看到使用非常简单,下一篇将是我利用QSerialPort
及QSerilalPortInfo
实现的调试助手UHelp
有时间我会打包发布出来,既然选择Qt,当然要试试它的跨平台
先放个丑照~