① 如何在QT中讀取串口數據
一、文件下載
文件下載地址:
也可以下載我上傳到網盤上的:
二、文件內容介紹
1.下載到的文件為qextserialport-1.2win-alpha ,解壓並打開後其內容如下。
(點擊圖片可以查看清晰大圖)
下面分別介紹:
(1)doc文件夾中的文件內容是QextSerialPort類和QextBaseType的簡單的說明,我們可以使用記事本程序將它們打開。
(2)examples文件夾中是幾個例子程序,可以看一下它的源碼,不過想運行它們好像會出很多問題啊。
(3)html文件夾中是QextSerialPort類的使用文檔。
(4)然後就是剩下的幾個文件了。其中qextserialenumerator.cpp及qextserialenumerator.h文件中定
義的QextSerialEnumerator類是用來獲取平台上可用的串口信息的。不過,這個類好像並不怎麼好用,而且它不是我們關注的重點,所以下面
就不再介紹它了。
(5)qextserialbase.cpp和qextserialbase.h文件定義了一個QextSerialBase
類,win_qextserialport.cpp和win_qextserialport.h文件定義了一個Win_QextSerialPort
類,posix_qextserialport.cpp和posix_qextserialport.h文件定義了一個
Posix_QextSerialPort類,qextserialport.cpp和qextserialport.h文件定義了一個
QextSerialPort類。這個QextSerialPort類就是我們上面所說的那個,它是所有這些類的子類,是最高的抽象,它屏蔽了平台特徵,
使得在任何平台上都可以使用它。
2.幾個類的簡單介紹。
下面是這幾個類的關系圖。
可以看到它們都繼承自QIODevice類,所以該類的一些函數我們也可以直接來使用。圖中還有一個QextBaseType類,其實它只是一個標
識,沒有具體的內容,它用來表示Win_QextSerialPort或Posix_QextSerialPort
中的一個類,因為在QextSerialPort類中使用了條件編譯,所以QextSerialPort類既可以繼承自
Win_QextSerialPort類,也可以繼承自Posix_QextSerialPort類,所以使用了QextBaseType來表示。這一點
我們可以在qextserialport.h文件中看到。再說QextSerialPort類,其實它只是為了方便程序的跨平台編譯,使用它可以在不同的
平台上,根據不同的條件編譯繼承不同的類。所以它只是一個抽象,提供了幾個構造函數而已,並沒有具體的內容。在qextserialport.h文件中的
條件編譯內容如下:
#ifdef_TTY_POSIX_
#include「posix_qextserialport.h」
#define QextBaseTypePosix_QextSerialPort
#else
#include「win_qextserialport.h」
#define QextBaseTypeWin_QextSerialPort
#endif
所以,其實我們沒有必要使用這個類,直接使用Win_QextSerialPort或Posix_QextSerialPort就可以了。當然如果
你想使用這個類,實現同樣的源程序可以直接在Windows和Linux下編譯運行,那麼一定要注意在Linux下這里需要添加
#define _TTY_POSIX_ 。而我們這里為了使得程序更明了,所以沒有使用該類,下面也就不再介紹它了。
QextSerialBase類繼承自QIODevice類,它提供了操作串口所必需的一些變數和函數等,而
Win_QextSerialPort和Posix_QextSerialPort均繼承自QextSerialBase
類,Win_QextSerialPort類添加了Windows平台下操作串口的一些功能,Posix_QextSerialPort類添加了
Linux平台下操作串口的一些功能。所以說,在Windows下我們使用Win_QextSerialPort類,在Linux下我們使用
Posix_QextSerialPort類。
3.在QextSerialBase類中還涉及到了一個枚舉變數QueryMode。
它有兩個值Polling和EventDriven
。QueryMode指的是讀取串口的方式,下面我們稱為查詢模式,我們將Polling稱為查詢方式Polling,將EventDriven稱為事件驅動方式。
事件驅動方式EventDriven就是使用事件處理串口的讀取,一旦有數據到來,就會發出readyRead()信號,我們可以關聯該信號來讀取串口的數據。在事件驅動的方式下,串口的讀寫是非同步的,調用讀寫函數會立即返回,它們不會凍結調用線程。
而查詢方式Polling則不同,讀寫函數是同步執行的,信號不能工作在這種模式下,而且有些功能也無法實現。但是這種模式下的開銷較小。我們需要自己建立定時器來讀取串口的數據。
在Windows下支持以上兩種模式,而在Linux下只支持Polling模式。
三、小結。
這里講了這么多,最後要說的只是,我們在Qt中使用這個類編寫串口程序,根據平台的不同只需要分別使用四個文件。
② Qt串口占滿一個內核
需要在一個計算機盒子上編寫一個串口程序。
計算機盒子配置很差,內存CPU都比較差。然而硬體發送的數據有1000萬個位元組,波特率115200,發送頻率小於1ms。可以設置一個data[10000000]的數組,將收到的所有數據存到緩存里,隨時調用。
此外,接收用的數組可以用QByteArray。接收可以用單獨的線程來做。ui主線程可以用個TextBrower控制項,可以累計到一定的數據量一插入,可以是循環的話可以使用qApp->processEvents(),防止卡界面。
③ qt串口發送緩沖區設置
IPv4 數據報最大大小是65535(16位),包括IPv4頭部。
IPv6 數據報最大大小是65575,包括40個位元組的IPv4頭部
MTU,這是由硬體規定的,如乙太網的MTU是1500位元組,IPv4要求最小MTU是68位元組,IPv6要求最小MTU是576位元組
path MTU: 指兩台主機間的路徑上最小MTU
分片(fragmentation):指ip數據報大小超過相應鏈路的MTU,IPv4和IPv6都將對ip數據進行分片,到達目的主機後進行重組。
IPv4頭部的DF位用於設置分片還是不分片
MSS:最大分節大小,向對方TCP通告被通告方在每個分節中能發送的最大TCP數據量。MSS的目的是告訴對方其重組緩沖區大小的實際值,從而避免分片。
④ qt程序關閉後串口被佔用
解決方法是:
1、主窗口打開子窗口後,在子窗口打開串口後直接點擊關閉窗口。
2、會出現串口被佔用的BUG,重寫關閉窗口按鈕即可解決。
⑤ qt串口接收的數據textedit中顯示
連接串口時綁定信號和槽。
為了能在接收到串口發送的數據便即時顯示在文本框中,首先要在連接串口時綁定信號和槽,即將serialport的signal(QIODevice::readyRead)與this的槽函數SePort::ReadCom連接在一起,這樣,一旦serialport的准備讀取數據信號過來時,就會調用自定義的ReadCom函數,把緩存區的數據讀取到私有成員變數m_bReceiveData中。為了能在界面上顯示,我們將暴露一個介面GetUsePort()以便於上層函數獲得使用的串口serialport,然後自定義函數ShowData()將讀取的數據實時顯示在串口中。
Qt是一個1991年由QtCompany開發的跨平台C++圖形用戶界面應用程序開發框架。它既可以開發GUI程序,也可用於開發非GUI程序,比如控制台工具和伺服器。Qt是面向對象的框架,使用特殊的代碼生成擴展(稱為元對象編譯器(MetaObjectCompiler,moc))以及一些宏,Qt很容易擴展,並且允許真正地組件編程。
⑥ qt串口編程清空緩存
又一個 clear()成員
⑦ qt 同時打開兩個串口只有一個串口工作,求指點
串口共享,即兩個同時可以 操作而不關 國外有這軟體。而且很貴。一個授權要100$ 能這貴,我估計裡面不是一兩個代碼能實現的。 串口監聽 可以只讀串口數據 不影響主程序工作。國內有的2000.你自己搜尋
⑧ 新手求助,QT5的qserialport串口操作,接收的數據不完整
發送的數據不能夠太長,超過串口收發緩沖區長度,其他的都會丟棄的。
⑨ QT串口數據處理:用QT編寫的上位機從下位機接受很多數據,如何才能從這些數據中跳出我想要的
Qt 4:
第三方串口介面類;
Win_QextSerialPort *myCom;
數據: QByteArray temp = myCom->readAll();
長度:temp.length();
Qt 5:
QSerialPort *my_serialport= new QSerialPort;
讀取數據: QByteArray xxx = my_serialport->readAll();
長度: xx.size();
數據: xx.data();
至於說怎麼保存到不同的 QString 這就是解析的問題,你可以隨意發揮,反正就是將你得到的數據進行識別、類型轉換、存儲而已。
⑩ 我在Qt里寫一個向串口寫數據的程序,但是提示QIODevice::write: device not open,不知道怎麼解決!
是伺服器的埠沒有打開。
1、首先pro文件配置:Qt網路功能需要在pro文件增加網路庫。
注意事項:
int main()
{
Py_Initialize(); // 初始化// 將Python工作路徑切換到待調用模塊所在目錄,一定要保證路徑名的正確性string chdir_cmd = string("sys.path.append('/xxxxxxx/')");
// 載入模塊PyObject* moleName = PyString_FromString("xx"); //模塊名,不是文件名PyObject* pMole = PyImport_Import(moleName);
// 載入函數PyObject* pv = PyObject_GetAttrString(pMole, "xxx");// 調用函數PyObject* pRet = PyObject_CallObject(pv, xxx);