zoukankan      html  css  js  c++  java
  • qt5串口通信

    需要添加的内容 

    使用qt中的串口通信的时候需要用到的两个头文件分别为:

    #include <QtSerialPort/QSerialPort>
    #include <QtSerialPort/QSerialPortInfo>

    QSerialPort 类提供了操作串口的各种接口。
    QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息

    还需要在工程文件中加下面一行代码:

    QT       += serialport

    代码 

    遍历可用的串口

        foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())      //遍历可用的窗口
        {
            //QSerialPortInfo::availablePorts()   获取所有端口的信息,返回值是一个QList<QSerialPortInfo>
    
            qDebug()<<"Name:"<<info.portName();  //返回串口名称
            qDebug()<<"Description:"<<info.description();  //返回串口说明
            qDebug() << "Manufacturer: " << info.manufacturer();  //返回制造商信息
            qDebug() << "Serial Number: " << info.serialNumber();  //返回串口连接设备的串口序列号
            /*通常,我们需要指定程序使用某一个确定的串口,这时不能只使用串口名称,因为USB串口每次插在不同
             的USB口上时获得的串口名称都可能有变化。这时可以利用串口的序列号,这个号码一般来说是唯一的
           */
            qDebug() << "System Location: " << info.systemLocation();  //系统本地位置
            
            
    
    
        }

    输出结果:

    QSerialPort支持两种编程方法: 

    1)*异步(非阻塞)方式。当控制权返回到Qt的事件循环中,相应的操作就会被调度和执行。当操作执行完了QSerial就会触发一个信号。例如:
    QSerialPort::write()方法返回。当数据发送到串口,QSerialPort就会触发bytesWirtten()。
    (2)*同步(阻塞)方式。在非GUI和多线程应用程序中,我们可以调用waitFor...()函数(例如QSerialPort::waitForReadyRead())使得调用线程在完成之前都是阻塞的。
    阻塞的串口编程与非阻塞的串口编程是不一样的。阻塞的串口不许要事件循环,需要的代码很少。然而,在一个GUI应用程序中,阻塞的串口操作应该仅仅在非GUI线程中使用,避免用户界面冻结

     

    QSerialPort 的串口操作 

    选定串口后,要先打开串口,才能设置波特率等参数。这些参数都设置好了就可以使用了。最基本的操作无非是read() 和 write()。需要注意的是这两个操作都是非阻塞的

    另外有一个重要的signal 也需要用到,那就是 void QIODevice::readyRead(),每次串口收到数据后都会发出这个signal。我们的程序中需要定义一个slot,并将其与这个signal 相连接。这样,每次新数据到来后,我们就可以在slot中读取数据了。这时一定要将串口缓冲区中的数据全部读出来,可以利用readAll() 来实现 

    读取串口数据实例--超声波测距仪 

    Win.cpp

    #include "win.h"
    
    Win::Win(QWidget *parent)
        : QWidget(parent)
    {
    
        str1="";
        i=0;
    
        this->resize(500,300);
        setWindowTitle("超声波测距仪- 明师软件");
        serial = new QSerialPort;
    
        label=new QLabel("距离:",this);
        label->move(50,100);
        label->setStyleSheet("font-size:50px;color:red;font-family:黑体 ");  //设置字体大小,字体颜色,字体
    
        label1=new QLabel("5   厘米",this);
        label1->move(200,100);
        label1->setStyleSheet("font-size:50px;color:red;font-family:黑体 ");
    
    
        QSerialPortInfo com_info;
        qDebug() << "Name : " << com_info.portName();  //串口名称默认是  ""
        foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
            {
                if( info.serialNumber() == "5573932333735170A1A2" )  //通过串口序列号来判断是否需要的设备
                {
                    com_info = info;
                    break;
                }
            }
    
        if (com_info.portName()==""){  //如果没找到超声波串口
          QMessageBox::critical(this,"错误","请把超声波测距仪插入USB口",QMessageBox::Ok);
          exit(0);  //退出程序
    
        }
    
            serial->setPort(com_info);  //设置要操作的串口
            if(serial->open(QIODevice::ReadWrite))   //如果串口打开成功
                //以读写方式打开串口
            {
               qDebug() << "成功打开串口";
               serial->setBaudRate(QSerialPort::Baud9600); //设置波特率
               /*常用波特率
               常量                            值                说明
              QSerialPort::Baud1200          1200            1200 baud.
              QSerialPort::Baud2400          2400            2400 baud.
              QSerialPort::Baud4800          4800            4800 baud.
              QSerialPort::Baud9600          9600            9600 baud.
              QSerialPort::Baud19200         19200           19200 baud.
              QSerialPort::Baud38400         38400           38400 baud.
              QSerialPort::Baud57600         57600           57600 baud.
              QSerialPort::Baud115200        115200          115200 baud.
              */
               serial->setParity(QSerialPort::NoParity);  //设置校验位
               serial->setDataBits(QSerialPort::Data8);  //设置数据位
               serial->setStopBits(QSerialPort::OneStop);  //设置停止位
               serial->setFlowControl(QSerialPort::NoFlowControl);   //设置流控制
    
               //serial->clearError();
               /*此属性保存串行端口的错误状态I/O设备状态返回错误代码。例如,如果open()返回false,或者读/写操作返回-1,
               则可以使用此属性找出操作失败的原因。调用clearError()后,错误代码被设置为默认的QSerialPort::NoError
               */
               //serial->clear();
               /*
               清除输出或输入缓冲区中的所有字符。这包括清除内部类缓冲区和UART(驱动程序)缓冲区。
               同时终止挂起的读或写操作。如果成功,则返回true;否则返回false
               */
               connect(serial, SIGNAL(readyRead()), this, SLOT(readyReadSlot())); //如果接收到数据输入信号,就执行相应的槽函数
            }
    
    
    
    
    }
    
    Win::~Win()
    {
    }
    
    void Win::readyReadSlot()
    {
    
        QByteArray arr = serial->readAll(); //读取串口缓冲区数据
        //读取后的数据类型:QByteArray
        str = arr; //转换成QString
        str1=str1+str;
    
        i=str1.count("
    ");//获取子串出现的次数
        if(i>=2){
            //qDebug() <<str1<<i;
            list = str1.split("
    ");  //把字符串拆分成QStringList
    
            str=list[1]+"厘米";
            label1->setText(str);
            label1->adjustSize();//    根据内容自适应大小
    
    
    
            str1="";
                }
    
    
    }

    win.h

    #ifndef WIN_H
    #define WIN_H
    
    #include <QWidget>
    #include <QDebug>
    #include <QtSerialPort/QSerialPort>
    #include <QtSerialPort/QSerialPortInfo>
    #include <QLabel>
     #include <QMessageBox>
    
    
    
    class Win : public QWidget
    {
        Q_OBJECT
    
    public:
        Win(QWidget *parent = nullptr);
        ~Win();
    
        QSerialPort *serial;  //定义一个全局的串口对象指针
    
        QLabel* label;
        QLabel* label1;
        QString str;
        QString str1;
        int i;
        QStringList list;
    
    
    public slots:
        void readyReadSlot();
    
    };
    #endif // WIN_H

    工程下载:链接:https://pan.baidu.com/s/1meJqogbWZ-KDTqU52jw0rQ    提取码:6666    

     

     学习资料:https://blog.csdn.net/u010780613/article/details/50560126   

                      https://blog.csdn.net/lmhuanying1012/article/details/78747737

  • 相关阅读:
    Linux编译安装中configure、make和make install各自的作用
    转载的 Linux下chkconfig命令详解
    MYSQL主从不同步延迟原理分析及解决方案(摘自http://www.jb51.net/article/41545.htm)
    mysql主从延迟(摘自http://www.linuxidc.com/Linux/2012-02/53995.htm)
    http://ninghao.net/video/1554不错的学习网址
    javascript 内置对象和方法
    javascript 函数
    javascript 基础
    css z-index
    css 透明度
  • 原文地址:https://www.cnblogs.com/liming19680104/p/14316440.html
Copyright © 2011-2022 走看看