找回密码
 立即注册
收起左侧

请教QIODevice的readyRead和bytesWritten的含义

10
回复
18322
查看
[复制链接]
累计签到:27 天
连续签到:1 天
来源: 2015-11-11 16:30:28 显示全部楼层 |阅读模式
1Qter豆
readyRead()的解释如下:
This signal is emitted once every time new data is available for reading from the device.
bytesWritten()的解释如下:
This signal is emitted every time a payload of data has been written to the device.

请问readyRead说的"new data is available"怎么理解,假设接受一个字符串,当收到第1个字符后,算不算"new data is available"呢?
同理,bytesWritten说的“a payload of data has been written”,当发送一个字符串时,刚发送一个字节后,算不算"data has been written"呢?

有童鞋建议看QT的底层代码,请问QIODevice的源代码在哪里呢?谢谢!

最佳答案

查看完整内容

It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device. 根据我的理解应该不是第一个字符到了的时候就发信号
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2015-11-11 16:30:29 显示全部楼层
It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device.
根据我的理解应该不是第一个字符到了的时候就发信号
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2015-11-11 17:00:35 显示全部楼层
首先,在你安装的时候如果勾选了安装源码才会有,文件就在安装目录中的 src 文件夹中,不过似乎源码不太好看明白
其次,至于信号是怎么发的,这个测一下就知道了,你发一串数据,在接收的函数中你计个数就知道了

点评

bytesWritten的意思 恩 还是没搞懂、、、、、、、、、、、、  详情 回复 发表于 2015-11-20 16:58
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-11-11 19:00:42 显示全部楼层
一叶知秋 发表于 2015-11-11 17:09
It will only be emitted again once new data is available, such as when a new payload of network data ...

这是我在另一个帖子的疑问(示意代码,表示个意思):
        QString str1 = "1234567890";
        QString str2 = "0987654321";
        MyCom->write(str1);
        MyCom->write(str2);
        请问为什么MyCom->write(str1)没有触发槽呢,MyCom->write(str2)之后才触发了?

我的理解是,QT底层识别到str1的结尾'0/'后发送bytesWritten()信号,也就是应该在MyCom->write(str1)后触发槽,测试的结果却是槽在MyCom->write(str2)之后才触发。。。
从这个结果分析的话,qt并没有以str1为依据去触发发射bytesWritten()。由于str1和str2的写入紧挨着,所以更像是检测"写缓冲区为空"后发射了bytesWritten()信号,但不知道这个猜测怎么验证,请了解的童鞋一起聊聊
回复

使用道具 举报

累计签到:882 天
连续签到:3 天
2015-11-19 09:30:21 显示全部楼层
有更深入的理解时可以在共享出来供别人学习测试。。。
回复

使用道具 举报

累计签到:27 天
连续签到:1 天
2015-11-19 11:18:31 显示全部楼层
一叶知秋 发表于 2015-11-19 09:30
有更深入的理解时可以在共享出来供别人学习测试。。。

好的,最终我还是没用好这两个东东来解决我的问题,等哪天弄明白了再回来继续讨论。
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-11-20 16:58:08 显示全部楼层
一叶知秋 发表于 2015-11-11 17:00
首先,在你安装的时候如果勾选了安装源码才会有,文件就在安装目录中的 src 文件夹中,不过似乎源码不太好 ...

bytesWritten的意思 恩 还是没搞懂、、、、、、、、、、、、
回复

使用道具 举报

累计签到:883 天
连续签到:1 天
2016-9-27 16:29:44 显示全部楼层
也是不懂,顶一哈,谢谢。
回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2016-10-11 14:44:26 显示全部楼层
设备缓冲区有一个字节则发送readyRead,数据都写入完成则发送bytesWritten
回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2016-10-22 16:02:05 显示全部楼层
dearcc 发表于 2016-10-11 14:44
设备缓冲区有一个字节则发送readyRead,数据都写入完成则发送bytesWritten

这个结论可有出处??对串口readyRead()信号和read()函数的底层实现,我也有疑问,但查不到什么资料。希望这位兄台帮忙解答一二,谢谢。
疑问1):readyRead()信号是串口接收到一个byte就触发吗?
疑问2):外设每隔11ms向串口发送400Byte数据,其中发送时间占用月9ms。pc侧用read()函数每次读400Byte。我测了每次read花费的时间,发现第一次花费80+ms,以后的7次read,每次都是1ms左右。一直搞不懂为什么????
回复

使用道具 举报

累计签到:25 天
连续签到:1 天
2016-12-16 08:57:32 显示全部楼层
ls7165465 发表于 2016-10-22 16:02
这个结论可有出处??对串口readyRead()信号和read()函数的底层实现,我也有疑问,但查不到什么资料。希 ...

1、一有数据就会触发:This signal is emitted once every time new data is available for reading from the device. It will only be emitted again once new data is available, such as when a new payload of network data has arrived on your network socket, or when a new block of data has been appended to your device.

readyRead() is not emitted recursively; if you reenter the event loop or call waitForReadyRead() inside a slot connected to the readyRead() signal, the signal will not be reemitted (although waitForReadyRead() may still return true).
2、至于花费的时间,可以自己用波特率大致推算出来。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了