• 1415阅读
  • 15回复

Qt串口问题 [复制链接]

上一主题 下一主题
离线winston_zbb
 

只看楼主 倒序阅读 楼主  发表于: 2020-12-25
各位老师,使用QT编写与仪表串口通讯,每隔10ms读写数据。但是联网的时候,每当刷新网页完成,串口会中断,什么原因?有什么解决办法么?
程序代码:
    serial = new QSerialPort();    connect(timer,SIGNAL(timeout()),this,SLOT(custom_timeout()));    connect(serial,SIGNAL(errorOccurred(QSerialPort::SerialPortError)),this,SLOT(custom_error(QSerialPort::SerialPortError)));    timer->start(1);    serial->setPortName("COM5");    serial->setBaudRate(115200);    serial->setDataBits(QSerialPort::Data8);    serial->setStopBits(QSerialPort::OneStop);    serial->setFlowControl(QSerialPort::NoFlowControl);    serial->setParity(QSerialPort::EvenParity);
    if(!serial->isOpen())    {        if(serial->open(QIODevice::ReadWrite))        {            ui->textEdit->append("1");            //emit meterConStatus(true);        }        else        {          ui->textEdit->append("2");            // emit meterConStatus(false);        }    }    else        ui->textEdit->append("3");
利用定时器QTimer 每10ms ,向串口发送数据
结果:
     每当刷新网页,串口中断
在线liudianwu

只看该作者 1楼 发表于: 2020-12-26
刷新网页是怎么回事?你不是串口通信吗?
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:951393302(新群,之前所有群全部满员)
离线九重水

只看该作者 2楼 发表于: 2020-12-26
代码真乱……
麻烦楼主清晰地再讲一遍遇到的问题。

另外问一下楼上的,上海房租多少钱一般,一房一厅或单间,单身汉住的那种。 @liudianwu  
本帖提到的人: @liudianwu
在线liudianwu

只看该作者 3楼 发表于: 2020-12-27
回 九重水 的帖子
九重水:代码真乱……
麻烦楼主清晰地再讲一遍遇到的问题。 [表情]
另外问一下楼上的,上海房租多少钱一般,一房一厅或单间,单身汉住的那种。[表情] @liudianwu     (2020-12-26 10:17) 

你住不起
本帖提到的人: @liudianwu
专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!你正好需要,我正好专业!QQ:517216493 微信:feiyangqingyun Email:feiyangqingyun@163.com
群号:951393302(新群,之前所有群全部满员)
离线fsu0413

只看该作者 4楼 发表于: 2020-12-27
  1. serial = new QSerialPort();
  2. connect(timer, SIGNAL(timeout()), this, SLOT(custom_timeout()));
  3. connect(serial, SIGNAL(errorOccurred(QSerialPort::SerialPortError)), this,
  4.         SLOT(custom_error(QSerialPort::SerialPortError)));
  5. timer->start(1);
  6. serial->setPortName("COM5");
  7. serial->setBaudRate(115200);
  8. serial->setDataBits(QSerialPort::Data8);
  9. serial->setStopBits(QSerialPort::OneStop);
  10. serial->setFlowControl(QSerialPort::NoFlowControl);
  11. serial->setParity(QSerialPort::EvenParity);
  12. if (!serial->isOpen()) {
  13.     if (serial->open(QIODevice::ReadWrite)) {
  14.         ui->textEdit->append("1");
  15.     } else {
  16.         ui->textEdit->append("2");
  17.     }
  18. } else
  19.     ui->textEdit->append("3");


帮楼主格式化了一下。

你代码跑在网页上的吗?要不是的话和网页刷新有什么关系么
离线九重水

只看该作者 5楼 发表于: 2020-12-28
回 fsu0413 的帖子
fsu0413:serial = new QSerialPort();
connect(timer, SIGNAL(timeout()), this, SLOT(custom_timeout()));
connect(serial, SIGNAL(errorOccurred(QSerialPort::SerialPortError)), this,
        SLOT(custom_error(QSerialPort::SerialPortErr .. (2020-12-27 10:39) 

即使不是跑网页上,也是跟网页刷新的联动了。
楼主用QSerialPort类,在刷新网页时,整个serial被摧毁了,自然而言断开了连接。
这种情况下需要重连机制,但是跟串口弄到一起感觉非常违和。
还是弄个‘长连接’吧。

@liudianwu  ,住不起,求照顾。有沙发吗?我可以的。
本帖提到的人: @liudianwu
离线suzhuorui

只看该作者 6楼 发表于: 2020-12-28
回 九重水 的帖子
九重水:即使不是跑网页上,也是跟网页刷新的联动了。
楼主用QSerialPort类,在刷新网页时,整个serial被摧毁了,自然而言断开了连接。
这种情况下需要重连机制,但是跟串口弄到一起感觉非常违和。
还是弄个‘长连接’吧。
....... (2020-12-28 09:35) 

为什么跟网页刷新联动了呢,我看里面也没写跟web有关的代码呀?小白困惑
离线fsu0413

只看该作者 7楼 发表于: 2020-12-28
回 九重水 的帖子
九重水:即使不是跑网页上,也是跟网页刷新的联动了。
楼主用QSerialPort类,在刷新网页时,整个serial被摧毁了,自然而言断开了连接。
这种情况下需要重连机制,但是跟串口弄到一起感觉非常违和。
还是弄个‘长连接’吧。
....... (2020-12-28 09:35) 

我没有理解你的观点。
网页又不走串口,怎么能断开连接呢?
离线九重水

只看该作者 8楼 发表于: 2020-12-29
回 fsu0413 的帖子
fsu0413:我没有理解你的观点。
网页又不走串口,怎么能断开连接呢? (2020-12-28 21:31) 

网页版的串口通信是有的。
有些人做网页版的串口调试,没做好,就跟网页刷新连在了一起。
实际上,网页读取写入串口数据时,每一次都需要连接。
就好像我们访问网站页面时,每次都要连接一次。
这种情况下,你把串口类比于网口就行了。
离线fsu0413

只看该作者 9楼 发表于: 2020-12-31
回 九重水 的帖子
九重水:网页版的串口通信是有的。
有些人做网页版的串口调试,没做好,就跟网页刷新连在了一起。
实际上,网页读取写入串口数据时,每一次都需要连接。
就好像我们访问网站页面时,每次都要连接一次。
....... (2020-12-29 11:32) 

这个前提难道不是串口跑在网页上吗?
LZ也没说程序跑在网页上
离线winston_zbb

只看该作者 10楼 发表于: 2020-12-31
回 fsu0413 的帖子
fsu0413:
[code]serial = new QSerialPort();
connect(timer, SIGNAL(timeout()), this, SLOT(custom_timeout()));
connect(serial, SIGNAL(errorOccurred(QSerialPort::SerialPortError)), this,
        SLOT(custom_error(QSerialPort::SerialPortError)));
timer->start(1);
.......

多谢帮我格式化代码,对这个论坛不太熟悉,所以用的不好。
我现在遇到的问题是串口经常中断,使用QSerialPort::SerialPortError类监测到的错误代码是
QSerialPort::ResourceError
描述是:
An I/O error occurred when a resource becomes unavailable, e.g. when the device is unexpectedly removed from the system.

最开始的时候,我把串口放到主线程中,程序中不关联任何网页相关的,串口每隔20ms发送一次数据。只要刷新网页,串口就会断开,且中断代码是QSerialPort::ResourceError 。
后来,我把串口发送和接收放到了子线程中,刷新网页不会出现问题通讯中断的问题,有一个问题,我使用exec()函数打开一个新的界面时,串口有可能会中断,错误代码还是QSerialPort::ResourceError 。但是这种情况出现是有概率的,并不是每次都出错。
还有一种出错的情况,我的一个按键,里面有while 循环函数,循环函数中用到了Sleep(20)函数。此时也有一定概率出错,错误代码QSerialPort::ResourceError。
注:Sleep函数如下
QTime dieTime = QTime::currentTime().addMSecs(msec);while( QTime::currentTime() < dieTime ){    QCoreApplication::processEvents(QEventLoop::AllEvents, 100);}

离线winston_zbb

只看该作者 11楼 发表于: 2020-12-31
回 fsu0413 的帖子
fsu0413:这个前提难道不是串口跑在网页上吗?
LZ也没说程序跑在网页上 (2020-12-31 08:37) 

我的串口没有跑在网页上,随便建一个在主线程上的串口,每30ms发送一次数据,然后打开网页就会出现错误,串口断开 错误代码是QSerialPort::ResourceError,错误说明是An I/O error occurred when a resource becomes unavailable, e.g. when the device is unexpectedly removed from the system.这个情况不是每次都发生。
我之后的测试发现,使用exec() 打开一个新的界面,也有概率是串口中断,错误代码还是QSerialPort::ResourceError。
我对qt的串口理解不深,如果您有什么想法,望不吝赐教
离线winston_zbb

只看该作者 12楼 发表于: 2020-12-31
回 九重水 的帖子
九重水:代码真乱……
麻烦楼主清晰地再讲一遍遇到的问题。 [表情]
另外问一下楼上的,上海房租多少钱一般,一房一厅或单间,单身汉住的那种。[表情] @liudianwu     (2020-12-26 10:17) 

我今天又重新测试了一下,发现网页刷新对串口又没有影响力,我都怀疑上次网页刷新串口中断是否是我的错觉。
但是目前还有几个问题:
1、串口每隔30ms发送一次数据时,如果打开一个新的界面,新界面与串口毫无关系,此时串口会停顿一下,有时候会出现串口断开的情况,错误代码是QSerialPort::ResourceError
描述为:
An I/O error occurred when a resource becomes unavailable, e.g. when the device is unexpectedly removed from the system.
我之前测试的时候,基本上打开新界面都会断开。后来,没改程序,重新生成,打开新界面,串口发送会顿一下(通过串口线上的收发指示灯看到的),然后接着发送。

2、我添加了一个按钮,按钮的功能是执行一个过程,这个过程时间比较长,大概1分钟左右执行完。里面有一个while函数,通过网口与设备通讯,通过网口往设备发送接收指令时,串口会中断,且中断指令为QSerialPort::ResourceError。
本帖提到的人: @liudianwu
离线fsu0413

只看该作者 13楼 发表于: 2020-12-31
我能想到的就是主线程被阻塞导致串口接收发送失败,试着把串口放在单独的线程里去操作吧
离线fsu0413

只看该作者 14楼 发表于: 2020-12-31
我对串口也不了解,我只是针对这种看起来很不科学的现象做出我自己的理解。。。

LZ看起来试了把串口放在子线程当中,不过我觉得。。。
嘛,QThread的设计本身有问题,如果LZ不慎踩雷,那么事实上串口并没有在子线程里跑,可能需要LZ再看看了。。。。
离线winston_zbb

只看该作者 15楼 发表于: 2021-01-05
回 fsu0413 的帖子
fsu0413:我对串口也不了解,我只是针对这种看起来很不科学的现象做出我自己的理解。。。
LZ看起来试了把串口放在子线程当中,不过我觉得。。。
嘛,QThread的设计本身有问题,如果LZ不慎踩雷,那么事实上串口并没有在子线程里跑,可能需要LZ再看看了。。。。 (2020-12-31 18:42) 

首先,多谢回复!我给您说一下,我最近测试出的的最新情况,如果可以的话,可以帮我分析一下原因。
1、串口放在子线程(有可能是我的子线程没设置对),串口每隔50ms发送一串数据,同时从仪表接收一串数据。此时打开串口,串口收发正常。
2、如果我的程序界面比较复杂,我点最大化和最小化,多点几次,就会出现异常中断,错误代码是QSerialPort::ResourceError   说明:An I/O error occurred when a resource becomes unavailable, e.g. when the device is unexpectedly removed from the system.  这个错误代码和我拔掉串口的错误代码相同。但是点击重连之后,串口还是能重新连上。
3、我个人理解:每次重绘界面的时候,如果我写的子线程有问题,可能由于主线程工作量太大导致串口不发送命令,从而导致误判断为串口已拔出。不知道您有什么理解
快速回复
限100 字节
 
上一个 下一个