詳解 Qt 串口通信程序全程圖文 (2)
Qt 串口通信程序全程圖文是本文介紹的內(nèi)容,上一部分中已經(jīng)介紹了實現(xiàn)最簡單的串口接收程序的編寫,下面將對程序內(nèi)容進行分析。
1、首先應(yīng)說明操作串口的流程
步驟一:設(shè)置串口參數(shù),如:波特率,數(shù)據(jù)位,奇偶校驗,停止位,數(shù)據(jù)流控制等。
步驟二:選擇串口,如windows下的串口1為“com1”,Linux下為“ttyS0”等,并打開串口。
步驟三:讀或?qū)懘凇?/p>
步驟四:關(guān)閉串口。
(我們上一個程序沒有寫串口和關(guān)閉串口的功能,打開串口也是在構(gòu)造函數(shù)里完成的,因為那只是為了用最簡單的方法完成串口程序的編寫。在后面我們將會對它進行修改和完善。)
2、下面我們將按照上面的操作串口的流程,講解第一個程序的編寫
第一,我們在寫程序之前,應(yīng)該瀏覽一下那6個文件,大概看一下它們里面都是什么內(nèi)容,各個文件各個類之間有什么聯(lián)系。在win_qextserialport.cpp文件中,我們看它的最后一個構(gòu)造函數(shù),會發(fā)現(xiàn),串口可以在這里進行初始化。
- Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings, QextSerialBase::QueryMode mode) {
- 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();
- }
它共有三個參數(shù),其中第一個參數(shù)const QString & name,應(yīng)該是串口的名字,是QString類型,我們可以用串口1即“com1”,不用過多說明。下面我們主要研究第二個和第三個參數(shù)。
第二,我們查看第二個參數(shù)的位置。
在Qt Creator的菜單中選擇Edit->Find/Replace->All projects,如下圖。
在彈出的對話框中輸入要查找的內(nèi)容PortSettings,如下圖。
點擊Search后,便能在下面顯示出整個工程中所有PortSettings的位置。如下圖。
我們點擊第一條,可以看到在qextserialbase.h文件中有一個struct PortSettings,如下圖。
我們雙擊這一條,進入相應(yīng)的文件。如下圖。
- struct PortSettings
- {
- BaudRateType BaudRate;
- DataBitsType DataBits;
- ParityType Parity;
- StopBitsType StopBits;
- FlowType FlowControl;
- long Timeout_Millisec;
- };
可以看到在這個結(jié)構(gòu)體里定義了串口初始化的各個參數(shù),而對于BaudRateType等類型的定義,我們在這個結(jié)構(gòu)體的上面可以看到,它們是多個枚舉變量。如下圖。
這時我們便應(yīng)該明白了,這個結(jié)構(gòu)體便是實現(xiàn)串口參數(shù)設(shè)置的。
第三,定義串口參數(shù)。
- BaudRateType BaudRate;
波特率設(shè)置,我們設(shè)置為9600,即程序中用BAUD9600;
- DataBitsType DataBits;
數(shù)據(jù)位設(shè)置,我們設(shè)置為8位數(shù)據(jù)位,即DATA_8;
- ParityType Parity;
奇偶校驗設(shè)置,我們設(shè)置為無校驗,即PAR_NONE;
- StopBitsType StopBits;
停止位設(shè)置,我們設(shè)置為1位停止位,即STOP_1;
- FlowType FlowControl;
數(shù)據(jù)流控制設(shè)置,我們設(shè)置為無數(shù)據(jù)流控制,即FLOW_OFF;
- long Timeout_Millisec;
延時設(shè)置,我們設(shè)置為延時500ms,即500;
這樣便寫出了程序中的那句:
- struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};
我們定義了一個結(jié)構(gòu)體變量myComSetting,并對其進行了初始化。
第四,設(shè)置第三個參數(shù)。
我們先按上面的方法找到它的定義位置,在qextserialbase.h中,如下圖。
可以看到查詢模式也是枚舉變量,有兩個選項,我們選擇第二個EventDriven,事件驅(qū)動。
到這里,我們就可以定義Win_QextSerialPort類的變量了,就是那句:
- myCom = new Win_QextSerialPort("com1",myComSetting,QextSerialBase::EventDriven);
它完成了串口的選擇和串口的初始化。
第五,寫打開串口函數(shù)和讀串口函數(shù)。
查看win_qextserialport.h文件,我們會發(fā)現(xiàn)Win_QextSerialPort類繼承自QextSerialBase類。
查看qextserialbase.h文件,我們會發(fā)現(xiàn)QextSerialBase類繼承自QIODevice 類。
我們在Qt的幫助中查看QIODevice 類,如下圖。
其部分內(nèi)容如下圖??梢钥吹狡渲杏衑num OpenModeFlag { NotOpen, ReadOnly, WriteOnly, ReadWrite, ..., Unbuffered },virtual bool open ( OpenMode mode ),QByteArray readAll ()等內(nèi)容。
而下面的信號函數(shù)中有void readyRead ();它可以查看串口是否有新的數(shù)據(jù)傳來。
所以,我們可以用這個類里的這些函數(shù)操作串口。
如程序中的語句:
- myCom ->open(QIODevice::ReadWrite);
- //我們調(diào)用了其中的open函數(shù),用ReadWrite可讀寫的方式進行打開串口,這個open函數(shù)在win_qextserialport.cpp中被重定義了
- connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));
- //我們關(guān)聯(lián)信號readyRead(),和自己寫的槽函數(shù)readMyCom(),當串口有數(shù)據(jù)傳來時進行讀串口操作
- void MainWindow::readMyCom() //自己寫的讀串口函數(shù)
- {
- QByteArray temp = myCom->readAll();
- //我們調(diào)用readAll()函數(shù),讀取串口中所有數(shù)據(jù),在上面可以看到其返回值是QByteArray類型
- ui->textBrowser->insertPlainText(temp);
- //調(diào)用insertPlainText()函數(shù),是窗口上的文本瀏覽器中連續(xù)輸出數(shù)據(jù),而不是每次寫數(shù)據(jù)前都清除以前的
- //數(shù)據(jù),可以在Qt的幫助里查看這個函數(shù)的說明
- }
這樣我們便寫完了所有的語句,最后只需要在mainwindow.h文件中加入相應(yīng)的頭文件,對象聲明,函數(shù)聲明即可。
這里需要說明的是我們一定要學會查看文件和使用幫助文檔,將我們不懂得知識一點一點搞明白。
小結(jié):關(guān)于Qt 串口通信程序全程圖文的內(nèi)容本節(jié)介紹完了,希望本文對你有所幫助,關(guān)于串口的更多內(nèi)容,請關(guān)注編輯推薦。(連載)
【編輯推薦】