• 8095阅读
  • 14回复

[提问]如何在串口通信软件中根据接收到的字符开启定时器? [复制链接]

上一主题 下一主题
 
只看楼主 倒序阅读 楼主  发表于: 2012-12-26
关键词: 求助QT4串口
我是打算接收到START来开启定时器,但是接受其它的代码都没事,一发送START接异常退出,有哪位知道怎么回事吗?谢谢了!!
void MainWindow::readMyCom()
{
    QString temp = myCom->readAll();
  ui->dispData->insertPlainText(temp);
    if(temp.compare("START") == 0)
    {
        timer->start(1000);
    }
}
离线uidab

只看该作者 1楼 发表于: 2012-12-26
回 楼主(深度潜水者) 的帖子
换个比较方式试一下。
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线0354030w

只看该作者 2楼 发表于: 2012-12-26
timer的定义和设置是不是出了问题?
只看该作者 3楼 发表于: 2012-12-26
回 1楼(uidab) 的帖子
发送START时程序是分次接受的,所以不能比较,但是我发送一个字母时,两者比较不是0.
void MainWindow::readMyCom()
{
//    QByteArray temp = myCom->readAll();
    QString temp = myCom->readAll();

    ui->dispData->insertPlainText(temp);
    int x = QString::compare(temp,"S/n");
//    ui->runTime_lineEdit->setText(x);
    qDebug()<<"wai";
    qDebug()<<temp;
    qDebug()<<x;
    if(x == -2)
    {
        qDebug()<<"limian";
//        ui->runTime_lineEdit->setText("10");
        timer->start(1000);
    }
}
下面是程序输出
wai
"S"
-2
limian
程序异常终止。
只看该作者 4楼 发表于: 2012-12-26
回 2楼(0354030w) 的帖子
把timer->start(1000);放到构造函数中没问题,但是放到子函数中就异常退出。
在线realfan

只看该作者 5楼 发表于: 2012-12-26
我怀疑是线程问题。如果timer是主线程中的对象,而readMyCom()是运行在子线程中,则start会为timer创建子对象。
在子线程中,给主线程中的对象创建子对象是不允许的。

这个原因是我猜测的,没有研究源代码。将timer->start()换成发个信号,在槽中再调用timer->start()。
connect(this, SIGNAL(sigStartTimer()), this, SLOT(slotStartTimer()) );

void MainWindow::readMyCom()
{
    QString temp = myCom->readAll();
    ui->dispData->insertPlainText(temp);
    if(temp.compare("START") == 0)
    {
         emit sigStartTimer();
    }
}
void MainWindow::slotStartTimer()
{
    timer->start();
}
试一下这个还出不出错
只看该作者 6楼 发表于: 2012-12-27
回 5楼(realfan) 的帖子
谢谢你的回复,我已经根据修改了实现思路了。我的程序就是单线程的,用一个按钮控制定时器的启动和停止是没有问题的,但是根据这个反馈来启动定时器不行。
在线realfan

只看该作者 7楼 发表于: 2012-12-27
回 6楼(深度潜水者) 的帖子
有些类,会自动开启线程的。比如串口通讯类qextserialport,如果是事件驱动方式,在open时,会开启个线程。
所以,说你的程序是单线程,不一定准确
离线200300969

只看该作者 8楼 发表于: 2013-01-15
回 6楼(深度潜水者) 的帖子
请问是如何比较的?能给看看代码不……我这比较不出来……
离线z55716368

只看该作者 9楼 发表于: 2015-06-19
回 realfan 的帖子
realfan:我怀疑是线程问题。如果timer是主线程中的对象,而readMyCom()是运行在子线程中,则start会为timer创建子对象。
在子线程中,给主线程中的对象创建子对象是不允许的。
这个原因是我猜测的,没有研究源代码。将timer->start()换成发个信号,在槽中再调用timer->start()。
c .. (2012-12-26 20:36) 

版主大神你好,在公司实习,现在跟着做项目,负责串口通信这块。按照需求封装了QSerialPort的open、close、read、write4个功能函数。我们的功能是在界面的主线程(我不知道是不是主线程,是自己run的一个,当界面打开在通信层中)会自动发送命令,不停向串口写入数据,串口是在创建线程的时候new的,然后串口打开返回true并且write会返回正确的长度,但是用串口工具查看,数据并没有发出去,只是写进去了。这个是怎么回事呢,有这样一个提示
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QSerialPort(0x1d76a350), parent's thread is QThread(0x1d69df20), current thread is CAutoCmdThread(0x1d727958)
因为才开始搞Qt以及串口,感觉压力好大,希望大神帮忙看看
每一个问题 都是一次进步
在线realfan

只看该作者 10楼 发表于: 2015-06-20
回 z55716368 的帖子
z55716368:版主大神你好,在公司实习,现在跟着做项目,负责串口通信这块。按照需求封装了QSerialPort的open、close、read、write4个功能函数。我们的功能是在界面的主线程(我不知道是不是主线程,是自己run的一个,当界面打开在通信层中)会自动发送命令,不停向串口写入数据,串口是在创 .. (2015-06-19 16:22) 

http://www.qtcn.org/bbs/read-htm-tid-58308.html
以前写的,供你参考一下
离线z55716368

只看该作者 11楼 发表于: 2015-06-21
回 realfan 的帖子
realfan:http://www.qtcn.org/bbs/read-htm-tid-58308.html
以前写的,供你参考一下 (2015-06-20 00:09) 

谢谢 我想问问 你这个我可以跟以前网上的第三方类的区别主要是你这个可以跨线程?
每一个问题 都是一次进步
离线z55716368

只看该作者 12楼 发表于: 2015-06-22
回 realfan 的帖子
realfan:http://www.qtcn.org/bbs/read-htm-tid-58308.html
以前写的,供你参考一下 (2015-06-20 00:09) 

大神,有一个问题,我在使用你的void sigDataReady(QByteArray)信号的时候,只能够接收到一部分返回的数据,请问要怎么处理才能把数据接收完?
我先在我的构造函数里面new了这个MySerialPort对象,然后在程序中使用线程进行发包和解包,是不是因为我发包和解包都在同一个线程所以有问题?
希望能解答一下,这方面知识确实听匮乏的,打扰了
每一个问题 都是一次进步
在线realfan

只看该作者 13楼 发表于: 2015-06-23
回 z55716368 的帖子
z55716368:大神,有一个问题,我在使用你的void sigDataReady(QByteArray)信号的时候,只能够接收到一部分返回的数据,请问要怎么处理才能把数据接收完?
我先在我的构造函数里面new了这个MySerialPort对象,然后在程序中使用线程进行发包和解包,是不是因为我发包和解包都在同一个线程所以 .. (2015-06-22 10:07) 

数据有可能分多包传送,收到一包,判断一下是否接收完毕,没完毕,就缓存起来,等下一包,直到完毕,再处理。
离线z55716368

只看该作者 14楼 发表于: 2015-06-23
回 realfan 的帖子
realfan:数据有可能分多包传送,收到一包,判断一下是否接收完毕,没完毕,就缓存起来,等下一包,直到完毕,再处理。 (2015-06-23 08:45) 

因为我只负责上层解包、封包,然后封装了串口,其他的都是别人写的,接收到串口数据首先给协议层解一次在传给我,感觉我们的分工有问题、、、现在叫我来调试通信,感觉好困难。十分感谢你的回答,慢慢进步吧。
每一个问题 都是一次进步
快速回复
限100 字节
 
上一个 下一个