Qt6教程之三(14) 串口通信

目录

一 串口通信相关概念介绍

二 Qt开发串口通信程序


串口通信相关概念介绍

串口通信(Serial Communications)在上位机控制领域非常常用,其原理是按位(bit)发送和接收字节。相对于按字节(byte)发送的并行通信慢很多,然而串口却可以在使用一根线发送数据的同时用另一根线接收数据。其优点是能够实现远距离通信。

而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

(1)波特率:

这是一个衡量符号传输速率的参数。

指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps。一般调制速率大于波特率,比如曼彻斯特编码)。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值.但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

(2)数据位:

这是衡量通信中实际数据位的参数。

当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。如何设置取决于你想传送的信息。

比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。

如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。

每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。

由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

(3)停止位:

用于表示单个包的最后一位。典型的值为1,1.5和2位。

由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

(4)奇偶校验位:

在串口通信中一种简单的检错方式。

有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。

高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

二 Qt开发串口通信程序

Qt开发串口通信,有一个专门的模块叫QtSerialPort ,在开发时需要在工程文件中添加后才能使用。如下:

CMake:

需要在CMakeLists中加入以下内容

find_package(Qt6 COMPONENTS SerialPort REQUIRED)

target_link_libraries(工程名称 PRIVATE Qt6::SerialPort)

Qmake:

需要在.pro文件中添加如下内容:

QT += serialport

详细实例: 使用虚拟串口实现互相发送消息的功能

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QSerialPort>
#include<QSerialPortInfo>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void sendData();//发送串口数据
    void receiveData();//接收串口数据
    void openSerialport();//串口开启/关闭控制

private:
    Ui::MainWindow *ui;
    QSerialPort *serialPort;


};
#endif // MAINWINDOW_H

mianwindow.cpp

#include "mainwindow.h"
#include "./ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    //设置窗口标题和大小
    this->setWindowTitle("串口通信Demo");
    this->resize(800,600);

    //初始化串口对象
    serialPort=new QSerialPort(this);
    //获取所有可用端口列表
    QList<QSerialPortInfo> serialPortList=QSerialPortInfo::availablePorts();

    //如果没有可用串口,则在状态栏提示相应信息
    if(serialPortList.isEmpty()){
        this->statusBar()->showMessage("没有可用串口,请插入串口或重启电脑重试");
    }else {
        //有可用串口的情况下,把串口遍历显示到下拉框中
        this->statusBar()->showMessage("可用串口数量为:"+QString::number( serialPortList.count()) );

        //创建遍历迭代器,把串口遍历显示到下拉框中
        QList<QSerialPortInfo>::Iterator nextSerialPort=serialPortList.begin();
        while (nextSerialPort != serialPortList.end()) {
            ui->comboBox->addItem(nextSerialPort->portName());
            nextSerialPort++;
        }
    }


    //绑定信号和槽
    connect(serialPort,SIGNAL(readyRead()),this,SLOT(receiveData()));
    connect(ui->send_data,SIGNAL(clicked(bool)),this,SLOT(sendData()));
    connect(ui->open_serialport,SIGNAL(clicked(bool)),this,SLOT(openSerialport()));

}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::sendData()
{
    //获取需要发送的文本
    QString senData=ui->lineEdit->text().trimmed();
    //使用字节数组处理输入的文本
    QByteArray sendDataArray;
    sendDataArray.append(senData.toUtf8().data());
    //使用串口发送字节数组
    serialPort->write(sendDataArray);
}



void MainWindow::receiveData()
{
    //接收其他串口发送过来的数据
    QByteArray serialData;
    serialData.append(serialPort->readAll());
    //把数据依次显示到文本控件上面去
    ui->textEdit->append(serialData);
}




void MainWindow::openSerialport()
{
    //判断串口是否已经打开,若打开则关闭,同时改变状态灯和按钮文字设置为“打开串口”
    if(serialPort->isOpen()){
        serialPort->clear();
        serialPort->close();
        ui->open_serialport->setText("打开串口");
        ui->label->setStyleSheet("background-color: rgb(255, 0, 0);");
    }else {
        //若串口没有打开,则设置指示灯为绿色,设置按钮文字为“关闭串口”
        ui->label->setStyleSheet("background-color:rgb(0,255,0);border-radius:12px;");
        ui->open_serialport->setText("关闭串口");
        serialPort->setPortName(ui->comboBox->currentText());
        serialPort->open(QIODevice::ReadWrite);
        serialPort->setBaudRate(QSerialPort::Baud115200);
        serialPort->setDataBits(QSerialPort::Data8);
        serialPort->setParity(QSerialPort::NoParity);
        serialPort->setStopBits(QSerialPort::OneStop);
        serialPort->setFlowControl(QSerialPort::NoFlowControl);



    }
}

main.cpp

#include "mainwindow.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    return a.exec();
}

写好代码之后,需要先使用虚拟串口工具创建一对串口,然后在使用一个串口调试工具使用其中一个串口,然后我们自己写的程序使用另一个串口。

这里我是使用深蓝网络串口调试工具作为一端,使用的串口是com3, 自己编写的程序使用com4,

最后双方实现通信。

资源下载链接:

https://download.csdn.net/download/XiaoWang_csdn/87614078

运行效果:

 

下一篇博客:

Qt6教程之三(15) Modbus通信_折腾猿王申兵的博客-CSDN博客

上一篇博客:

Qt6教程之三(13) TCP/IP通讯与socket编程_折腾猿王申兵的博客-CSDN博客

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
为了使更多的Qt初学者能尽快入门Qt,也为了QtQt Creator的快速普及,我们花费大量精力写出了这一系列教程。虽然教程的知识可能很浅显,虽然教程的语言可能不规范,但是它却被数十万网友所认可。我们会将这一系列教程一直写下去,它将涉及Qt的方方面面 一、Qt Creator的安装和hello world程序的编写 二、Qt Creator编写多窗口程序 三、Qt Creator登录对话框 四、Qt Creator添加菜单图标 五、Qt Creator布局管理器的使用 六、Qt Creator实现文本编辑 七、Qt Creator实现文本查找 八、Qt Creator实现状态栏显示 九、Qt Creator中鼠标键盘事件的处理实现自定义鼠标指针 十、Qt Creator中实现定时器和产生随机数 十一、Qt 2D绘图(一)绘制简单图形 十二、Qt 2D绘图(二)渐变填充 十三、Qt 2D绘图(三)绘制文字 十四、Qt 2D绘图(四)绘制路径 十五、Qt 2D绘图(五)显示图片 十六、Qt 2D绘图(六)坐标系统 十七、Qt 2D绘图(七)Qt坐标系统深入 十八、Qt 2D绘图(八)涂鸦板 十九、Qt 2D绘图(九)双缓冲绘图简介 二十、Qt 2D绘图(十)图形视图框架简介 二十一、Qt数据库(一)简介 二十二、Qt数据库(二)添加MySQL数据库驱动插件 二十三、Qt数据库(三)利用QSqlQuery类执行SQL语句(一) 二十四、Qt数据库(四)利用QSqlQuery类执行SQL语句(二) 二十五、Qt数据库(五)QSqlQueryModel 二十六、Qt数据库(六)QSqlTableModel 二十七、Qt数据库(七)QSqlRelationalTableModel 二十八、Qt数据库(八)XML(一) 二十九、Qt数据库(九)XML(二) 三十、Qt数据库(十)XML(三) 三十一、Qt 4.7.0及Qt Creator 2.0 beta版安装全程图解 三十二、第一个Qt Quick程序(QML程序) 三十三、体验QML演示程序 三十四、Qt Quick Designer介绍 三十五、QML组件 三十六、QML项目之Image和BorderImage 三十七、Flipable、Flickable和状态与动画 三十八、QML视图 三十九、QtDeclarative模块 四十、使用Nokia Qt SDK开发Symbian和Maemo终端软件 四十一、Qt网络(一)简介 四十二、Qt网络(二)HTTP编程 四十三、Qt网络(三)FTP(一) 四十四、Qt网络(四)FTP(二) 四十五、Qt网络(五)获取本机网络信息 四十六、Qt网络(六)UDP 四十七、Qt网络(七)TCP(一) 四十八、Qt网络(八)TCP(二)
Qt串口通信是一种可以在Qt平台上进行串口通信的解决方案。其中,Qt串口通信模块qserialport是实现串口通信的关键模块。本文将为大家介绍Qt串口通信模块qserialport的开发完整实例。 首先,我们需要在Qt中打开串口通信模块qserialport。在Qt 5.2及以上版本中,qserialport已经被包含在QtCore模块中。因此,我们只需要在代码中引入QtCore模块即可使用qserialport。 接下来,我们需要定义串口参数。我们可以利用QSerialPort类中提供的函数setBaudRate()、setDataBits()、setParity()等来设置参数。例如: ```cpp QSerialPort serial; serial.setBaudRate(QSerialPort::Baud9600); serial.setDataBits(QSerialPort::Data8); serial.setParity(QSerialPort::NoParity); serial.setStopBits(QSerialPort::OneStop); serial.setFlowControl(QSerialPort::NoFlowControl); ``` 然后,我们需要打开串口。我们可以使用QSerialPort类的open()函数来打开串口。例如: ```cpp serial.setPortName("COM1"); // 设置串口号为COM1 if (serial.open(QIODevice::ReadWrite)) { qDebug() << "串口已打开"; } else { qDebug() << "串口打开失败"; } ``` 接下来,我们可以通过QSerialPort类的函数write()和read()来进行数据读写。例如: ```cpp // 向串口写入数据 char buf[] = "hello world"; serial.write(buf, sizeof(buf)); // 从串口读取数据 QByteArray data = serial.readAll(); qDebug() << data; ``` 最后,在程序结束时我们需要关闭串口。我们可以使用QSerialPort类的close()函数来关闭串口。例如: ```cpp serial.close(); ``` 综上所述,以上就是Qt串口通信模块qserialport的开发完整实例。在实际应用中,我们可以根据需要对以上代码进行修改,从而实现更加复杂的串口通信功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值