一、界面设计
在做软件之前使用“软件界面设计工具”先设计并绘制出软件界面,方便在写代码之前确认“功能需求”以及“交互流程”。
这里使用的软件是:“Axure RP”
二、新建工程与绘制界面
- 创建工程
使用Qt Creater 新建一个“Qt Widgets Application”。填好工程名字后,然后点击下一步,直到类信息页面选择Base class为:“QDialog”并修改类名字为“SerialDialog”,然后一直下一步,直到进入代码编辑页面就完成了工程创建。类信息页面如下图所示:
工程创建完如下所示:
- 绘制界面
双击工程文件中的“serialdialog.ui”文件,在弹出的界面绘制页面绘制章节一种所设计的界面,结果如下图所示:(注意红色修改部分)
三、用到的库函数说明
在工程文件中加下面代码来导入串口开发库:
QT += serialport
开发串口主要用到的qt串口类为:
-
QSerialPortInfo :用于描述串口设备详情的类,其有静态函数“availablePorts()”可以枚举可用的串口设备
官方文档:https://doc.qt.io/qt-5/qserialportinfo.html -
QSerialPort :用于打开串口,设置串口参数,以及发送和接收数据
官方文档:https://doc.qt.io/qt-5/qserialport.html#atEnd
setPort(const QSerialPortInfo &serialPortInfo)//设置端口
setBaudRate(qint32 baudRate)//设置波特率
setDataBits(QSerialPort::DataBits dataBits)//设置数据位
setParity(QSerialPort::Parity parity)//设置校验位
setStopBits(QSerialPort::StopBits stopBits)//设置停止位
open(QIODevice::OpenMode mode) //打开串口
close() //关闭串口
//读串口数据:
qint64 read(char *data, qint64 maxlen);
QByteArray read(qint64 maxlen);
//写串口数据
qint64 write(const char *data, qint64 len);
qint64 write(const QByteArray &data)
Qt信号:QSerialPort::readyRead() //收到下位机发来的数据会触发此信号
四、核心编写逻辑代码
直接在工程中的“SerialDialog”类里面定义QSerialPort的对象并设置参数即可实现“串口通信功能”,但是为了避免把“处理串口的逻辑代码”和“SerialDialog这个UI代码”混合在一起。即做解除耦合处理。因此这里单独做一个类把有关串口逻辑处理功能做个封装。这里仅列出核心逻辑代码。完整源代码从第四段获取。
对串口功能函数的封装类:
class MySerialPort : public QObject
{
Q_OBJECT
public:
MySerialPort();
~MySerialPort();
public:
static QList<QSerialPortInfo> GetAvailablePorts();//获取系统中可用串口设备列表
bool Open();//打开串口
void Close();//关闭串口
bool IsOpen();//串口是否被打开
qint64 SendData(const QByteArray &data);//发送串口数据
void SetPort(const QSerialPortInfo &serialPortInfo);//设置端口(串口号)
bool SetBaudRate(qint32 baudRate);//设置波特率
bool SetDataBits(QSerialPort::DataBits dataBits);//设置数据位
bool SetParity(QSerialPort::Parity parity);//设置奇偶校验位
bool SetStopBits(QSerialPort::StopBits stopBits);//设置停止位
signals:
void ReceivedData(const QByteArray &data);//收到串口数据的信号
private slots:
void ReadyRead();
private:
QSerialPort *serial_port_p;
};
设置参数并打开串口:
void SerialDialog::on_pushButtonSerialOpen_clicked()
{
if(my_serial_port_p->IsOpen()) {
my_serial_port_p->Close();
ui->pushButtonSerialOpen->setText(QApplication::translate("SerialDialog", "打开串口"));
} else {
my_serial_port_p->SetPort(port_info_list_[ui->comboBoxSerialPort->currentIndex()]);
SetSerialSettings();
my_serial_port_p->Open();
ui->pushButtonSerialOpen->setText(QApplication::translate("SerialDialog", "关闭串口"));
}
}
发送函数:
void SerialDialog::on_pushButtonSerialSend_clicked()
{
QString text = ui->textEditSend->toPlainText().toLatin1();
QByteArray data;
data.append(text);
my_serial_port_p->SendData(data);
ui->textEditSend->clear();
}
接收函数:
void SerialDialog::ReceivedData(const QByteArray &data) {
ui->textEditReceive->append(data.data());
}
五、获取源代码
六、效果图
- 在windows系统下效果
- 在MacOS系统下效果