1.編輯工程文件(后綴為 .pro 的文件)在 QT += core gui 后添加 serialport。![]() 2.自動獲取串口 使用 QSerialPortInfo:::availablePorts()獲取當前串口,該函數(shù)返回容器類 Qlist { { ui->setupUi(this); QStringList serialNamePort; //遍歷:availablePorts()返回的串口信息 foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){ serialNamePort << info.portName(); } ui->serialCb->addItems(serialNamePort); } 編譯后點擊串口選擇框,會出現(xiàn)已經(jīng)連接的串口。 ![]() 3.打開串口功能和屬性設置 步驟一:實例化串口類 QSerialPort 對象 serialPort,對串口的操作就是對 serialPort 對象的操作,調(diào)用QSerialPort 封裝的成員變量(屬性)和成員函數(shù)(功能)就能控制串口。 class Example : public QMainWindow { public: .......... QSerialPort * serialPort; .......... }; ui(new Ui::Example) { ui->setupUi(this); ...... serialPort = new QSerialPort; ...... } 步驟二:填充波特率,數(shù)據(jù)位,停止位,校驗位等屬性。獲取 ui 組件傳遞過來的串口信息,將串口屬性填充到 serialPort 對象。 ![]() 步驟三:打開串口,判斷是否打開成功。 /*打開按鈕*/ void Example: ![]() { QSerialPort::BaudRate bauRate; //波特率 QSerialPort: ![]() QSerialPort::StopBits stopBits; //停止位 QSerialPort: ![]() //設置波特率 if (ui->baudCb->currentText() == "4800" ) { bauRate = QSerialPort::Baud4800; } else if(ui->baudCb->currentText() == "9600" ) { bauRate = QSerialPort::Baud9600; } else if(ui->baudCb->currentText() == "115200") { bauRate = QSerialPort::Baud115200;} //設置數(shù)據(jù)位 if (ui->dataCb->currentText() == "5") { dataBits = QSerialPort: ![]() else if(ui->dataCb->currentText() == "6") { dataBits = QSerialPort: ![]() else if(ui->dataCb->currentText() == "7") { dataBits = QSerialPort: ![]() else if(ui->dataCb->currentText() == "8") { dataBits = QSerialPort: ![]() //設置停止位 if (ui->stopCb->currentText() == "1" ) { stopBits = QSerialPort::OneStop; } else if(ui->stopCb->currentText() == "1.5" ) { stopBits = QSerialPort::OneAndHalfStop; } else if(ui->stopCb->currentText() == "2" ) { stopBits = QSerialPort::TwoStop; } //設置校驗位 if(ui->checkCb->currentText() == "none" ) { checkBits = QSerialPort::NoParity; } //填充串口對象的屬性值 serialPort->setPortName(ui->serialCb->currentText()); serialPort->setBaudRate(bauRate); serialPort->setDataBits(dataBits); serialPort->setStopBits(stopBits); serialPort->setParity(checkBits); //設置好屬性后打開串口 if(serialPort->open(QIODevice::ReadWrite) == true){ QMessageBox::information(this,"提示","成功"); }else{ QMessageBox::critical(this,"提示","失敗"); } } 4.收發(fā)串口數(shù)據(jù)功能 讀數(shù)據(jù):每當數(shù)據(jù)流從串口到達系統(tǒng)一次,就會傳到 Qt 應用程序一次,readyRead 信號就會觸 發(fā) 一次,所以可以用前面章節(jié)講的信號和槽機制將 readyRead 信號和槽函數(shù)綁定,然后就可以在槽函數(shù)中讀取串口數(shù)據(jù)。槽函數(shù)中使用 readAll()讀取數(shù)據(jù),使用帶換行功能的 appendPlainText()顯示到 ui 的接收窗口。 //類中聲明槽函數(shù) private slots: void serialPortReadyRead_Solt(void); //readyRead 信號和槽函數(shù)綁定 connect(serialPort,SIGNAL(readyRead()),this,SLOT(serialPortReadyRead_Solt())); //讀串口 void Example::serialPortReadyRead_Solt(void) { QString buf; buf = QString(serilaPort->readAll()); ui->recvEdit->appendPlainText(buf); } 寫數(shù)據(jù):獲取 ui 界面填寫的信息,ui->sendEdit->text(),使用 QSerialPort 的成員函數(shù) write 將數(shù)據(jù)寫到 串口。 void Widget: ![]() { serilaPort->write(ui->sendEdit->text().toLocal8Bit().data()); } 5.關閉串口功能 使用 QSerialPort 的成員函數(shù) close()關閉串口。 void Widget: ![]() { serilaPort->close(); } 6.清空發(fā)送欄數(shù)據(jù) 調(diào)用 ui 組件 lineEdit 的成員函數(shù) clear 即可清空數(shù)據(jù)。 void Widget: ![]() { ui->recvEdit->clear(); } 編譯測試,結(jié)果如圖: ![]() ![]() |