乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Linux下基于QT的串口通信程序(Tiny6410)( 轉(zhuǎn))

       昵稱12843412 2013-06-20

      由于有關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方式。

      5、下面開始建立一個基本QT工程:
      工程命名為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ù)大小。

      11、經(jīng)過上述講解,大家應該知道了串口通信最核心的部分。下面將程序的兩個自定義槽函數(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ù)寫入串口
      }

      12、到這里一個基本的串口工程就建立完成了?。?!


        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多