初次使用QT5串口類QSerialPort


轉載自 http://blog.csdn.net/zbw1185/article/details/51496663

 

 因為工作需要,現在正在學習Qt的串口通信。Qt4的話需要使用第三方類,使用起來也非常簡單,只需要把對應的文件添加到自己的項目中就可以了,我參考的是Qt論壇上的demo,劉大師和yafei的demo都非常詳細,網上都可以下載到。不過,Qt5添加了串口類,使用起來就更方便了。

 

        我這里主要是對串口類的簡單使用,實現的功能是以讀寫方式打開串口,點擊發送數據按鈕將發送區的數據發送到緩沖區,然后在接收區顯示出來,界面如下:(源碼可以在 這里下載)
 

                                                             

 

        這里使用了QSerialPort模塊提供的兩個類:QSerialPort類和QSerialPortInfo類,QSerialPort類提供了對串口的操作,QSerialPortInfo類提供了對串口信息的獲取。下面是主要代碼,包含了對串口類的簡單使用。

 

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

 

        串口初始化如下:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. /****************************串口初始化*****************************/  
  2. void MainWindow::initPort()  
  3. {  
  4.     //讀取串口信息  
  5.     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
  6.     {  
  7.         qDebug()<<"Name:"<<info.portName();  
  8.         qDebug()<<"Description:"<<info.description();  
  9.         qDebug()<<"Manufacturer:"<<info.manufacturer();  
  10.   
  11.         //這里相當於自動識別串口號之后添加到了cmb,如果要手動選擇可以用下面列表的方式添加進去  
  12.         QSerialPort serial;  
  13.         serial.setPort(info);  
  14.         if(serial.open(QIODevice::ReadWrite))  
  15.         {  
  16.             //將串口號添加到cmb  
  17.             ui->cmbPortName->addItem(info.portName());  
  18.             //關閉串口等待人為(打開串口按鈕)打開  
  19.             serial.close();  
  20.         }  
  21.     }  
  22.   
  23.     QStringList baudList;//波特率  
  24.     QStringList parityList;//校驗位  
  25.     QStringList dataBitsList;//數據位  
  26.     QStringList stopBitsList;//停止位  
  27.   
  28.     baudList<<"50"<<"75"<<"100"<<"134"<<"150"<<"200"<<"300"  
  29.            <<"600"<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"  
  30.           <<"14400"<<"19200"<<"38400"<<"56000"<<"57600"  
  31.          <<"76800"<<"115200"<<"128000"<<"256000";  
  32.   
  33.     ui->cmbBaudRate->addItems(baudList);  
  34.     ui->cmbBaudRate->setCurrentIndex(12);  
  35.   
  36.     parityList<<"無"<<"奇"<<"偶";  
  37.     parityList<<"標志";  
  38.     parityList<<"空格";  
  39.   
  40.     ui->cmbParity->addItems(parityList);  
  41.     ui->cmbParity->setCurrentIndex(0);  
  42.   
  43.     dataBitsList<<"5"<<"6"<<"7"<<"8";  
  44.     ui->cmbDataBits->addItems(dataBitsList);  
  45.     ui->cmbDataBits->setCurrentIndex(3);  
  46.   
  47.     stopBitsList<<"1";  
  48.     stopBitsList<<"1.5";  
  49.     stopBitsList<<"2";  
  50.   
  51.     ui->cmbStopBits->addItems(stopBitsList);  
  52.     ui->cmbStopBits->setCurrentIndex(0);  
  53.   
  54.     //設置按鈕可以被按下  
  55.     ui->btnOpen->setCheckable(true);  
  56. }  

 

 

        這里通過遍歷所有串口將我們需要使用的串口添加到了combox中,如果想要手動選擇可以將串口名稱通過列表的方式添加到combox中,到使用的時候再選擇。

 

        串口設置如下:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. /****************************串口設置******************************/  
  2. void MainWindow::on_btnOpen_clicked()  
  3. {  
  4.     if(ui->btnOpen->text() == "打開串口")  
  5.     {  
  6.         my_serialport = new QSerialPort(this);  
  7.   
  8.         //設置串口號  
  9.         my_serialport->setPortName(ui->cmbPortName->currentText());  
  10.         //以讀寫方式打開串口  
  11.         if(my_serialport->open(QIODevice::ReadWrite))  
  12.         {  
  13.             //設置波特率  
  14.             my_serialport->setBaudRate(ui->cmbBaudRate->currentText().toInt());  
  15.             //設置數據位  
  16.             my_serialport->setDataBits(QSerialPort::Data8);  
  17.             //設置校驗位  
  18.             my_serialport->setParity(QSerialPort::NoParity);  
  19.             //設置流控制  
  20.             my_serialport->setFlowControl(QSerialPort::NoFlowControl);  
  21.             //設置停止位  
  22.             my_serialport->setStopBits(QSerialPort::OneStop);  
  23.   
  24.             //每秒讀一次  
  25.             timer = new QTimer(this);  
  26.             connect(timer, SIGNAL(timeout()), this, SLOT(readComDataSlot()));  
  27.             timer->start(1000);  
  28.   
  29.             setNonSelectable();  
  30.         }  
  31.         else  
  32.         {  
  33.             QMessageBox::about(NULL, "提示", "串口沒有打開!");  
  34.             return;  
  35.         }  
  36.     }  
  37.     else  
  38.     {  
  39.         timer->stop();  
  40.         setSelectable();  
  41.         my_serialport->close();  
  42.     }  
  43. }  

 

 

        這里是對串口的設置,需要先打開串口才能設置串口參數。參數設置好之后就可以通過read()和write()函數進行數據的讀寫,我這里用的是1秒的定時器來讀緩沖區的數據。

 

        數據收發如下:

 

[cpp]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. /****************************數據傳輸******************************/  
  2. void MainWindow::readComDataSlot()  
  3. {  
  4.     //讀取串口數據  
  5.     QByteArray readComData = my_serialport->readAll();  
  6.   
  7.     //將讀到的數據顯示到數據接收區的te中  
  8.     if(readComData != NULL)  
  9.     {  
  10.         ui->teReceiveData->append(readComData);  
  11.     }  
  12.   
  13.     //清除緩沖區  
  14.     readComData.clear();  
  15. }  
  16.   
  17. void MainWindow::on_btnSend_clicked()  
  18. {  
  19.     //獲取發送區的數據  
  20.     QString sendData = ui->teSendData->toPlainText();  
  21.     QByteArray sendData_2 = sendData.toLatin1();  
  22.   
  23.     //寫入緩沖區  
  24.     my_serialport->write(sendData_2);  
  25. }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM