初次使用QT5串口类QSerialPort

        因为工作需要,现在正在学习Qt的串口通信。Qt4的话需要使用第三方类,使用起来也非常简单,只需要把对应的文件添加到自己的项目中就可以了,我参考的是Qt论坛上的demo,刘大师和yafei的demo都非常详细,网上都可以下载到。不过,Qt5添加了串口类,使用起来就更方便了。

        我这里主要是对串口类的简单使用,实现的功能是以读写方式打开串口,点击发送数据按钮将发送区的数据发送到缓冲区,然后在接收区显示出来,界面如下:(源码可以在这里下载)

                                                             

        这里使用了QSerialPort模块提供的两个类:QSerialPort类和QSerialPortInfo类,QSerialPort类提供了对串口的操作,QSerialPortInfo类提供了对串口信息的获取。下面是主要代码,包含了对串口类的简单使用。

        首先,一定要在.pro文件中添加:QT += serialport

        串口初始化如下:

/****************************串口初始化*****************************/
void MainWindow::initPort()
{
    //读取串口信息
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug()<<"Name:"<<info.portName();
        qDebug()<<"Description:"<<info.description();
        qDebug()<<"Manufacturer:"<<info.manufacturer();

        //这里相当于自动识别串口号之后添加到了cmb,如果要手动选择可以用下面列表的方式添加进去
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            //将串口号添加到cmb
            ui->cmbPortName->addItem(info.portName());
            //关闭串口等待人为(打开串口按钮)打开
            serial.close();
        }
    }

    QStringList baudList;//波特率
    QStringList parityList;//校验位
    QStringList dataBitsList;//数据位
    QStringList stopBitsList;//停止位

    baudList<<"50"<<"75"<<"100"<<"134"<<"150"<<"200"<<"300"
           <<"600"<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"
          <<"14400"<<"19200"<<"38400"<<"56000"<<"57600"
         <<"76800"<<"115200"<<"128000"<<"256000";

    ui->cmbBaudRate->addItems(baudList);
    ui->cmbBaudRate->setCurrentIndex(12);

    parityList<<"无"<<"奇"<<"偶";
    parityList<<"标志";
    parityList<<"空格";

    ui->cmbParity->addItems(parityList);
    ui->cmbParity->setCurrentIndex(0);

    dataBitsList<<"5"<<"6"<<"7"<<"8";
    ui->cmbDataBits->addItems(dataBitsList);
    ui->cmbDataBits->setCurrentIndex(3);

    stopBitsList<<"1";
    stopBitsList<<"1.5";
    stopBitsList<<"2";

    ui->cmbStopBits->addItems(stopBitsList);
    ui->cmbStopBits->setCurrentIndex(0);

    //设置按钮可以被按下
    ui->btnOpen->setCheckable(true);
}

        这里通过遍历所有串口将我们需要使用的串口添加到了combox中,如果想要手动选择可以将串口名称通过列表的方式添加到combox中,到使用的时候再选择。

        串口设置如下:

/****************************串口设置******************************/
void MainWindow::on_btnOpen_clicked()
{
    if(ui->btnOpen->text() == "打开串口")
    {
        my_serialport = new QSerialPort(this);

        //设置串口号
        my_serialport->setPortName(ui->cmbPortName->currentText());
        //以读写方式打开串口
        if(my_serialport->open(QIODevice::ReadWrite))
        {
            //设置波特率
            my_serialport->setBaudRate(ui->cmbBaudRate->currentText().toInt());
            //设置数据位
            my_serialport->setDataBits(QSerialPort::Data8);
            //设置校验位
            my_serialport->setParity(QSerialPort::NoParity);
            //设置流控制
            my_serialport->setFlowControl(QSerialPort::NoFlowControl);
            //设置停止位
            my_serialport->setStopBits(QSerialPort::OneStop);

            //每秒读一次
            timer = new QTimer(this);
            connect(timer, SIGNAL(timeout()), this, SLOT(readComDataSlot()));
            timer->start(1000);

            setNonSelectable();
        }
        else
        {
            QMessageBox::about(NULL, "提示", "串口没有打开!");
            return;
        }
    }
    else
    {
        timer->stop();
        setSelectable();
        my_serialport->close();
    }
}

        这里是对串口的设置,需要先打开串口才能设置串口参数。参数设置好之后就可以通过read()和write()函数进行数据的读写,我这里用的是1秒的定时器来读缓冲区的数据。

        数据收发如下:

/****************************数据传输******************************/
void MainWindow::readComDataSlot()
{
    //读取串口数据
    QByteArray readComData = my_serialport->readAll();

    //将读到的数据显示到数据接收区的te中
    if(readComData != NULL)
    {
        ui->teReceiveData->append(readComData);
    }

    //清除缓冲区
    readComData.clear();
}

void MainWindow::on_btnSend_clicked()
{
    //获取发送区的数据
    QString sendData = ui->teSendData->toPlainText();
    QByteArray sendData_2 = sendData.toLatin1();

    //写入缓冲区
    my_serialport->write(sendData_2);
}

    

猜你喜欢

转载自blog.csdn.net/zbw1185/article/details/51496663