由于有關ARM開發(fā)板很多外設都是支持串口通信的,所以在QT下編寫一個串口通信程序就顯得尤為重要。下面將一步一步敘述開發(fā)過程: 下載!?。≡? http://blog.csdn.net/u010535088/article/details/8983374 1、開發(fā)板上設備驅(qū)動位置:/dev下存有各種設備驅(qū)動文件名 2、首先來看一下串口通信幾個關鍵文件: posix_qextserialport.cpp和posix_qextserialport.h文件定義了一個Posix_QextSerialPort類; qextserialbase.cpp和qextserialbase.h文件定義了一個QextSerialBase類 ; qextserialport.cpp和qextserialport.h文件定義了一個QextSerialPort類 。 3、讀取串口方式:Polling(查詢方式)和EventDriven(事件驅(qū)動方式) 此兩種方式在QextSerialBase類的一個枚舉變量QueryMode中定義了。 事件驅(qū)動方式:使用事件處理串口的讀取,一旦有數(shù)據(jù)到來,就會發(fā)出readyRead()信號,在事件驅(qū)動、的方式下,串口的讀寫是異步的,調(diào)用讀寫函數(shù)會立即返回,它們不會凍結調(diào)用線程。 查詢方式:讀寫函數(shù)是同步執(zhí)行的,信號不能工作在這種模式下,而且有些功能也無法實現(xiàn)。需要建立定時器來讀取串口的數(shù)據(jù)。 注意:在Windows下支持以上兩種模式,而在Linux下只支持Polling模式。(poll是linux中的輪尋機制) 4、總結一下: 我們在Qt中使用這個類編寫串口程序,根據(jù)平臺的不同只需要分別使用四個文件。在Linux下是: qextserialbase.cpp和qextserialbase.h 以及posix_qextserialport.cpp和posix_qextserialport.h 在Linux下我們只能使用查詢Polling方式。 工程命名為myCom,Base Class選擇QWidget。 然后將有關Linux下串口配置文件(cpp和h文件)添加到工程里面去: 6、接下來修改下ui界面。如下圖: 7、widget.h文件中進行對象及函數(shù)聲明 。 添加頭文件包含: #include “posix_qextserialport.h”,然后在private中聲明對象:Posix_QextSerialPort *myCom; 聲明私有槽函數(shù): private slots: void on_pushButton_clicked(); //”發(fā)送數(shù)據(jù)”按鈕槽函數(shù) void readMyCom(); //讀取串口 8、widget.cpp在構造函數(shù)添加: myCom = new Posix_QextSerialPort("/dev/ttySAC3",QextSerialBase::Polling); myCom ->open(QIODevice::ReadWrite); //以讀寫方式打開串口 myCom->setBaudRate(BAUD115200); //波特率設置,我們設置為115200 myCom->setDataBits(DATA_8); //數(shù)據(jù)位設置,我們設置為8位數(shù)據(jù)位 myCom->setParity(PAR_NONE); //奇偶校驗設置,我們設置為無校驗 myCom->setStopBits(STOP_1); //停止位設置,我們設置為1位停止位 myCom->setFlowControl(FLOW_OFF); //數(shù)據(jù)流控制設置,我們設置為無數(shù)據(jù)流控制 //myCom->setTimeout(10); 以上是對一個串口的初始化配置信息。 程序?qū)懙竭@里試著編譯一下,解決一下出現(xiàn)的錯誤。 9、回顧一下:程序至此,已完成串口通信的界面設計與串口初始化配置部分。 接下來思考一下:查詢方式(polling:輪詢)的原理? 通過建立一個定時器,定時“詢問”串口是否有信息待讀取。如果有,系統(tǒng)留給串口一定時間來讀取,如果沒有,繼續(xù)“詢問”。 建立一個定時器: readTimer = new QTimer(this); readTimer->start(100); /*開啟定時器,并且每100ms后詢問一次串口。定時的時間一到,馬上產(chǎn)生timeout()信號,繼續(xù)執(zhí)行自定義槽函數(shù)readMyCom() */ connect(readTimer,SIGNAL(timeout()),this,SLOT(readMyCom())); 10、注意:串口初始化中值得注意的一點 myCom->setTimeout(10); 這里的setTimeout()與定時器的timeout()區(qū)別: PC機向ARM通過串口發(fā)送信息時,會有一個“中間存儲器”----即串口緩沖區(qū)。setTimeout()作用是定時讀取數(shù)據(jù)到緩沖區(qū),而timeout()則是定時讀取串口緩沖區(qū)內(nèi)容。setTimeout(ms)里面大小參數(shù)設置原則:越小越好,不過如果pc機一次性發(fā)送的數(shù)據(jù)比較龐大,應該增大參數(shù)大小。 void Widget::readMyCom() //讀取串口數(shù)據(jù)并顯示出來 { QByteArray temp = myCom->readAll(); //讀取串口緩沖區(qū)的所有數(shù)據(jù)給臨時變量temp ui->textBrowser->insertPlainText(temp); //將串口的數(shù)據(jù)顯示在窗口的文本瀏覽器中 } void Widget::on_pushButton_clicked() //發(fā)送數(shù)據(jù) { myCom->write(ui->lineEdit->text().toAscii()); //以ASCII碼形式將數(shù)據(jù)寫入串口 } |
|
來自: 昵稱12843412 > 《QT》