初次使用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);
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章