串口如何稳定接收数据(转帖)
-
What is release build performance?
Did you test release build? -
append过于频繁导致控件频繁重绘,UI的事件响应循环被阻塞,程序卡死。
试试这样做:
加长缓存深度,使append的间隔至少20ms,还可以用定时器按固定时间间隔将缓存中的数据append入控件。一定要记得在append时使用资源互斥锁保护你正在读的数据;如果有丢数现象发生,则需要考虑使用双缓冲区执行乒乓处理来避免。 -
hi Vincent007
1.I have done a test release version using append fast.no problem。
2. but I don’t like to use append, because append broken the original data format, especially the received data is Chinese。The original format:
你好!
我很认真,但是很失望。一直再等待。
If you use the append may become the following format:
你好!
我很认真,
但是很失望。
一直再等待。
Thank you for your reply -
JohnYork
你好,其实append速度是很快的,我测试过,没有问题的,但是它有一个问题就是打破数据的格式(数据自动换行),比如:
你好!
我很认真,但是很失望。一直再等待。这这2句话,我很认真,但是很失望两者如果不是在同一帧接收过来的,就会变成
我很认真
但是很失望。自动换行变成2句话。
。
我的目标是做成AccessPort串口调试工具,我说的这些问题AccessPort几乎不存在。
等半小时我把代码上传上来。让大家看看怎么解决。
谢谢JohnYork你的回答。 -
JohnYork
你好
1.其实append速度是很快的,我测试过是没有问题的。但是它有一个问题就是自动换行。
比如:我很认真,但是很失望。一直再等待。
这句话如果不是在一帧中接收过来的会变成如下格式:
我很认真,
但是很失望。
一直再等待。
我是希望做成AccessPort这个串口调试工具一样的接收功能。很厉害的这个软件,尤其是在高速接收数据上,性能很优越。
过半小时把代码上传上来,让你们看看,谢谢你的回答。 -
hi Vincent007,JohnYork
我已经把代码上传到如下链接,同时里面有一个测试视频,qt5.3.1 mingw编译的
http://pan.baidu.com/s/1kTh0ifd
。
谢谢你们的讨论。 -
hi Vincent007,JohnYork
你们是否看到代码?有问题吗?,有问题请留言谢谢. -
試把
@
connect(
&m_Portconfigview,SIGNAL(signalConfigPort(const SPortsettings *)),&m_Serialportrecevie,SLOT(slotsConfigPort(const SPortsettings *)),Qt::QueuedConnection);
connect(
&m_Portconfigview,SIGNAL(signalConfigPort(const SPortsettings *)),this,SLOT(updatetstatus(const SPortsettings *)));
connect(
&m_Serialportrecevie,SIGNAL(signalThreadToStore( const QByteArray&)),&m_Serialportcachedata,SLOT(slotsSerialportcachedata(const QByteArray&)),Qt::BlockingQueuedConnection);
connect(
&m_Serialportcachedata,SIGNAL(signalToserialportwindow(const QByteArray&)),&m_pSerialPortWindow,SLOT(slotsserialportupdateview(const QByteArray&)),Qt::BlockingQueuedConnection);
@
改成
@
connect(
&m_Portconfigview,SIGNAL(signalConfigPort(const SPortsettings *)),&m_Serialportrecevie,SLOT(slotsConfigPort(const SPortsettings *)));
connect(
&m_Portconfigview,SIGNAL(signalConfigPort(const SPortsettings *)),this,SLOT(updatetstatus(const SPortsettings *)));
connect(
&m_Serialportrecevie,SIGNAL(signalThreadToStore( const QByteArray&)),&m_Serialportcachedata,SLOT(slotsSerialportcachedata(const QByteArray&)));
connect(
&m_Serialportcachedata,SIGNAL(signalToserialportwindow(const QByteArray&)),&m_pSerialPortWindow,SLOT(slotsserialportupdateview(const QByteArray&)));
@ -
hi Vincent007
我已经按照你说的进行测试,还是会卡住界面。谢谢。 -
Did you test release build?
-
hi Vincent007
1.我是用的release build。谢谢。
2.我看过java c# vc++写的类似串口调试助手都没有类似问题,qt版本网上所有的串口调试助手和qt官网自带的demo都有类似的问题。是不是qt控件本身的一个bug. -
measure time consumed by slotsSerialportcachedata and slotsserialportupdateview via QElapsedTimer
另外你要確保你的PC 沒有問題.你有否在另一台PC試過你的程序?
@
QElapsedTimer timer;
timer.start();
slowOperation1();
qDebug() << "The slow operation took" << timer.nsecsElapsed() << "nanoseconds";
@ -
HI Vincent007
前阵子忙别的去,所以今天才回复你,不好意思按照你说的用以下代码进行测试
timer.start();
pSerialPortQPlainTextEdit.insertPlainText(DatatFormRead);
pSerialPortQPlainTextEdit.moveCursor(QTextCursor::End, QTextCursor::KeepAnchor);
qDebug() << "The slow operation took" << timer.nsecsElapsed() <<"nanoseconds";
下面是测试结果:
The slow operation took 1017500 nanoseconds
The slow operation took 1018310 nanoseconds
The slow operation took 1421502 nanoseconds
The slow operation took 1186476 nanosecondsThe slow operation took 10685984 nanoseconds
The slow operation took 10668154 nanoseconds
The slow operation took 10564419 nanoseconds
The slow operation took 10569686 nanoseconds
The slow operation took 10243486 nanoseconds
The slow operation took 10473245 nanoseconds
The slow operation took 10746766 nanoseconds
The slow operation took 10772700 nanoseconds
The slow operation took 10583059 nanoseconds
The slow operation took 11221681 nanoseconds
The slow operation took 10795798 nanoseconds
The slow operation took 16827051 nanosecondsThe slow operation took 222369451 nanoseconds
The slow operation took 205003460 nanoseconds
The slow operation took 222164411 nanoseconds
The slow operation took 204823949 nanoseconds
The slow operation took 209414655 nanoseconds
The slow operation took 186572559 nanoseconds
The slow operation took 209589304 nanoseconds
The slow operation took 214433676 nanoseconds
The slow operation took 219041401 nanoseconds
说明qt的窗口刷新确实有问题,请指教谢谢。 -
@
#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
_timer.setInterval(10);for(int i = 0; i<1024;i++) { message += "1"; } connect(&_timer,&QTimer::timeout,this,&MainWindow::updateText); _timer.start();
}
MainWindow::~MainWindow()
{
delete ui;
}void MainWindow::updateText()
{
ui->textEdit->append(message);
}
@
I did a simple application and test it. It works fine.
You can try it and adjust parameters. -
HI Vincent007
我以前测试过调用append是没有问题的,建议你改成ui->textEdit->insertPlainText(message);试试。
因为我不能使用append,改成append会有这么一个问题
一句完整的话分2次发送过来就变成2行,比如:
“你好,谢谢你回答我的问题”。
分两次之后,有可能变成
“你好,”
“谢谢你回答我的问题” -
我发现MFC写的程序,会将多余的数据存储到硬盘,我用10ms的间隔,发送"hello",MFC占用内存一直变化不大,但是QT却会随着时间增大,接收的数据一旦超过一屏能显示的量的话,马上就会变卡,是不是那个人写得换行代码的逻辑非常复杂低效果呢
-
我发现MFC写的程序,会将多余的数据存储到硬盘,我用10ms的间隔,发送"hello",MFC占用内存一直变化不大,但是QT却会随着时间增大,接收的数据一旦超过一屏能显示的量的话,马上就会变卡,是不是那个人写得换行代码的逻辑非常复杂低效果呢
-
从2012到现在一直没什么改变
-
从2012到现在一直没什么改变
-
HI blackRock blackRock
我也发现这个问题,但是不知道你是否遇到我类似的问题。