• Qt 串口类QSerialPort 使用笔记


    Qt 串口类QSerialPort 使用笔记

    虽然现在大多数的家用PC机上已经不提供RS232接口了。但是由于RS232串口操作简单、通讯可靠,在工业领域中仍然有大量的应用。Qt以前的版本中,没有提供官方的对RS232串口的支持,编写串口程序很不方便。现在好了,在 Qt5.1 中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。 本文就简单的讲讲QtSerialPort模块的使用。

    当前的QtSerialPort模块中提供了两个C++类,分别是QSerialPort QSerialPortInfo

    QSerialPort 类提供了操作串口的各种接口。

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

    使用方法

    先介绍 QSerialPortInfo 的使用。下面是一个简单的例子,用来列举出电脑上全部的串口设备。

    首先,需要在pro文件中增加如下内容:

    QT += serialport

    Cpp 文件如下:

    1. #include <QCoreApplication>  
    2. #include <QDebug>  
    3.    
    4. #include <QSerialPort>  
    5. #include <QSerialPortInfo>  
    6.    
    7. int main(int argc, char *argv[])  
    8. {  
    9.     QCoreApplication a(argc, argv);  
    10.     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
    11.     {  
    12.         qDebug() << "Name : " << info.portName();  
    13.         qDebug() << "Description : " << info.description();  
    14.         qDebug() << "Manufacturer: " << info.manufacturer();  
    15.         qDebug() << "Serial Number: " << info.serialNumber();  
    16.         qDebug() << "System Location: " << info.systemLocation();  
    17.     }  
    18.     return a.exec();  
    19. }  

    在我的电脑上显示的结果如下:

    1. Name :  "COM1"  
    2. Description :  "通信端口"  
    3. Manufacturer:  "(标准端口类型)"  
    4. Serial Number:  ""  
    5. System Location:  "\.COM1"  
    6. Name :  "COM5"  
    7. Description :  "USB Serial Port"  
    8. Manufacturer:  "FTDI"  
    9. Serial Number:  "A400G3UXA"  
    10. System Location:  "\.COM5"  

    通常,我们需要指定程序使用某一个确定的串口,这时不能只使用串口名称,因为USB串口每次插在不同的USB口上时获得的串口名称都可能有变化。这时可以利用串口的序列号,这个号码一般来说是唯一的,比如下面的代码,首先遍历所有的串口,找到我们需要的串口后就返回。

    1. #include <QCoreApplication>  
    2. #include <QDebug>  
    3. #include <QSerialPort>  
    4. #include <QSerialPortInfo>  
    5.   
    6. int main(int argc, char *argv[])  
    7. {  
    8.     QCoreApplication a(argc, argv);  
    9.     QSerialPortInfo com_info;  
    10.     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
    11.     {  
    12.         if( info.serialNumber() == "A400G3UXA" )  
    13.         {  
    14.             com_info = info;  
    15.             break;  
    16.         }  
    17.     }  
    18.     qDebug() << "Name : " << com_info.portName();  
    19.     qDebug() << "Description : " << com_info.description();  
    20.     qDebug() << "serialNumber: " << com_info.serialNumber();  
    21.     return a.exec();  
    22. }  

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

    另外有一个重要的signal 也需要用到,那就是 void QIODevice::readyRead()

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

    下面的代码片段给出了设置串口的例子。

    1.     m_reader.setPort(info);  
    2.     if(m_reader.open(QIODevice::ReadWrite))  
    3.     {  
    4.         qDebug() << "m_reader.open(QIODevice::ReadWrite)";  
    5.         m_reader.setBaudRate(QSerialPort::Baud9600);  
    6.         m_reader.setParity(QSerialPort::NoParity);  
    7.         m_reader.setDataBits(QSerialPort::Data8);  
    8.         m_reader.setStopBits(QSerialPort::OneStop);  
    9.         m_reader.setFlowControl(QSerialPort::NoFlowControl);  
    10.   
    11.         m_reader.clearError();  
    12.         m_reader.clear();  
    13.         connect(&m_reader, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));  
    14. }  
    15.   
    16.   
    17. void Dialog::readyReadSlot()  
    18. {  
    19.     qDebug() << "x";  
    20.     QByteArray arr = m_reader.readAll();  
    21.     do_something(arr);  
    22. }  



     

     

  • 相关阅读:
    poj 2251
    poj 1321
    poj 2777
    poj 3468
    poj 2318
    javascript
    buhui
    swift 构造器
    mac上不了网
    字体
  • 原文地址:https://www.cnblogs.com/wanghuaijun/p/7895616.html
Copyright © 2020-2023  润新知