詳解 Qt 串口通信程序全程圖文 (4)
Qt 串口通信程序全程圖文是本文介紹的內(nèi)容,本文一開始先講解對(duì)程序的改進(jìn),在文章最后將要講解一些重要問(wèn)題。
1、在窗口中加入一些組合框Combo Box,它們的名稱及條目如下:
串口:portNameComboBox,條目為:COM1,COM2
波特率:baudRateComboBox,條目為:9600,115200
數(shù)據(jù)位:dataBitsComboBox,條目為:8,7
校驗(yàn)位:parityComboBox,條目為:無(wú),奇,偶
停止位:stopBitsComboBox,條目為:1,2
(注:在窗口上的Combo Box上雙擊,在彈出的對(duì)話框上按“+”號(hào),可添加條目。我們只是為了演示,所以只加了這幾個(gè)條目,你可以根據(jù)自己的需要添加。)
改好的窗口如下所示:
2、更改“打開串口”按鈕的單擊事件槽函數(shù)。
- void MainWindow::on_openMyComBtn_clicked()
- {
- QString portName = ui->portNameComboBox->currentText(); //獲取串口名
- myCom = new Win_QextSerialPort(portName,QextSerialBase::EventDriven);
- //定義串口對(duì)象,并傳遞參數(shù),在構(gòu)造函數(shù)里對(duì)其進(jìn)行初始化
- myCom ->open(QIODevice::ReadWrite); //打開串口
- if(ui->baudRateComboBox->currentText()==tr("9600")) //根據(jù)組合框內(nèi)容對(duì)串口進(jìn)行設(shè)置
- myCom->setBaudRate(BAUD9600);
- else if(ui->baudRateComboBox->currentText()==tr("115200"))
- myCom->setBaudRate(BAUD115200);
- //設(shè)置波特率
- if(ui->dataBitsComboBox->currentText()==tr("8"))
- myCom->setDataBits(DATA_8);
- else if(ui->dataBitsComboBox->currentText()==tr("7"))
- myCom->setDataBits(DATA_7);
- //設(shè)置數(shù)據(jù)位
- if(ui->parityComboBox->currentText()==tr("無(wú)"))
- myCom->setParity(PAR_NONE);
- else if(ui->parityComboBox->currentText()==tr("奇"))
- myCom->setParity(PAR_ODD);
- else if(ui->parityComboBox->currentText()==tr("偶"))
- myCom->setParity(PAR_EVEN);
- //設(shè)置奇偶校驗(yàn)
- if(ui->stopBitsComboBox->currentText()==tr("1"))
- myCom->setStopBits(STOP_1);
- else if(ui->stopBitsComboBox->currentText()==tr("2"))
- myCom->setStopBits(STOP_2);
- //設(shè)置停止位
- myCom->setFlowControl(FLOW_OFF); //設(shè)置數(shù)據(jù)流控制,我們使用無(wú)數(shù)據(jù)流控制的默認(rèn)設(shè)置
- myCom->setTimeout(500); //設(shè)置延時(shí)
- connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));
- //信號(hào)和槽函數(shù)關(guān)聯(lián),當(dāng)串口緩沖區(qū)有數(shù)據(jù)時(shí),進(jìn)行讀串口操作
- ui->openMyComBtn->setEnabled(false); //打開串口后“打開串口”按鈕不可用
- ui->closeMyComBtn->setEnabled(true); //打開串口后“關(guān)閉串口”按鈕可用
- ui->sendMsgBtn->setEnabled(true); //打開串口后“發(fā)送數(shù)據(jù)”按鈕可用
- ui->baudRateComboBox->setEnabled(false); //設(shè)置各個(gè)組合框不可用
- ui->dataBitsComboBox->setEnabled(false);
- ui->parityComboBox->setEnabled(false);
- ui->stopBitsComboBox->setEnabled(false);
- ui->portNameComboBox->setEnabled(false);
- }
這里我們先獲取串口的名稱,然后調(diào)用另一個(gè)構(gòu)造函數(shù)對(duì)myCom進(jìn)行定義,這個(gè)構(gòu)造函數(shù)里沒(méi)有串口的設(shè)置參數(shù)。然后打開串口。然后獲取串口的設(shè)置數(shù)據(jù),用setBaudRate();等一系列函數(shù)進(jìn)行串口的設(shè)置,這些函數(shù)都在win_qextserialport.cpp文件中定義,如下圖。
看完前面幾部分的內(nèi)容,對(duì)于這幾個(gè)函數(shù)應(yīng)該很好理解,這里不再解釋。在最后我們對(duì)添加的那幾個(gè)組合框進(jìn)行了不可用設(shè)置,使其在串口打開的情況下不能選擇。
程序如下:
3、更改“關(guān)閉串口”按鈕單擊事件的槽函數(shù)。
- void MainWindow::on_closeMyComBtn_clicked()
- {
- myCom->close();
- ui->openMyComBtn->setEnabled(true); //關(guān)閉串口后“打開串口”按鈕可用
- ui->closeMyComBtn->setEnabled(false); //關(guān)閉串口后“關(guān)閉串口”按鈕不可用
- ui->sendMsgBtn->setEnabled(false); //關(guān)閉串口后“發(fā)送數(shù)據(jù)”按鈕不可用
- ui->baudRateComboBox->setEnabled(true); //設(shè)置各個(gè)組合框可用
- ui->dataBitsComboBox->setEnabled(true);
- ui->parityComboBox->setEnabled(true);
- ui->stopBitsComboBox->setEnabled(true);
- ui->portNameComboBox->setEnabled(true);
- }
這里只是加入了一些使組合框在“關(guān)閉串口”按鈕按下后變?yōu)榭捎玫恼Z(yǔ)句。
程序如下:
4、更改main.cpp文件。
- #include
- #include //加入頭文件
- #include "mainwindow.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- QTextCodec::setCodecForTr(QTextCodec::codecForLocale());
- //使程序可處理中文
- MainWindow w;
- w.show();
- return a.exec();
- }
因?yàn)樯厦娴某绦蛑杏玫搅酥形?,為了能使程序識(shí)別中文,我們需要在主函數(shù)中加入這些語(yǔ)句。
程序如下:
打開后程序界面如下。
設(shè)置為“奇校驗(yàn)”,發(fā)送完1的效果如下圖。(接收到的是亂碼)
到這里,整個(gè)程序就寫完了。
小結(jié):關(guān)于Qt 串口通信程序全程圖文的內(nèi)容本節(jié)介紹完了,希望本文對(duì)你有所幫助,關(guān)于串口的更多內(nèi)容,請(qǐng)關(guān)注編輯推薦。(連載)
【編輯推薦】