首页 > 其他分享 >QSerialPort waitForReadyRead有数据却超时问题

QSerialPort waitForReadyRead有数据却超时问题

时间:2023-11-04 10:23:44浏览次数:35  
标签:qt QSerialPort waitForReadyRead setReadBufferSize 缓冲区 超时

工作中用到Qt串口通讯,使用方法很简单,网上很多都使用的是异步(信号槽)方式,这里记录一下同步方式调用waitForReadyRead阻塞后,明明发送数据却还是返回超时问题。

这里说的是以ASCII形式发送,也就是常见的ABCD字符

十六进制形式发送waitForReadyRead会立即响应,目前还没查到具体原因。

 

如果是ASCII形式通讯,在调用waitForReadyRead之前,先调用setReadBufferSize设置缓冲区大小。这样waitForReadyRead就不会一直阻塞直到超时了。

Qt缓冲区

QSerialPort 内部维护了一个缓冲区,当有新数据进来后会先写入缓冲区不会立即触发waitForReadyRead,当缓冲区满时waitForReadyRead才会返回true,否则返回false。

可以通过setReadBufferSize函数设置缓冲区大小,需要注意的是在没设置缓冲区大小的情况下,默认缓冲区大小是0代表缓冲区大小没有限制(https://doc.qt.io/qt-5/qserialport.html#setReadBufferSize)。

 

也就是说在waitForReadyRead没超时的情况下,发送多少数据也不会放开阻塞向下执行,直到最后超时(waitForReadyRead默认超时时间30s,-1表示永不超时https://doc.qt.io/qt-5/qserialport.html#waitForReadyRead)。

虽然waitForReadyRead函数返回false超时,但是还是可以通过readAll()函数读取到接收的数据。

 简单示例代码:

    qDebug() << argv[1];
    qDebug() << "len: " << argc;
    QString com = argv[1];
    if(argc == 1) com = "COM1";
    QSerialPort serial;
    serial.setPortName(com);
    serial.setBaudRate(QSerialPort::Baud9600); // 设置波特率
    serial.setDataBits(QSerialPort::Data8); // 设置数据位
    serial.setParity(QSerialPort::NoParity); // 设置校验位
    serial.setStopBits(QSerialPort::OneStop); // 设置停止位
    serial.setFlowControl(QSerialPort::NoFlowControl); // 设置流控制

    if(serial.open(QIODevice::ReadWrite) == false) {
        qDebug() << com << "打开失败!";
        return 1;
    }
    qDebug() << com << "打开ok.";
    serial.setReadBufferSize(10);
    serial.waitForReadyRead( 10 * 1000);

    qDebug() << "串口结束." << serial.readAll();
    serial.close();

 

标签:qt,QSerialPort,waitForReadyRead,setReadBufferSize,缓冲区,超时
From: https://www.cnblogs.com/GengMingYan/p/17808913.html

相关文章

  • 记一次生产数据库连接超时问题排查
    背景SpringBoot2.0.8+ Hikari+ Oracle 历史项目,很久没维护了,生产上正常运行两年有余,双活架构,突然有一天其中一台后端服务器数据库连接池报错:SQLError:0,SQLState:08006SQLError:17002,SQLState:08006JDBCConnectionException:UnabletoacquireJDBCConnection初步排查......
  • selenium4 增加超时和等待时间
    增加全局的超时和等待时间:importtimefromselenium.webdriverimportKeys,ActionChainsfromselenium.webdriver.common.byimportByfromseleniumimportwebdriverfromselenium.webdriver.chrome.serviceimportServicefromwebdriver_manager.chromeimportCh......
  • c#使用委托执行带有超时检查的方法
    namespaceTimeOutHelper{internalclassProgram{//定义一个泛型委托,用于定义带有超时检查的方法的签名publicdelegateTRTimeOutDelegate<inT,outTR>(Tparam);privatestaticvoidMain(){Dictionary<Guid,string>result;//调用Timeo......
  • c#使用委托执行带有超时检查的方法
    namespaceTimeOutHelper{internalclassProgram{//定义一个泛型委托,用于定义带有超时检查的方法的签名publicdelegateTRTimeOutDelegate<inT,outTR>(Tparam);privatestaticvoidMain(){Dictionary<Guid......
  • Python函数超时,用装饰器解决, win可以运行
        https://mp.weixin.qq.com/s/u5VGromE6iJmBBUoNaPFmw pipinstallfunc_timeout  #-*-coding:utf-8-*-importtimefromfunc_timeoutimportfunc_set_timeout@func_set_timeout(5)deftask():whileTrue:print('helloworld�......
  • 在使用 Unity 2022 打包安卓项目时,遇到 gradle 无法访问或下载超级慢最终超时出错的问
    一般表现是打包最后一步会等待超长时间,最后报错,错误信息:PickedupJAVA_TOOL_OPTIONS:-Dfile.encoding=UTF-8FAILURE:Buildfailedwithanexception.*Whatwentwrong:Aproblemoccurredconfiguringrootproject'Gradle'.>Couldnotresolveallartifactsfor......
  • k8s service访问偶发超时问题
    问题现象在某个集群节点上的服务访问service服务:端口,会出现偶发timeout的问题,集群有的节点不会出现访问timeout的问题问题处理查看bridge-nf-call-iptables参数是否开启cat/proc/sys/net/bridge/bridge-nf-call-iptables0问题解决开启内核参数echo"net.bridge.br......
  • Dynamic CRM 部署ADFS 登陆超时时间查看及修改
    部署ADFS后,DynamicCRM登陆一段时间后会登陆失效。原因是在DynamicCRM所在的ADFS服务器中TokenLifetime默认值为0.1.查询ADFS的TokenLifetime在部署ADFS服务器里面,运行输入:PowerShell,输入代码:Get-ADFSRelyingPartyTrust"CRMIFDRelyingParty" 2.设置ADFS服务器TokenLif......
  • fastapi设置超时时间
    方法一:应用级别的超时设置一种设置FastAPI应用程序全局超时时间的方法是使用TimeoutMiddleware中间件。以下是一个示例:fromfastapiimportFastAPIfromfastapi.middleware.timeoutimportTimeoutMiddlewarefromdatetimeimporttimedeltaapp=FastAPI()#设置应用......
  • windows 启用wsl wsl --install 操作超时
    在启用或关闭Windows功能中启用Windows虚拟机监控程序平台......