Qt串口通信

Qt串口通信

串口通信被广泛应用于以下领域:

  1. 电子设备:串口通信用于连接电脑与外部设备,如打印机、扫描仪、传感器、测量仪器等。

  2. 通信设备:串口通信用于连接调制解调器、路由器、交换机等网络设备。

  3. 工业自动化:串口通信用于连接工业机器人、PLC(可编程逻辑控制器)、传感器、仪器仪表等设备,实现数据采集、控制与监测。

  4. 仪器仪表:串口通信用于连接各类仪器仪表,如温度计、压力计、流量计等,传输数据并进行监测与控制。

  5. 汽车电子:串口通信用于连接汽车中各种电子部件,如发动机控制单元、车载导航系统、车载娱乐系统等。

  6. 安防监控:串口通信用于连接摄像头、监控器、报警设备等安防设备,实现数据传输与控制。

  7. 医疗设备:串口通信用于连接医疗仪器设备,如心电图仪、血压计、血糖仪等,传输患者的生理数据。

总之,串口通信在各个领域中被广泛应用,在数据传输、设备控制和监测等方面起到重要作用。

这些看看就好了,我们直接上代码!!!!

UI界面设计

我直接截图了,大家可以根据我的设计

我们设计的简单一些,其实如果是检测温度、打开开关这些功能,其实都不用下面的发送窗口,因为,完全没有必要,工业级的采集器是直接可以采集数据然后通过协议直接通信的。我们的这个界面其实跟像是一个串口工具,不过它可以帮我们了解功能也够了。

好了!!上代码!!!

编写代码

.pro文件

我们要使用串口通信,就要调用模块

QT       += core gui serialport

widget.h文件

我们引入串口通信的头文件还有串口信息类的头文件,因为我们监测我们开发板或者电脑上的串口情况。

#include"QSerialPort"//串口类
#include"QSerialPortInfo"//串口信息类
全代码

在这里我们声名QserialPort的对象,然后我们还定义了一个槽函数,因为我们要接收我们接收到的信息,也就是我们的readData(),其他的就是转到槽了,切记:我们的打开串口的按钮转到槽,奥选择第二个加bool参数的那个槽函数!!!

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include"QSerialPort"//串口类
#include"QSerialPortInfo"//串口信息类

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_pushButton_clicked(bool checked);
    void readData();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::Widget *ui;
    QSerialPort *serialPort;
};
#endif // WIDGET_H

widget.cpp

代码讲解
1.头代码

这里我们的定义这个声名的对象,之后使用foreach这个方法,将我们电脑或开发板上的串口数据都显示在我们要实现的UI界面上,因为我们不能直接定义上面的数据

{
    ui->setupUi(this);
    serialPort = new QSerialPort(this);
    //扫描本机串口将其添加到下拉框中
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        ui->comboBox->addItem(info.portName());
    }

}
2.主代码编写

开始我们设计了他的串口名称、波特率、停止位、数据位、校验位这些,这里使用了switch方法是因为我们的校验位用了如下的格式,我们使用switch的方法可以使用index引用的方法来调用相应的方法,简单、方便~哎·~~~~爽了~~~嘿嘿~~~。

之后还有一个流控,这个是帮助文档中的,我之前写的时候都不用,为了别出错还是加上吧。

最后就是加了一个Connect方法来将我们的信号和槽连接,这里连接的是接收的信号(通俗的就是说我们声名了一个槽——readData,我们用serialPotr的readyread方法读到数据后用readData调用)

要是还不明白细节,直接复制代码上chatgpt、文心都阔以!!!!

//打开串口
void Widget::on_pushButton_clicked(bool checked)
{
    if(checked){

        serialPort->setPortName(ui->comboBox->currentText());
        serialPort->setBaudRate(ui->comboBox_2->currentText().toInt());
        serialPort->setStopBits(QSerialPort::StopBits( ui->comboBox_3->currentText().toInt()));
        serialPort->setDataBits(QSerialPort::DataBits( ui->comboBox_3->currentText().toInt()));
        switch (ui->comboBox_5->currentIndex()) {
        case 0:
            serialPort->setParity(QSerialPort::NoParity);
            break;
        case 1:
            serialPort->setParity(QSerialPort::EvenParity);
            break;
        case 2:
            serialPort->setParity(QSerialPort::OddParity);
            break;
        case 3:
            serialPort->setParity(QSerialPort::SpaceParity);
            break;
        case 4:
            serialPort->setParity(QSerialPort::MarkParity);
            break;
        default:
            break;
        }
        //设置流控
        serialPort->setFlowControl(QSerialPort::NoFlowControl);

        if(!serialPort->open(QIODevice::ReadWrite)){
            QMessageBox::about(this,"错误","串口打开错误!!!!!");
            return;
        }
        ui->comboBox->setEditable(false);
        ui->comboBox_2->setEditable(false);
        ui->comboBox_3->setEditable(false);
        ui->comboBox_4->setEditable(false);
        ui->comboBox_5->setEditable(false);

        ui->pushButton->setText("关闭串口");
    }else{
        serialPort->close();
        ui->comboBox->setEditable(true);
        ui->comboBox_2->setEditable(true);
        ui->comboBox_3->setEditable(true);
        ui->comboBox_4->setEditable(true);
        ui->comboBox_5->setEditable(true);
        ui->pushButton->setText("打开串口");
    }

    //读取数据
    connect(serialPort,SIGNAL(readyRead()),this,SLOT(readData()));
}
3.槽函数

这玩意就不用讲了吧!!!

void Widget::readData()
{
    //接收数据
    ui->textBrowser->insertPlainText(serialPort->readAll());
}


void Widget::on_pushButton_2_clicked()
{
    //发送数据
    serialPort->write(ui->textBrowser_2->toPlainText().toUtf8());
}


void Widget::on_pushButton_3_clicked()
{
    //清空
    ui->textBrowser_2->clear();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值