欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Qt編寫(xiě)串口通信程序全程圖文講解(四)
Qt編寫(xiě)串口通信程序全程圖文講解(四)終

本文一開(kāi)始先講解對程序的改進(jìn),在文章最后將要講解一些重要問(wèn)題。

第一,在窗口中加入一些組合框Combo Box,它們的名稱(chēng)及條目如下:

串口:portNameComboBox,條目為:COM1,COM2

波特率:baudRateComboBox,條目為:9600,115200

數據位:dataBitsComboBox,條目為:8,7

校驗位:parityComboBox,條目為:無(wú),奇,偶

停止位:stopBitsComboBox,條目為:1,2

(注:在窗口上的Combo Box上雙擊,在彈出的對話(huà)框上按“+”號,可添加條目。)

改好的窗口如下所示:

第二,更改“打開(kāi)串口”按鈕的單擊事件槽函數。

void MainWindow::on_openMyComBtn_clicked()

{

QString portName = ui->portNameComboBox->currentText(); //獲取串口名

myCom = new Win_QextSerialPort(portName,QextSerialBase::EventDriven);

//定義串口對象,并傳遞參數,在構造函數里對其進(jìn)行初始化

myCom ->open(QIODevice::ReadWrite); //打開(kāi)串口

if(ui->baudRateComboBox->currentText()==tr("9600")) //根據組合框內容對串口進(jìn)行設置

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("無(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);

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()));

//信號和槽函數關(guān)聯(lián),當串口緩沖區有數據時(shí),進(jìn)行讀串口操作

ui->openMyComBtn->setEnabled(false); //打開(kāi)串口后“打開(kāi)串口”按鈕不可用

ui->closeMyComBtn->setEnabled(true); //打開(kāi)串口后“關(guān)閉串口”按鈕可用

ui->sendMsgBtn->setEnabled(true); //打開(kāi)串口后“發(fā)送數據”按鈕可用

ui->baudRateComboBox->setEnabled(false); //設置各個(gè)組合框不可用

ui->dataBitsComboBox->setEnabled(false);

ui->parityComboBox->setEnabled(false);

ui->stopBitsComboBox->setEnabled(false);

ui->portNameComboBox->setEnabled(false);

}


這里我們先獲取串口的名稱(chēng),然后調用另一個(gè)構造函數對myCom進(jìn)行定義,這個(gè)構造函數里沒(méi)有串口的設置參數。然后打開(kāi)串口。然后獲取串口的設置數據,用setBaudRate();等一系列函數進(jìn)行串口的設置,這些函數都在win_qextserialport.cpp文件中定義,如下圖。

對于這幾個(gè)函數應該很好理解,這里不再解釋。在最后我們對添加的那幾個(gè)組合框進(jìn)行了不可用設置,使其在串口打開(kāi)的情況下不能選擇。

程序如下:

 

第三,更改“關(guān)閉串口”按鈕單擊事件的槽函數。

void MainWindow::on_closeMyComBtn_clicked()

{

myCom->close();

ui->openMyComBtn->setEnabled(true); //關(guān)閉串口后“打開(kāi)串口”按鈕可用

ui->closeMyComBtn->setEnabled(false); //關(guān)閉串口后“關(guān)閉串口”按鈕不可用

ui->sendMsgBtn->setEnabled(false); //關(guān)閉串口后“發(fā)送數據”按鈕不可用

ui->baudRateComboBox->setEnabled(true); //設置各個(gè)組合框可用

ui->dataBitsComboBox->setEnabled(true);

ui->parityComboBox->setEnabled(true);

ui->stopBitsComboBox->setEnabled(true);

ui->portNameComboBox->setEnabled(true);

}

這里只是加入了一些使組合框在“關(guān)閉串口”按鈕按下后變?yōu)榭捎玫恼Z(yǔ)句。

程序如下:

第四,更改main.cpp文件。

#include <QtGui/QApplication>

#include <QTextCodec> //加入頭文件

#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ǔ)句中用到了中文,為了能使程序識別中文,我們需要在主函數中加入這些語(yǔ)句。

程序如下:

第五,運行程序。

打開(kāi)后程序界面如下。

正常發(fā)送1后如下。

設置為“奇校驗”后,發(fā)送完1的效果如下圖。

到這里,整個(gè)程序就完全寫(xiě)完了。

 

 

 

重要問(wèn)題說(shuō)明:

(下面所說(shuō)的第一個(gè)程序是指第一篇文章中寫(xiě)的那個(gè)程序,第二個(gè)程序是指第三篇文章中那個(gè)程序,第三個(gè)程序是指本篇文章中所寫(xiě)的程序。)

問(wèn)題一:第一個(gè)程序中

struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};

myCom = new Win_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);

這兩句代碼如果換為下面一行:

myCom = new Win_QextSerialPort("com1",QextSerialBase::EventDriven);

你再運行一下程序,是不是還能用?那我們的串口設置的結構體myComSetting沒(méi)有用嗎?你可以把上面的結構體里的波特率由9600改為115200,如果這個(gè)結構體有用,那么程序不可能再接收到數據,不過(guò),你再運行一下程序,是這樣嗎?

      如此看來(lái),我們對串口進(jìn)行的設置果真沒(méi)用,那默認的串口設置是什么呢?我們先看下一個(gè)問(wèn)題。

問(wèn)題二:我們同時(shí)打開(kāi)第三個(gè)程序和第二個(gè)程序。(注意:兩個(gè)程序的串口不能同時(shí)打開(kāi),所以打開(kāi)一

個(gè)程序的串口時(shí)要將另一個(gè)程序的串口關(guān)閉。)

我們先在第三個(gè)程序上按默認設置打開(kāi)串口,發(fā)送數據1。然后關(guān)閉串口,在第二個(gè)程序上打開(kāi)串口,發(fā)送數據1??梢钥吹絻蓚€(gè)程序上接受到的信息都正確。如下圖。

我們關(guān)閉第二個(gè)程序上的串口,再將第三個(gè)程序上設置為奇校驗,然后打開(kāi)串口,發(fā)送數據1,可以看到其收到的數據顯示亂碼。這時(shí)我們關(guān)閉第三個(gè)程序上的串口,打開(kāi)第二個(gè)程序上的串口,發(fā)送數據1,你會(huì )驚奇地發(fā)現,它收到的信息也是亂碼。如下圖。

這到底是怎么回事呢?我們也可以去網(wǎng)上下載其他的串口助手進(jìn)行實(shí)驗,也可以改變波特率進(jìn)行實(shí)驗。由所有的結果得出的結論只能是:我們用那個(gè)結構體作為參數傳過(guò)去后,并沒(méi)有對串口進(jìn)行設置,而程序運行使用的串口設置是系統以前保留的設置。那么,為什么會(huì )這樣呢?我們看下面的一個(gè)問(wèn)題。

問(wèn)題三:我們將第三個(gè)程序中的那行代碼

myCom ->open(QIODevice::ReadWrite);

放到設置串口的語(yǔ)句之后,

connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));

這句之前,然后再運行程序。你會(huì )發(fā)現程序的串口設置功能已經(jīng)不起作用了。

       其實(shí),上面的三個(gè)問(wèn)題是一個(gè)問(wèn)題,它的結論就是,寫(xiě)串口程序時(shí),要先打開(kāi)串口再對它進(jìn)行設置,不然設置就不會(huì )起作用。所以,這里應該說(shuō)明,第一個(gè)和第二個(gè)程序都是不太正確的,正確的方法應該是像第三個(gè)程序一樣,先定義Win_QextSerialPort類(lèi)對象,然后打開(kāi)串口,再用那幾個(gè)函數對串口進(jìn)行設置。

 

到這里整篇文章就結束了。對于其中的一些問(wèn)題也只是我個(gè)人的觀(guān)點(diǎn),由于水平有限,所以理解上可能會(huì )有偏差,或者錯誤,請廣大網(wǎng)友批評指正。我寫(xiě)這篇文章的目的只是想讓Qt初學(xué)者能更輕松的用Qt寫(xiě)出串口通信程序,及掌握Qt寫(xiě)程序時(shí)的一些技巧。如果你從我的文章中學(xué)到了一點(diǎn)知識,那么我的這篇文章就算是沒(méi)有白寫(xiě)。

      最后,如果你喜歡我的寫(xiě)作風(fēng)格,并且初學(xué)Qt,可以在我的空間查看Qt Creator系列教程,希望能對你的入門(mén)有所幫助。

 

全文的pdf文檔下載http://download.csdn.net/source/1763251

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Qt編寫(xiě)串口通信程序全程圖文講解
Qt編程之“串口助手”
Linux下基于QT的串口通信程序(Tiny6410)( 轉)
線(xiàn)程+定時(shí)實(shí)現Linux下的Qt串口編程
QT串口助手(五):文件操作
QT5串口編程——編寫(xiě)簡(jiǎn)單的上位機
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久