关于QSerialPort的使用说明(Qt实现串口工具)

Qt提供了对串口设备的简单操作功能接口,包括串口配置、收/发数据。将串口设备插入到电脑USB接口后,可在电脑的设备管理里查看端口,会多了个COM之类的端口。一般的USB串行设备驱动在window里都已经安装好了,不需要再单独安装驱动,若是设备管理器查看到端口出现了叹号,可以从网上查找对应的驱动,并下载安装。

1.在使用QSerialPort类的文件里,需要包含以下头文件

#include 
#include 

2.在.pro文件里添加

QT += serialport

3.获取/查看电脑里所有的串口设备 

    QList list;

    list = QSerialPortInfo::availablePorts();
    for (int i = 0; i < list.size(); i++)
    {
         qDebug() << list.at(i).portName() ;//串口名字
         qDebug() << list.at(i).description();//串口描述
         qDebug() << "#########";
    }

执行后输出:

关于QSerialPort的使用说明(Qt实现串口工具)_第1张图片

可看当前我电脑有COM1/COM3/COM4,三个串口设备。 

 4.打开和配置串口设备

    QSerialPort *port;
    port = new QSerialPort("COM4");//通过名字打开,可通过上面的list里查找
    /*根据需求对串口进行进行配置*/
    port->setBaudRate(QSerialPort::Baud115200);//配置波特率位115200
    port->setDataBits(QSerialPort::Data8);//配置数据格式为8bit
    port->setParity(QSerialPort::NoParity);//无校验位
    port->setStopBits(QSerialPort::OneStop);//一个停止位
    port->setFlowControl(QSerialPort::NoFlowControl);//不使用流控制
    /*打开设备*/
    if (!port->open(QIODevice::ReadWrite))
    {
         qDebug() << "serial open failed";
         return ;
    }
    else
    {
         qDebug() << "serial open success";
    }
    /*设置接收缓冲区大小*/
    port->setReadBufferSize(500);
    /*绑定接受槽函数,但收到信息是将调用MainSerialRecvMsgEvent函数*/
    QObject::connect(port, &QSerialPort::readyRead, this, &MainWindow::MainSerialRecvMsgEvent);

 如果打开串口失败,可能是因为该串口已经被其他进程占用,绑定槽函数之后,当串口有数据的时候就会回调该槽函数,值得注意的是,假如要接收连串的10个字节的数据,可能进入多次槽函数,每一次接收部分字节;也有可能进入一次槽函数就已接收完10个字节。

5.接收、发送串口数据

/*数据接收*/
void MainWindow::MainSerialRecvMsgEvent(void)
{
    QByteArray MainSerialRecvData;//保存串口数据的数组

    if(port->bytesAvailable()>0)//判断等到读取的数据大小
    {
         MainSerialRecvData = port->readAll();//读取所有的接收数据
         if(!MainSerialRecvData.isEmpty()){
               qDebug() <textBrowser->append(MainSerialRecvData);//将数据显示到textBrowser
          }else{
               qDebug()<<"接受数据出错";
          }
     }
}

/*数据发送*/
void MainWindow::on_pushButton_2_clicked()
{
    QByteArray txdata;

    if(port!=NULL&&port->isOpen())
    {
        txdata = ui->lineEdit->text().toLatin1();
        port->write(txdata);
        ui->lineEdit->clear();
    }
    else
    {
         qDebug() <<"串口未打开!";
    }
}

调用write发送数据是将数据写入了内部发送数据缓冲区,并不等于马上从底层串行端口发出,真正发出去的时间受电脑当前性能的影响。这一点在我们一般的使用过程中不会受到太大影响。使用flush()可尽可能的将发送缓冲区的数据从端口发出,在大多数的情况下,不需要使用它。

附上一个简单的例程:点击下载。

你可能感兴趣的:(Qt入门基础)