Qt串口持續輸入資料,上位機接收端未響應問題

來源:互聯網
上載者:User

同時在論壇版提問:http://topic.csdn.net/u/20120415/18/85ca116a-cb4e-4cc7-9e1f-9bf34531ff01.html

此Qt串口接收程式需要做的工作是:從開發板上不斷地傳輸過來帶有“Star”幀頭的資料幀,資料是浮點型資料。要求顯示的時候也是將浮點數顯示出來。我採用的是Polling查詢機制,不是EventDriven機制,在textBrowser裡面想先顯示出除了”Star”幀的資料,先是用十六進位數表示出來。

現在我遇到的問題是:

當我開啟上位機串口,並且開啟開發板的電源,進行串口資料轉送時候,Qt程式會出現未響應,只能把開發板電源關掉等待一會,textBrowser上面就會出現資料,此時的資料只是能看出第一次發送的時候會把“Star”去掉只顯示出後面的資料,一所示。

需要幫忙解決的問題是:

1.用Qt寫串口程式時候,在利用Polling機制時,面對不斷讀取的串口資料,如何讓textBrowser一直輸出資料而不出現程式未響應的情況?

2.接圖一,除了第一個程式能夠去掉“Star”幀頭外,如何讓以後的幀傳過來時候都可以去掉“Star”幀頭,從而只是顯示後面的資料。

 

另附上我的主要實現代碼:

//**************mainwindow.h*********************//#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QString>#include<QStandardItemModel>#include"win_qextserialport.h"namespaceUi{    classMainWindow;}classMainWindow:publicQMainWindow{    Q_OBJECTpublic:    explicitMainWindow(QWidget*parent=0);    ~MainWindow();private:    Ui::MainWindow*ui;    Win_QextSerialPort*myCom;    QTimer*myReadTimer;            //採用polling查詢的方式進行privateslots:    voidreadMyCom();    voidon_openMyComBtn_clicked();    voidon_closeMyComBtn_clicked();};#endif//MAINWINDOW_H 

 

//***********mainwindow.cpp***************//#include"mainwindow.h"#include"ui_mainwindow.h"#include<QMessageBox>MainWindow::MainWindow(QWidget*parent):    QMainWindow(parent),    ui(newUi::MainWindow){    ui->setupUi(this);    ui->closeMyComBtn->setEnabled(false);    setWindowTitle(tr("串口調試主介面_P1")); } MainWindow::~MainWindow(){    deleteui;}  voidMainWindow::readMyCom(){    //個人想法:先讓其在文字框中全部輸出字串下,串口傳的是標準ASCII值,然後如果直接顯示的時候,又把它轉成字串形式    //由於有的ASCII值轉換成字串後不能在螢幕上直接顯示,所以會出現卡死程式情況,停止傳輸後就只輸出Star字元    //因此需要先把串口裡面的ASCII值轉換成十六進位數,然後再將其轉換成浮點數,分別顯示在表格裡面  --CommentByDream_Fly    QStringtemp='\0';    QStringstrHex;//16進位資料    QByteArraydataAll=myCom->readAll();    intrflag=0;    if(!dataAll.isEmpty())    {        QDataStreamout(&dataAll,QIODevice::ReadWrite);        //下面是判斷幀頭“Star”,不知道如何直接讀入4個位元組的字串Star,然後直接判斷??        if(!out.atEnd())        {            qint8judge1=0;            out>>judge1;            if(judge1==83)            {                qint8judge2=0;                out>>judge2;                if(judge2==116)                {                    qint8judge3=0;                    out>>judge3;                    if(judge3==97)                    {                        qint8judge4=0;                        out>>judge4;                        if(judge4==114)                        rflag=1;                     }                }             }             else                rflag=0;             if(rflag)             {                 while(!out.atEnd())                 {                     qint8outChar=0;                     out>>outChar;                     QStringstr1=QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));//轉換成十六進位數_Dream_Fly                     if(str1.length()>1)                     {                        strHex+=str1+"";                     }                     else                     {                        strHex+="0"+str1+"";                     }                 }             }        }        ui->textBrowser->append(strHex.toUpper());    }} //開啟串口的訊號與槽自動關聯函數voidMainWindow::on_openMyComBtn_clicked(){    QStringportName=ui->portNameComboBox->currentText();//擷取串口名    myCom=newWin_QextSerialPort(portName,QextSerialBase::Polling);    //定義串口對象,並傳遞參數,在建構函式裡對其進行初始化    myCom->open(QIODevice::ReadWrite);  //注意:得要先開啟串口,然後再設定串口的參數,不然設定無效!!!    myCom->flush();//存入緩衝區內待讀取    //設定傳輸速率    if(ui->baudRateComboBox->currentText()==tr("9600"))   //根據組合框內容對串口進行設定       myCom->setBaudRate(BAUD9600);    elseif(ui->baudRateComboBox->currentText()==tr("115200"))       myCom->setBaudRate(BAUD115200);    //設定資料位元    if(ui->dataBitsComboBox->currentText()==tr("8"))        myCom->setDataBits(DATA_8);    elseif(ui->dataBitsComboBox->currentText()==tr("7"))       myCom->setDataBits(DATA_7);    //設定同位    if(ui->parityComboBox->currentText()==tr("無"))       myCom->setParity(PAR_NONE);    elseif(ui->parityComboBox->currentText()==tr("奇數同位"))       myCom->setParity(PAR_ODD);    elseif(ui->parityComboBox->currentText()==tr("偶校正"))       myCom->setParity(PAR_EVEN);    //設定停止位    if(ui->stopBitsComboBox->currentText()==tr("1"))       myCom->setStopBits(STOP_1);    elseif(ui->stopBitsComboBox->currentText()==tr("2"))       myCom->setStopBits(STOP_2);    myCom->setFlowControl(FLOW_OFF);//設定資料流控制,我們使用無資料流的預設設定    myCom->setTimeout(10);//設定延時      --Modify改小點    myReadTimer=newQTimer(this);    myReadTimer->setInterval(200);    connect(myReadTimer,SIGNAL(timeout()),this,SLOT(readMyCom()));    this->myReadTimer->start();         //開始poll查詢操作   //connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom()));  //不採用事件Event的方式,採用Polling方式    ui->openMyComBtn->setEnabled(false);    ui->closeMyComBtn->setEnabled(true);    ui->helpBtn->setEnabled(true);    ui->portNameComboBox->setEnabled(false);    ui->baudRateComboBox->setEnabled(false);    ui->dataBitsComboBox->setEnabled(false);    ui->stopBitsComboBox->setEnabled(false);    ui->parityComboBox->setEnabled(false);    ui->displayBtn->setEnabled(true);    ui->debugBtn->setEnabled(true);}voidMainWindow::on_closeMyComBtn_clicked(){    myCom->close();    this->myReadTimer->stop();          //關閉poll操作    ui->openMyComBtn->setEnabled(true);    ui->helpBtn->setEnabled(true);    ui->portNameComboBox->setEnabled(true);    ui->baudRateComboBox->setEnabled(true);    ui->dataBitsComboBox->setEnabled(true);    ui->stopBitsComboBox->setEnabled(true);    ui->parityComboBox->setEnabled(true);}voidMainWindow::on_helpBtn_clicked(){    QMessageBox::about(this,tr("協助資訊"),tr("1.選定好具體串口設定,點擊開啟串口即可收到資訊"));}  

//***************main.cpp************//#include<QtGui/QApplication>#include<QTextCodec>       //加入標頭檔#include"mainwindow.h"intmain(intargc,char*argv[]){    QApplicationa(argc,argv);    QTextCodec::setCodecForTr(QTextCodec::codecForLocale());    //使程式可處理中文    MainWindoww;    w.show();    returna.exec();} 


Qt串口資料這裡的問題困擾我幾天了,希望能夠幫忙解決下,不勝感激。

原創文章,歡迎轉載,轉載請註明:blog.csdn.net/jjzhoujun2010

作者:Dream Fly

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.