我想实现的功能是从串口采集数据,并处理判断,如果数据(比如温度值)大于某个范围,就报警提示。
其中数据采集和报警定义了两个线程,数据处理和显示是主线程。
数据采集线程功能是采集数据,采集一个包后发射一个信号,通知主线程处理判断和显示,同时主线程启动报警线程,如果采集值过大,就报警(使用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在同时运行,耗尽了开发板资源。
但是还是不会解决。哪位能帮忙思考一下,一个问题然了很久了。