Qt5串口编程详解【新版】

Qt5的串口比Qt4的好用得多,Qt4的貌似没有集成官方库。

之前我也写过Qt5的串口,不过有一些缺陷,这次试图改进。转载请保留链接:

本文发表于2014.5.17。

如果在linux下,记得使用root权限,可以用root权限打开可执行文件,或者用root权限打开Qt Creator。(原因是串口常常需要特权,有些串口有特权也只能度而不能写,这个可能是Qt本身的问题)【至于安卓端,其实没试过。】【用root打开Qt Creator似乎是一个一劳永逸的方法,这样每次运行都以root权限,但是一些配置文件也会被改变为root权限。下一次再以普通权限打开Qt Creator就会提示错误,需要输入这样命令 sudo chmod 777 `find 对应目录`,这样能将目录的每个文件去掉权限限制】

好了,准备开始。

先建立Qt Widgets Application,只要注意尽量不用中文路径即可,一直下一步,直到完成。

接着修改“项目名.pro”文件,增加这一单独行。(这个项目文件可以根据需要裁剪和增加,以增快编译效率和设置选项,而这一行表示“我想用到串口”)

QT+= serialport

进入mainwindow.ui,给它一个Combo Box(用于选择哪一个串口,一台电脑常常有多个串口)、一个label(用于显示串口是否正常)、一个Text Edit(用于接收数据)、一个lineEdit(用于发送数据)、一个Push Button(当按下一次,就发送一次),这里为了方便读者理解,与博文统一,请读者先别急着修改它们的ObeectName,至于布局,请随意。

给Combo Box一个槽,来改变串口(右键,转到槽,选择currentIndexChange(QString))。//当改变选择的选项则触发,可得到选项名

给Push Button一个槽,用于发送(右键,选择槽,选择第一个函数)。//当按下触发

在mainWindow.h文件中:

加入头文件:(这里QSerialPort是必须的,而QSerialPortInfo是可选的,它能提供本机可用串口列表(列表的每一个元素都自动获取了对应的端口号、波特率、校验位等信息!),如果不使用它则需要手动编码,设置对应的串口、波特率等信息,最后完成之后单独拿出来讲,见下面的黄色阴影字体部分)

#include <QSerialPort>#include <QSerialPortInfo>接着,给它一个private变量(表示串口及其操作函数)、一个private函数(用于初始化)、一个连接槽,(用于接收串口过来的数据,发送是不需要槽的,原因是发送是主动、随时的,而接收是被动、等待的):

private变量:

QSerialPort serial;

一个private函数:

void initSeialPort();

连接槽:

private slots:void serialRead();

进入mainWindow.cpp中:

在构造函数中:

在ui->setupUi(this);之后加入这一句:

initSeialPort();

在析构函数中:

在delete ui;之前加入这一句:

serial.close();

接下来补齐这些没有函数体为空的函数,为了方便可以直接复制(仔细浏览,看看它们已经定义了没有,或者是否ui触发的槽选择错误,如果有问题,请投诉):

initSerialPort函数

先连接槽,然后获取可用的infos(所有本地存在串口信息),如果都不可用,提示“无效”,如果存在,则为Combo Box添加选项,第一项是“串口”(只是提示,由于combo Box的选项从无到有,将触发一次 on_comboBox_currentIndexChanged(const QString &arg1) 槽 ,见下面橙色阴影字体),这个选项之后是其他的串口的端口号作为选项。

void MainWindow::initSeialPort(){connect(&serial,SIGNAL(readyRead()),this,SLOT(serialRead()));//连接槽//get name for chooseQList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();if(infos.isEmpty()){ui->comboBox->addItem("无效");return;}ui->comboBox->addItem("串口");foreach (QSerialPortInfo info, infos) {ui->comboBox->addItem(info.portName());}}

当每次combo Box选项变化,将触发下面的函数:

arg1为该选择的Combo Box选项名称(第一次触发为“串口”,之后被用户选择为需要的串口号,根据上面的addItem函数可以逆推)

根据arg1查找可用的串口列表,如果找不到(例如arg1为“串口”这个字符串,当然找不到)则提示“[出错]”,否则打开并提示"[已开启]"。

这里serial先关后开,防止先前的串口忘了关闭(因为每改变一次选项就要开启一次,那么当然要把上一次的串口给关了才行)。

void MainWindow::on_comboBox_currentIndexChanged(const QString &arg1){QSerialPortInfo info;QList<QSerialPortInfo> infos = QSerialPortInfo::availablePorts();int i = 0;foreach (info, infos) {if(info.portName() == arg1) break;i++;}if(i != infos.size ()){//can findui->label->setText("[已开启]");serial.close();serial.setPort(info);serial.open(QIODevice::ReadWrite);//读写打开}else{serial.close();ui->label->setText("[出错]");}}

下面两个函数便不详述:

void MainWindow::serialRead(){ui->textEdit->append(serial.readAll());}

toLatin1可用转换QString到QByteArray类型:

void MainWindow::on_pushButton_clicked(){if(ui->lineEdit->text().isEmpty())return;serial.write(ui->lineEdit->text().toLatin1());}

好已经完成全部工作,测试一下吧。

补充一下自己摸索的其他方法,作为阅读即可:

别想一下造出大海,必须先由小河川开始。

Qt5串口编程详解【新版】

相关文章:

你感兴趣的文章:

标签云: