最近学了一下qt,想着用一用吧,正好研究方向也会用到串口调试助手,那就
自己看看能不能写一个吧,仅以此篇记录一下自己学习的过程。
首先了解一下我想实现的具体框架。
大概我想要实现的就是左边的功能。
主要分为3个部分,从上到下依次为串口设置,接收区设置和发送区设置。当然还有许多需
要完善的地方,但这并不是自己主要的研究方向,如有什么不对的地方,还请勿喷(宇宙免责
声明)。
进入正题,首先看一下代码的整体框架。
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
Ui::Widget *ui;
public:
void mLoadSet();
void mSetQSS();
void mQSerialPortSet();
void mReceiveSet();
void mSendSet();
void closeEvent(QCloseEvent *event) override;
这是在widget.h中自己定义的一些方法,载入用户设置,是用于记录用户的上次选择的,
以便本次运行时能够保持用户上次的选择,样式表设置纯属为了见面稍微美观一些,对于
串口调试助手功能来说,并没有什么卵用了,之后每一个方法正好对应框架当中的三个部分
这次主要记录一下第一部分,也就是串口设置部分
private:
QSerialPort mSerialPort;
bool isOpen = false;
QByteArray receivePrimaryData;
bool recDisplayIsPause = false;
QFile recFile;
bool isRecToFile = false;
QByteArray sendPrimaryData;
QByteArray sendTemporaryData;
bool isSendcycle = false;
QTimer cycTimer;
bool isStopSend = false;
HexOnlyEventFilter hexOnlyEventFilter;
这是在头文件中定义的一些属性,串口设置仅用到了:
QSerialPort mSerialPort;
bool isOpen = false;
这两个属性,mSerialPort是一个Qt当中的串口对象,我们可以通过这个对象对串口
进行设置。isOpen是用来记录串口是否打开的标志位。
之后在源文件中实现mQSerialPortset方法:
串口设置主要分为以下几个部分:
1. 首先我们要获取可用串口号:
QList<QSerialPortInfo> serialPorts = QSerialPortInfo::availablePorts();
for(int i = 0; i < serialPorts.size(); i++){
ui->cB_serialNum->addItem(serialPorts[i].portName());
}
首先定义一个QList容器,该容器存放的是QSerialPortInfo,也就是获取到的串口信息,
再调用QSerialPortInfo::availablePorts();方法获取串口信息,之后通过一个for循环
将获取到的可用串口名添加到Qt中的QComboBox中,也就是这里:
2.读取串口参数进行参数设置
当我们点击打开按钮时,会读取用户选择的串口参数,再对串口进行设置,因此我们首先要
将打开按钮的点击信号和槽函数链接起来:
connect(ui->pB_open, &QPushButton::clicked, this, [&](){
之后再依次读取QComboBox的参数,并且对串口进行设置:
if(isOpen == false)
{
mSerialPort.setPortName(ui->cB_serialNum->currentText());
if(ui->cB_baudRate->currentText() == "9600"){
mSerialPort.setBaudRate(QSerialPort::Baud9600);
}
else if(ui->cB_baudRate->currentText() == "115200")
{
mSerialPort.setBaudRate(QSerialPort::Baud115200);
}
if(ui->cB_dataBits->currentText() == "8")
{
mSerialPort.setBaudRate(QSerialPort::Data8);
}
if(ui->cB_parity->currentText() == "NONE")
{
mSerialPort.setParity(QSerialPort::NoParity);
}
else if(ui->cB_parity->currentText() == "ODD")
{
mSerialPort.setParity(QSerialPort::OddParity);
}
else if(ui->cB_parity->currentText() == "EVEN")
{
mSerialPort.setParity(QSerialPort::EvenParity);
}
if(ui->cB_stopBits->currentText() == "1")
{
mSerialPort.setStopBits(QSerialPort::OneStop);
}
else if(ui->cB_stopBits->currentText() == "1.5")
{
mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
}
else if(ui->cB_stopBits->currentText() == "2")
{
mSerialPort.setStopBits(QSerialPort::TwoStop);
}
mSerialPort.setFlowControl(QSerialPort::NoFlowControl);
3.打开串口,并且对QComboBox设置为不使能,以保证串口打开状态下不能修改参数,
如果窗口已经是打开状态下点击按钮,那么关闭串口,并设置使能.
if(mSerialPort.open(QIODevice::ReadWrite))
{
qDebug() << "Serial port opened successfully.";
ui->cB_serialNum->setEnabled(false);
ui->cB_baudRate->setEnabled(false);
ui->cB_dataBits->setEnabled(false);
ui->cB_parity->setEnabled(false);
ui->cB_stopBits->setEnabled(false);
ui->pB_open->setText("关闭");
isOpen = true;
}
else
{
qDebug() << "Failed to open serial port.";
}
}
else if(isOpen == true)
{
mSerialPort.close();
ui->cB_serialNum->setEnabled(true);
ui->cB_baudRate->setEnabled(true);
ui->cB_dataBits->setEnabled(true);
ui->cB_parity->setEnabled(true);
ui->cB_stopBits->setEnabled(true);
ui->pB_open->setText("打开");
isOpen = false;
}
完整串口设置代码如下:
void Widget::mQSerialPortSet()
{
QList<QSerialPortInfo> serialPorts = QSerialPortInfo::availablePorts();
for(int i = 0; i < serialPorts.size(); i++){
ui->cB_serialNum->addItem(serialPorts[i].portName());
}
connect(ui->pB_open, &QPushButton::clicked, this, [&](){
if(isOpen == false)
{
mSerialPort.setPortName(ui->cB_serialNum->currentText());
if(ui->cB_baudRate->currentText() == "9600"){
mSerialPort.setBaudRate(QSerialPort::Baud9600);
}
else if(ui->cB_baudRate->currentText() == "115200")
{
mSerialPort.setBaudRate(QSerialPort::Baud115200);
}
if(ui->cB_dataBits->currentText() == "8")
{
mSerialPort.setBaudRate(QSerialPort::Data8);
}
if(ui->cB_parity->currentText() == "NONE")
{
mSerialPort.setParity(QSerialPort::NoParity);
}
else if(ui->cB_parity->currentText() == "ODD")
{
mSerialPort.setParity(QSerialPort::OddParity);
}
else if(ui->cB_parity->currentText() == "EVEN")
{
mSerialPort.setParity(QSerialPort::EvenParity);
}
if(ui->cB_stopBits->currentText() == "1")
{
mSerialPort.setStopBits(QSerialPort::OneStop);
}
else if(ui->cB_stopBits->currentText() == "1.5")
{
mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
}
else if(ui->cB_stopBits->currentText() == "2")
{
mSerialPort.setStopBits(QSerialPort::TwoStop);
}
mSerialPort.setFlowControl(QSerialPort::NoFlowControl);
if(mSerialPort.open(QIODevice::ReadWrite))
{
qDebug() << "Serial port opened successfully.";
ui->cB_serialNum->setEnabled(false);
ui->cB_baudRate->setEnabled(false);
ui->cB_dataBits->setEnabled(false);
ui->cB_parity->setEnabled(false);
ui->cB_stopBits->setEnabled(false);
ui->pB_open->setText("关闭");
isOpen = true;
}
else
{
qDebug() << "Failed to open serial port.";
}
}
else if(isOpen == true)
{
mSerialPort.close();
ui->cB_serialNum->setEnabled(true);
ui->cB_baudRate->setEnabled(true);
ui->cB_dataBits->setEnabled(true);
ui->cB_parity->setEnabled(true);
ui->cB_stopBits->setEnabled(true);
ui->pB_open->setText("打开");
isOpen = false;
}
});
}
最后的效果就是:
默认串口关闭状态下是这样的:
点击打开按钮串口打开状态下是这样的:
至此,串口设置部分就结束了,写不动了,其他的部分之后再记录吧。