我想實作的功能是從串口采集資料,并處理判斷,如果資料(比如溫度值)大于某個范圍,就報警提示。其中資料采集和報警定義了兩個執行緒,資料處理和顯示是主執行緒。 資料采集執行緒功能是采集資料,采集一個包后發射一個信號,通知主執行緒處理判斷和顯示,同時主執行緒啟動報警執行緒,如果采集值過大,就報警(使用madplay,用AV97播放音樂)。 示意代碼如下 main函式:RecvThread *m_recvthread; int main(int argc, char *argv[]){ QApplication app(argc, argv); papp = & app; m_recvthread = new RecvThread(); // 資料采集執行緒(串口接收) m_recvthread->start(); FunctionList dlg; //主界面 dlg.show(); return app.exec();}functionlist.cpp RecvThread::RecvThread() { fd=-1; }void RecvThread::run() { comm(); //打開串口 while(true) { read(fd,comm_str,25); if(comm_str[24]==126) emit sendData( ); //資料包結束發射信號 } } FunctionList::FunctionList() { connect(m_recvthread,SIGNAL(sendData( )),this,SLOT(receiveData( ))); 信號槽} void FunctionList::receiveData() { AlarmThread *thread = new AlarmThread();//定義報警執行緒 temperature = (comm_str1[11]);//需要的資料 thread->start();//報警執行緒開始} AlarmThread::AlarmThread() //報警執行緒 { }void AlarmThread::run() { QProcess proc ; 采用QProcess的方法,呼叫外部程式madplay發聲音樂 QString program="/Qtopia/demo/bin/madplay"; QStringList filename1; filename1<<"/mnt/yaffs/1.mp3"; if(temperature>20) proc.start(program,filename1); proc.waitForFinished(); }現在的問題是,我連續向串口發射表示高溫的資料,開始七八次左右,是可以報警的,正常播放音樂。但是繼續發送高溫資料后,整個程式就死了,當機了。不知道為什么? 自己思考可能有兩種可能: 1:報警執行緒的問題,報警執行緒沒有像資料接收執行緒一樣在main函式開始,而是在主執行緒的槽函式開始,導致,串口每次接收資料啟動槽函式就啟動一次這個執行緒,導致多個執行緒同時啟動。2:qprocess的問題,每次呼叫,qprocess都沒有結束,結果多個proc在同時運行,耗盡了開發板資源。 但是還是不會解決。哪位能幫忙思考一下,一個問題然了很久了。
uj5u.com熱心網友回復:
代碼貼成這樣,誰給你看才怪轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/251206.html
標籤:其他技術討論專區
