QT 串口

本文详细介绍了如何使用Qt创建一个串口通信界面,包括新建界面元素如ComboBox、CheckBox、PlainTextEdit,设置串口参数,以及编写相关程序来处理串口的打开、关闭、读取和发送功能。同时,文章还提到了界面布局的调整和代码对齐等开发技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.新建界面
1.新建Qwidge
2.Plain Text Edit接收框,设置readonly
3.Containers(容器)里选择Widget
4.Label->串口选择,拖一个Combo Box
5.Label->波特率,拖一个Combo Box
6.复制波特率的Label与后面的Combo Box(选中按住Ctrl拖动即可复制),分别为停止位,数据位于校验位。
7.添加PushButton改为打开串口
8.CheckBox,16进制显示
9.选中Widget(Lay out in a gird)自动布局。
10.选中Widget,右下角Layout下的layoutColumnStretch的width改为1,0,1保证按键等比例。将Qwidget下的maxmumSize设为180固定横向大小。
11.以上为接收的与配置控件添加完,下面添加一个widget包含发送的一些控件。
12.添加Plain Text Edit发送框。
13.添加Push Button:发送,清除发送,停止发送,发送文件与打开文件。
14.2个Line Edit显示文件名与发送周期
15.添加2个checkbok定制发送与发送新行,然后自动布局。

16.在空白地方点击自动布局会进行整个界面调整,发现上面串口选择位置太宽,添加弹簧Vertical Spacer.并且串口设置的Widget里的元素太紧密,在右下角的Layout里面修改间隔layoutVerticalSpacing里修改(10),是左右上下间距都在这里面调试
17.发现周期的LineEdit的宽度太宽,可以限制他的宽度。可以用截图工具看下需要多宽。然后选中,在右下角的Qwidget里maximumSize的Length修改为45。


二、修改对象的名字

三、编写程序
1.Widget.h中
A.添加头文件
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
2.class Widget中新建一个public初始化函数void Init();然后refactor->Add Definction in Widget.c,将初始化函数添加到Wdiget()析构函数中去
3.在.pro中添加一行
QT       += core gui
QT       += serialport
4.在init()中初始化各种串口配置,可以在help中输入Qserialport查找将波特率,停止位,数据位与校验位设置好。
void Widget::init()
{
    //1.初始化串口
    serialport = new QSerialPort;   //实例化串口对象
    //2. 查找可用的串口
    auto portsInfo = QSerialPortInfo::availablePorts(); //QSerialPortInfo为串口辅助类,显示串口信息
    for(auto & info : portsInfo)    //获取属于容器portsInfo里的变量,并且可以修改
    {
        qInfo()<<info.description() << info.portName() << info.systemLocation();    //可以打印出串口的信息
        ui->protsCmb->addItem(info.portName() +":" + info.description(),info.portName());   //UI上显示串口号。
    }
    //3.获取标准的波特率
    qInfo()<<QSerialPortInfo::standardBaudRates();  //打印波特率
    auto baudRates = QSerialPortInfo::standardBaudRates();
    for(auto br : baudRates)
    {
        ui->baudRateCmb->addItem(QString::number(br),br);
    }
    ui->baudRateCmb->setCurrentText("9600");
    //设置停止位
    ui->stopBitCmb->addItem("1",QSerialPort::OneStop);
    ui->stopBitCmb->addItem("1.5",QSerialPort::OneAndHalfStop);
    ui->stopBitCmb->addItem("2",QSerialPort::OneStop);
    //设置数据位
    ui->dataBitsCmb->addItem("5",QSerialPort::Data5);
    ui->dataBitsCmb->addItem("6",QSerialPort::Data6);
    ui->dataBitsCmb->addItem("7",QSerialPort::Data7);
    ui->dataBitsCmb->addItem("8",QSerialPort::Data8);
    //设置校验位
    ui->parityCmb->addItem("NoParity",QSerialPort::NoParity);
    ui->parityCmb->addItem("EvenParity",QSerialPort::OddParity);
    ui->parityCmb->addItem("OddParity",QSerialPort::SpaceParity);
    ui->parityCmb->addItem("SpaceParity",QSerialPort::MarkParity);
    ui->parityCmb->addItem("MarkParity",QSerialPort::UnknownParity);

    //关联曹,函数4个参数:发射信号的对象,发射的信号,接受信号的对象,要执行的槽;
    connect(serialport,&QSerialPort::readyRead,this,&Widget::onReadyRead);
}

5.开关串口,右击打开串口按钮->Go to slot...(转到槽)->released,在on_openPortBtn_released()中添加打开关闭串口操作。
void Widget::on_openPortBtn_released()
{
    if(serialport->isOpen())
    {
        serialport->close();
        ui->openPortBtn->setText("打开串口");
    }
    else
    { //获取串口名
        auto portName = ui->protsCmb->currentData().toString();
        //获取波特率
        auto baudRate = ui->baudRateCmb->currentData().value<QSerialPort::BaudRate>();  //<>模板?
        //获取数据位
        auto dataBits = ui->dataBitsCmb->currentData().value<QSerialPort::DataBits>();
        //获取停止位
        auto stopBits = ui->stopBitCmb->currentData().value<QSerialPort::StopBits>();
        //获取校验位
        auto parity = ui->parityCmb->currentData().value<QSerialPort::Parity>();
        serialport->setPortName(portName);
        serialport->setBaudRate(baudRate);
        serialport->setDataBits(dataBits);
        serialport->setParity(parity);

        //打开串口
        if(!serialport->open(QIODevice::ReadWrite))
        {   //打开失败
            QMessageBox::warning(this,"warning",portName + "open falied:"+serialport->errorString());
        }
        else
        {   //打开成功
            ui->openPortBtn->setText("关闭串口");
        }
    }
}

6.添加接收函数onReadyRead,并且在初始化函数中添加关联曹函数connect(serialport,&QSerialPort::readyRead,this,&Widget::onReadyRead)


7.发送函数,右击打开发送按钮->Go to slot...(转到槽)->released。


8.发送文件,右击打开文件与发送文件按钮->转到槽->released
#include <QFileDialog>
#include <QStandardPaths>

9.16进制与字符串切换,右击定时发送->Go to slot...(转到槽)->toggled。
10.发送新行(ui->sendNewLineChx->isChecked() ? "\r\n":"")
11.定时发送,右击定时发送->Go to slot...(转到槽)->toggled。

四、一些技巧
1.ctrl+i 对齐选中的代码。
2.#include <QMessageBox> 
3.#include <qDebug>   qInfo()<< 输出日志

串口助手实例:

(1190条消息) QT5实现串口小助手通讯资源-优快云文库

### QT框架中的串口通信 #### 1. 查找串口设备 在Linux系统下,可以使用`ls /dev/tty*`命令来列出所有可用的串口设备。这些设备通常包括 `/dev/ttyS0`, `/dev/ttyS1`(用于板载UART)以及 `/dev/ttyUSB0`, `/dev/ttyACM0`(用于USB转串口适配器)[^1]。 #### 2. 示例代码结构 以下是基于QT框架实现串口通信的一个简单示例: ##### (a) 头文件 `com.h` 定义了一个名为`COM`的类,继承自`QObject`并集成了`QSerialPort`的功能。 ```cpp #ifndef COM_H #define COM_H #include <QObject> #include <QtSerialPort/QSerialPort> #include <QtSerialPort/QSerialPortInfo> #include <QMessageBox> #include <QDebug> #include <QByteArray> #include <iostream> #include <vector> using namespace std; class COM : public QObject { Q_OBJECT public: explicit COM(QObject *parent = nullptr); QSerialPort *serial; signals: void newMessage(vector<int> data); public slots: void dataReceived(); }; #endif // COM_H ``` 此部分展示了如何通过头文件引入必要的库,并声明了处理串口数据的核心函数[^3]。 ##### (b) 主窗口初始化逻辑 `myWidget.h` 该文件提供了更复杂的GUI交互功能,例如打开端口按钮事件响应、发送消息等功能。 ```cpp #pragma execution_character_set("utf-8") #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QSerialPort> #include <QSerialPortInfo> #include <QDebug> #include <QMessageBox> namespace Ui { class myWidget; } class myWidget : public QWidget { Q_OBJECT public: explicit myWidget(QWidget *parent = 0); ~myWidget(); private slots: void on_m_OpenPortButton_clicked(); void on_btn_Send_clicked(); void receiveInfo(); private: Ui::myWidget *ui; QStringList getPortNameList(); // 获取所有可用的串口列表 QSerialPort* m_serialPort; // 串口类实例化对象 QStringList m_portNameList; // 存储当前系统的串口号集合 void sendInfo(char* info, int len); // 发送二进制信息 void sendInfo(QString &info); // 发送字符串型信息 void convertStringToHex(const QString &str, QByteArray &byteData); // 字符串转换成十六进制字节数组 char convertCharToHex(char ch); // 单字符转换为对应的十六进制数值 }; #endif // MYWIDGET_H ``` 这段代码片段说明了如何构建一个支持基本操作(如读取串口名称列表、发送和接收数据)的小部件应用程序[^4]。 #### 3. 关键点解析 - **串口枚举**: 使用`QSerialPortInfo`类获取系统中存在的所有串口设备及其属性。 - **数据传输**: 利用`QSerialPort`完成实际的数据收发工作。 - **错误处理**: 需要特别注意异常情况下的资源释放与状态恢复。 #### 4. 进一步学习建议 如果希望深入理解QT串口通信机制,则可以从官方文档入手,同时配合实践项目逐步掌握其细节[^2]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值