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