Qt編寫串口通信程序_第1頁
Qt編寫串口通信程序_第2頁
Qt編寫串口通信程序_第3頁
Qt編寫串口通信程序_第4頁
Qt編寫串口通信程序_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Qt編寫串口通信程序全程圖文講解(一)(轉(zhuǎn))首先說明我們的編程環(huán)境是windowsxp下,在QtCreator中進(jìn)行,如果在Linux下或直接用源碼編寫,程序稍有不同,請(qǐng)自己改動(dòng)。在Qt中并沒有特定的串口控制類,現(xiàn)在大部分人使用的是第三方寫的qextserialport類,我們這里也是使用的該類。我們可以去/projects/qextserialport/files/進(jìn)行下載,也可以去下載論壇上的/bbs/read.php?tid=22847下載到的文件為:qextserialport-1.2win-alpha.zip其內(nèi)容如下圖:ii二ii二S■0'rwlG??我們?cè)趙indows下只需要使用其中的6個(gè)文件:qextserialbase.cpp和qextserialbase.h,qextserialport.cpp和qextserialport.h,win_qextserialport.cpp和win_qextserialport.h如果在L|ux下只需將win_qextserialport.cpp和win_qextserialport.h換為posix_qextserialport.cpp和posix_qextserialport.h即可。下面我們將講述詳細(xì)編程過程,這里我們先給出完整的程序,然后再進(jìn)行逐句分析。1■打開QtCreator,新建Qt4GuiApplication,工程名設(shè)置為mycom,其他使用默認(rèn)選項(xiàng)。(注意:建立的工程路徑不能有中文。)2.將上面所說的6個(gè)文件復(fù)制到工程文件夾下,如下圖。

3.在工程中添加這6個(gè)文件。在QtCreator中左側(cè)的文件列表上,鼠標(biāo)右擊工程文件夾,在彈出的菜單中選擇AddExistingFiles,添加已存在的文件。如下圖:選擇工程文件夾里的那6個(gè)文件,進(jìn)行添加。如下圖。添加好后文件列表如下圖所示:

4■點(diǎn)擊mainwindow.ui,在窗口上加入一個(gè)TextBrowser,用來顯示信息。如下圖。5■在mainwindow.h的相應(yīng)位置添加頭文件#include"win_qextserialport?h",添加對(duì)象聲明Win_QextSerialPort*myCom;,添加槽函數(shù)聲明voidreadMyCom。;,添加完后,如下圖。6?在mainwindow?cpp的類的構(gòu)造函數(shù)中添加如下語句。MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);structPortSettingsmyComSetting={BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};//定義一個(gè)結(jié)構(gòu)體,用來存放串口各個(gè)參數(shù)myCom=newWin_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);//定義串口對(duì)象,并傳遞參數(shù),在構(gòu)造函數(shù)里對(duì)其進(jìn)行初始化myCom->open(QIODevice::ReadWrite);//以可讀寫方式打開串口connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));//信號(hào)和槽函數(shù)關(guān)聯(lián),當(dāng)串口緩沖區(qū)有數(shù)據(jù)時(shí),進(jìn)行讀串口操作}在下面添加readMyCom()函數(shù)的定義,添加如下代碼。voidMainWindow::readMyCom()//讀串口函數(shù){QByteArraytemp=myCom->readAll();//讀取串口緩沖區(qū)的所有數(shù)據(jù)給臨時(shí)變量tempui->textBrowser->insertPlainText(temp);//將串口的數(shù)據(jù)顯示在窗口的文本瀏覽器中}添加完代碼后如下圖。此時(shí)如果運(yùn)行程序,已經(jīng)能實(shí)現(xiàn)讀取串口數(shù)據(jù)的功能了。我們將單片機(jī)采集的溫度信息由串口傳給計(jì)算機(jī),效果如下圖。這樣最簡(jiǎn)單的串口通信程序就完成了。可以看到它只需要加入幾行代碼即可,非常簡(jiǎn)單。Qt編寫串口通信程序全程圖文講解(二)(轉(zhuǎn))上一篇文章中已經(jīng)介紹了實(shí)現(xiàn)最簡(jiǎn)單的串口接收程序的編寫,這篇將對(duì)程序內(nèi)容進(jìn)行分析。1.首先應(yīng)說明操作串口的流程。步驟一:設(shè)置串口參數(shù),如:波特率,數(shù)據(jù)位,奇偶校驗(yàn),停止位,數(shù)據(jù)流控制等。步驟二:選擇串口,如windows下的串口1為"coml”,Linux下為"ttySO”等。步驟三:讀或?qū)懘?。步驟四:關(guān)閉串口。(我們上一個(gè)程序沒有寫串口和關(guān)閉串口的功能,打開串口也是在構(gòu)造函數(shù)里完成的,因?yàn)槟侵皇菫榱擞米詈?jiǎn)單的方法完成串口程序的編寫。在以后的文章里我們將會(huì)對(duì)它進(jìn)行修改和完善。)2.下面我們將按照上面的操作串口的流程,講解第一個(gè)程序的編寫。第一,我們?cè)趯懗绦蛑?,?yīng)該瀏覽一下那6個(gè)文件,大概看一下它們里面都是什么內(nèi)容,各個(gè)文件各個(gè)類之間有什么聯(lián)系。在win_qextserialport.cpp文件中,我們看它的最后一個(gè)構(gòu)造函數(shù),會(huì)發(fā)現(xiàn),串口可以在這里進(jìn)行初始化。Win_QextSerialPort::Win_QextSerialPort(constQString&name,constPortSettings&settings,QextSerialBase::QueryModemode){Win_Handle=INVALID_HANDLE_VALUE;setPortName(name);setBaudRate(settings.BaudRate);setDataBits(settings.DataBits);setStopBits(settings.StopBits);setParity(settings.Parity);setFlowControl(settings.FlowControl);setTimeout(settings.Timeout_Millisec);setQueryMode(mode);init();}它共有三個(gè)參數(shù),其中第一個(gè)參數(shù)constQString&name,應(yīng)該是串口的名字,是QString類型,我們可以用串口1即“coml”不用過多說明。下面我們主要研究第二個(gè)和第三個(gè)參數(shù)。第二,我們查看第二個(gè)參數(shù)的位置。在QtCreator的菜單中選擇Edit->Find/Replace->AIIprojects,如下圖。在彈出的對(duì)話框中輸入要查找的內(nèi)容PortSettings,如下圖。點(diǎn)擊Search后,便能在下面顯示出整個(gè)工程中所有PortSettings的位置。如下圖。ornr■.GfEarornr■.GfEar£H ▼Jr我們點(diǎn)擊第一條,可以看到在qextserialbase.h文件中有一個(gè)structPortSettings,如下圖。我們雙擊這一條,進(jìn)入相應(yīng)的文件。如下圖。structPortSettings{BaudRateTypeBaudRate;DataBitsTypeDataBits;ParityTypeParity;StopBitsTypeStopBits;FlowTypeFlowControl;longTimeout_Millisec;};可以看到在這個(gè)結(jié)構(gòu)體里定義了串口初始化的各個(gè)參數(shù),而對(duì)于BaudRateType等類型的定義,我們?cè)谶@個(gè)結(jié)構(gòu)體的上面可以看到,它們是多個(gè)枚舉變量。如下圖。這時(shí)我們便應(yīng)該明白了,這個(gè)結(jié)構(gòu)體便是實(shí)現(xiàn)串口參數(shù)設(shè)置的。第三,定義串口參數(shù)。BaudRateTypeBaudRate;波特率設(shè)置,我們?cè)O(shè)置為9600,即程序中用BAUD9600;DataBitsTypeDataBits;數(shù)據(jù)位設(shè)置,我們?cè)O(shè)置為8位數(shù)據(jù)位,即DATA_8;ParityTypeParity;奇偶校驗(yàn)設(shè)置,我們?cè)O(shè)置為無校驗(yàn),即PAR_NONE;StopBitsTypeStopBits;停止位設(shè)置,我們?cè)O(shè)置為1位停止位,即STOP_1;FlowTypeFlowControl;數(shù)據(jù)流控制設(shè)置,我們?cè)O(shè)置為無數(shù)據(jù)流控制,即FLOW_OFF;longTimeout_Millisec;延時(shí)設(shè)置,我們?cè)O(shè)置為延時(shí)500ms,即500;這樣便寫出了程序中的那句:structPortSettingsmyComSetting={BAUD9600,DATA_8,PAR_N0NE,ST0P_1,FL0W_0FF,500};我們定義了一個(gè)結(jié)構(gòu)體變量myComSetting,并對(duì)其進(jìn)行了初始化。第四,設(shè)置第三個(gè)參數(shù)。我們先按上面的方法找到它的定義位置,在qextserialbase.h中,如下圖。rI-sr可以看到查詢模式也是枚舉變量,有兩個(gè)選項(xiàng),我們選擇第二個(gè)EventDriven事件驅(qū)動(dòng)。到這里,我們就可以定義Win_QextSerialPort類的變量了,就是那句:myCom=newWin_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);它完成了串口的選擇和串口的初始化。第五,寫打開串口函數(shù)和讀串口函數(shù)。查看win_qextserialport.h文件,我們會(huì)發(fā)現(xiàn)Win_QextSerialPort類繼承自QextSerialBase類。查看qextserialbase.h文件,我們會(huì)發(fā)現(xiàn)QextSerialBase類繼承自QIODevice類。我們?cè)赒t的幫助中查看QIODevice類,如下圖。其部分內(nèi)容如下圖??梢钥吹狡渲杏衑numOpenModeFlag{NotOpen,ReadOnly,WriteOnly,ReadWrite,...,Unbuffered},virtualboolopen(OpenModemode),QByteArrayreadAll()等內(nèi)容。

而下面的信號(hào)函數(shù)中有voidreadyRead■" i+bU.1而下面的信號(hào)函數(shù)中有voidreadyRead■" i+bU.1Lh1中Ir?MLTPiAbt■2直unt54 4▼ ■■?fl.im£b■咖■牛n蘆-申?+?l-'lM^顯肖h?Ti?qCl+VUIL114 riri**:!iLkSM,>j*HJ?HLdr#iTm.EXiillBilhLMI 皿抑H1?miqi^ >hinh-r-nwirFlJVfHiriM:<tilC百)f?ti?i'jX;r%i ifri>?*?1influrrrJrM"訶IW'l■■-■'T??0CfB<j4c■詰I■■*『.7+miM■!iratKUCcLia■JLal^(U.L歸i|ur£4nil**■'fi&utrLir■吐id?■-嚴(yán)創(chuàng)niri-■:<ur4£?i:idxTir^■ '它可以查看串口是否有新的數(shù)據(jù)傳來。誨?rUL#<M?1I?M|n*"ilI?4fifa■.?!鯷”Sltulp?WLd 打I?■冇燉 'Tril?*■ oj■另i£tIf-"TlJi n+MI-4daiJ^haJi4|所以,我們可以用這個(gè)類里的這些函數(shù)操作串口。如程序中的語句:myCom->open(QIODevice::ReadWrite);〃我們調(diào)用了其中的open函數(shù),用ReadWrite可讀寫的方式進(jìn)行打開串口;connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));〃我們關(guān)聯(lián)信號(hào)readyRead(),和自己寫的槽函數(shù)readMyCom(),當(dāng)串口有數(shù)據(jù)傳來時(shí)進(jìn)行讀串口操作。voidMainWindow::readMyCom()//自己寫的讀串口函數(shù){QByteArraytemp=myCom->readAII();〃我們調(diào)用readAll()函數(shù),讀取串口中所有數(shù)據(jù),在上面可以看到其返回值是QByteArray類型。ui->textBrowser->insertPlainText(temp);〃調(diào)用insertPlainText()函數(shù),是窗口上的文本瀏覽器中連續(xù)輸出數(shù)據(jù),而不是每次寫數(shù)據(jù)前都清除以前的〃數(shù)據(jù),可以在Qt的幫助里查看這個(gè)函數(shù)的說明}這樣我們便寫完了所有的語句,最后只需要在mainwindow.h文件中加入相應(yīng)的頭文件,對(duì)象聲明,函數(shù)聲明即可。這里需要說明的是我們一定要學(xué)會(huì)查看文件和使用幫助文檔,將我們不懂得知識(shí)一點(diǎn)一點(diǎn)搞明白。在下一篇中我們將會(huì)加入“打開串口”,“關(guān)閉串口”,“發(fā)送數(shù)據(jù)”三個(gè)按鈕,將整個(gè)程序進(jìn)行完善。下面的程序在第一篇文章中所寫的程序上進(jìn)行了一些改進(jìn)。加入打開和關(guān)閉串口,發(fā)送數(shù)據(jù)等功能。首先,加入了“打開串口”,“關(guān)閉串口”“傳送數(shù)據(jù)”三個(gè)按鈕,加入了一個(gè)行編輯框LineEdit。它們的命名如下:“打開串口”按鈕命名為:openMyComBtn“關(guān)閉串口”按鈕命名為:closeMyComBtn“傳送數(shù)據(jù)”按鈕命名為:sendMsgBtn要傳送數(shù)據(jù)的行編輯框命名為:sendMsgLineEdit界面如下圖。第二步,在“打開串口”按鈕上右擊,選擇Gotoslot選項(xiàng),然后選擇clicked。選項(xiàng),進(jìn)入它的單擊事件槽函數(shù)中,將上個(gè)程序中在構(gòu)造函數(shù)里寫的語句全部剪切到這里。然后加入幾句按鈕的狀態(tài)設(shè)置語句。如下:voidMainWindow::on_openMyComBtn_clicked(){structPortSettingsmyComSetting={BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};//定義一個(gè)結(jié)構(gòu)體,用來存放串口各個(gè)參數(shù)myCom=newWin_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);//定義串口對(duì)象,并傳遞參數(shù),在構(gòu)造函數(shù)里對(duì)其進(jìn)行初始化myCom->open(QIODevice::ReadWrite);//以可讀寫方式打開串口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ù)”按鈕可用然后在構(gòu)造函數(shù)里也添加幾句按鈕初始狀態(tài)設(shè)置語句,如下:MainWindow::MainWindow(QWidget*parent):QMainWindow(parent),ui(newUi::MainWindow){ui->setupUi(this);ui->closeMyComBtn->setEnabled(false);//開始“關(guān)閉串口”按鈕不可用ui->sendMsgBtn->setEnabled(false);//開始“發(fā)送數(shù)據(jù)”按鈕不可用}更改后程序如下圖所示:這時(shí)運(yùn)行程序,效果如下:第三步,按上面的方法進(jìn)入“關(guān)閉串口”按鈕和“發(fā)送數(shù)據(jù)”按鈕的單擊事件的槽函數(shù),更改如下。voidMainWindow::on_closeMyComBtn_clicked() //關(guān)閉串口槽函數(shù){myCom->close();//關(guān)閉串口,該函數(shù)在win_qextserialport.cpp文件中定義ui->openMyComBtn->setEnabled(true);//關(guān)閉串口后“打開串口”按鈕可用ui->closeMyComBtn->setEnabled(false);//關(guān)閉串口后“關(guān)閉串口”按鈕不可用ui->sendMsgBtn->setEnabled(false);//關(guān)閉串口后“發(fā)送數(shù)據(jù)”按鈕不可用}voidMainWindow::on_sendMsgBtn_clicked() //發(fā)送數(shù)據(jù)槽函數(shù){myCom->write(ui->sendMsgLineEdit->text().toAscii());//以ASCII碼形式將行編輯框中的數(shù)據(jù)寫入串口最終效果如下:(將數(shù)據(jù)x發(fā)送給單片機(jī),單片機(jī)返回yousendmessageis:x)在下一篇文章中將對(duì)程序更進(jìn)一步的完善。Qt編寫串口通信程序全程圖文講解(四)終本文一開始先講解對(duì)程序的改進(jìn),在文章最后將要講解一些重要問題。第一,在窗口中加入一些組合框ComboBox,它們的名稱及條目如下:串口:portNameComboBox,條目為:COM1,COM2波特率:baudRateComboBox,條目為:9600,115200數(shù)據(jù)位:dataBitsComboBox,條目為:8,7校驗(yàn)位:parityComboBox,條目為:無,奇,偶停止位:stopBitsComboBox,條目為:1,2(注:在窗口上的ComboBox上雙擊,在彈出的對(duì)話框上按“+號(hào)”,可添加條目。)改好的窗口如下所示:第二,更改“打開串口”按鈕的單擊事件槽函數(shù)。voidMainWindow::on_openMyComBtn_clicked(){QStringportName=ui->portNameComboBox->currentText();〃獲取串口名myCom=newWin_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);elseif(ui->baudRateComboBox->currentText()==tr(”115200”))myCom->setBaudRate(BAUD115200);if(ui->dataBitsComboBox->currentText()==tr("8"))myCom->setDataBits(DATA_8);elseif(ui->dataBitsComboBox->currentText()==tr("7"))myCom->setDataBits(DATA_7);if(ui->parityComboBox->currentText()==tr("無"))myCom->setParity(PAR_NONE);elseif(ui->parityComboBox->currentText()==tr("奇"))myCom->setParity(PAR_ODD)|elseif(ui->parityComboBox->currentText()==tr("偶"))myCom->setParity(PAR_EVEN);|if(ui->stopBitsComboBox->currentText()==tr("1"))myCom->setStopBits(STOP_1)|elseif(ui->stopBitsComboBox->currentText()==tr("2"))myCom->setStopBits(STOP_2)|myCom->setFlowControl(FLOW_OFF);myCom->setTimeout(500);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ù)里沒有串口的設(shè)置參數(shù)。然后打開串口。然后獲取串口的設(shè)置數(shù)據(jù),用setBaudRate();等一系列函數(shù)進(jìn)行串口的設(shè)置,這些函數(shù)都在win_qextserialport.cpp文件中定義,如下圖。對(duì)于這幾個(gè)函數(shù)應(yīng)該很好理解,這里不再解釋。在最后我們對(duì)添加的那幾個(gè)組合框進(jìn)行了不可用設(shè)置,使其在串口打開的情況下不能選擇。程序如下:第三,更改“關(guān)閉串口”按鈕單擊事件的槽函數(shù)。voidMainWindow::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句。程序如下:第四,更改main.cpp文件。#include<QtGui/QApplication>#inelude<QTextCodec>〃加入頭文件#include"mainwindow.h"intmain(intargc,char*argv[]){QApplicationa(argc,argv);QTextCodec::setCodecForTr(QTextCodec::codecForLocale());〃使程序可處理中文MainWindoww;w.show();returna.exec();}因?yàn)樯厦娴恼Z句中用到了中文,為了能使程序識(shí)別中文,我們需要在主函數(shù)中加入這些語句。程序如下:第五,運(yùn)行程序。打開后程序界面如下。正常發(fā)送1后如下。設(shè)置為“奇校驗(yàn)”后,發(fā)送完1的效果如下圖。到這里,整個(gè)程序就完全寫完了。重要問題說明:(下面所說的第一個(gè)程序是指第一篇文章中寫的那個(gè)程序,第二個(gè)程序是指第三篇文章中那個(gè)程序,第三個(gè)程序是指本篇文章中所寫的程序。)問題一:第一個(gè)程序中structPortSettingsmyComSetting={BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};myCom=newWin_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);這兩句代碼如果換為下面

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論