詳解 Qt 串口通信程序全程圖文 (4)
Qt 串口通信程序全程圖文是本文介紹的內容,本文一開始先講解對程序的改進,在文章最后將要講解一些重要問題。
1、在窗口中加入一些組合框Combo Box,它們的名稱及條目如下:
串口:portNameComboBox,條目為:COM1,COM2
波特率:baudRateComboBox,條目為:9600,115200
數據位:dataBitsComboBox,條目為:8,7
校驗位:parityComboBox,條目為:無,奇,偶
停止位:stopBitsComboBox,條目為:1,2
(注:在窗口上的Combo Box上雙擊,在彈出的對話框上按“+”號,可添加條目。我們只是為了演示,所以只加了這幾個條目,你可以根據自己的需要添加。)
改好的窗口如下所示:
2、更改“打開串口”按鈕的單擊事件槽函數。
- void MainWindow::on_openMyComBtn_clicked()
- {
- QString portName = ui->portNameComboBox->currentText(); //獲取串口名
- myCom = new Win_QextSerialPort(portName,QextSerialBase::EventDriven);
- //定義串口對象,并傳遞參數,在構造函數里對其進行初始化
- myCom ->open(QIODevice::ReadWrite); //打開串口
- if(ui->baudRateComboBox->currentText()==tr("9600")) //根據組合框內容對串口進行設置
- myCom->setBaudRate(BAUD9600);
- else if(ui->baudRateComboBox->currentText()==tr("115200"))
- myCom->setBaudRate(BAUD115200);
- //設置波特率
- if(ui->dataBitsComboBox->currentText()==tr("8"))
- myCom->setDataBits(DATA_8);
- else if(ui->dataBitsComboBox->currentText()==tr("7"))
- myCom->setDataBits(DATA_7);
- //設置數據位
- if(ui->parityComboBox->currentText()==tr("無"))
- myCom->setParity(PAR_NONE);
- else if(ui->parityComboBox->currentText()==tr("奇"))
- myCom->setParity(PAR_ODD);
- else if(ui->parityComboBox->currentText()==tr("偶"))
- myCom->setParity(PAR_EVEN);
- //設置奇偶校驗
- if(ui->stopBitsComboBox->currentText()==tr("1"))
- myCom->setStopBits(STOP_1);
- else if(ui->stopBitsComboBox->currentText()==tr("2"))
- myCom->setStopBits(STOP_2);
- //設置停止位
- myCom->setFlowControl(FLOW_OFF); //設置數據流控制,我們使用無數據流控制的默認設置
- myCom->setTimeout(500); //設置延時
- connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));
- //信號和槽函數關聯,當串口緩沖區有數據時,進行讀串口操作
- ui->openMyComBtn->setEnabled(false); //打開串口后“打開串口”按鈕不可用
- ui->closeMyComBtn->setEnabled(true); //打開串口后“關閉串口”按鈕可用
- ui->sendMsgBtn->setEnabled(true); //打開串口后“發送數據”按鈕可用
- ui->baudRateComboBox->setEnabled(false); //設置各個組合框不可用
- ui->dataBitsComboBox->setEnabled(false);
- ui->parityComboBox->setEnabled(false);
- ui->stopBitsComboBox->setEnabled(false);
- ui->portNameComboBox->setEnabled(false);
- }
這里我們先獲取串口的名稱,然后調用另一個構造函數對myCom進行定義,這個構造函數里沒有串口的設置參數。然后打開串口。然后獲取串口的設置數據,用setBaudRate();等一系列函數進行串口的設置,這些函數都在win_qextserialport.cpp文件中定義,如下圖。
看完前面幾部分的內容,對于這幾個函數應該很好理解,這里不再解釋。在最后我們對添加的那幾個組合框進行了不可用設置,使其在串口打開的情況下不能選擇。
程序如下:
3、更改“關閉串口”按鈕單擊事件的槽函數。
- void MainWindow::on_closeMyComBtn_clicked()
- {
- myCom->close();
- ui->openMyComBtn->setEnabled(true); //關閉串口后“打開串口”按鈕可用
- ui->closeMyComBtn->setEnabled(false); //關閉串口后“關閉串口”按鈕不可用
- ui->sendMsgBtn->setEnabled(false); //關閉串口后“發送數據”按鈕不可用
- ui->baudRateComboBox->setEnabled(true); //設置各個組合框可用
- ui->dataBitsComboBox->setEnabled(true);
- ui->parityComboBox->setEnabled(true);
- ui->stopBitsComboBox->setEnabled(true);
- ui->portNameComboBox->setEnabled(true);
- }
這里只是加入了一些使組合框在“關閉串口”按鈕按下后變為可用的語句。
程序如下:
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();
- }
因為上面的程序中用到了中文,為了能使程序識別中文,我們需要在主函數中加入這些語句。
程序如下:
打開后程序界面如下。
設置為“奇校驗”,發送完1的效果如下圖。(接收到的是亂碼)
到這里,整個程序就寫完了。
小結:關于Qt 串口通信程序全程圖文的內容本節介紹完了,希望本文對你有所幫助,關于串口的更多內容,請關注編輯推薦。(連載)
【編輯推薦】