• 930阅读
  • 4回复

socket协议访问设备 [复制链接]

上一主题 下一主题
离线chenmin_oer
 

只看楼主 倒序阅读 楼主  发表于: 2023-01-19
— 本帖被 20091001753 从 Qt安装与发布 移动到本区(2023-01-19) —
设备是网口的,通过socket协议访问。但有个问题,我需要实时(比如1s访问一次,不间断访问24h)read,但N次中会偶尔出现几次 socket的waitForReadyRead函数错误。设备厂家反馈 tcpip访问就是这样,是其特性。

我现在的措施是,当waitForReadyRead函数返回false时,用自定义的字符串代替read的内容。是否有更好的方法? 另外,厂家的解释是合理的吗?
离线liulin188

只看该作者 1楼 发表于: 2023-01-20
waitForReadyRead在windows是有这个问题,官方文档已经给出了解决的办法。
不过我个人使用中这种概率不高,如果失败,直接重复请求一次就行。
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线wwwfffhhh

只看该作者 2楼 发表于: 2023-01-20
建议改为信号接收读取,而不是这种线程 死 等待


离线wwwfffhhh

只看该作者 3楼 发表于: 2023-01-20
    connect(this, &QTcpSocket::readyRead, this, &CTcpConnectSocket_Client::onReadyRead);
离线wwwfffhhh

只看该作者 4楼 发表于: 2023-01-20
然后在槽函数中执行循环读取到空    while(true)
    {
        qint64 count = read((char*)InnerBufferForReceiveEvent.GetDataAddress(), InnerBufferForReceiveEvent.GetAllocMemLen());
        if(count > 0)
        {
            ReceivePacketBuffer.AddBytes(InnerBufferForReceiveEvent.GetDataAddress(), count);
        }
        else
        {
            break;
        }
    }


快速回复
限100 字节
 
上一个 下一个