• 7452阅读
  • 7回复

[讨论]QIODevice的缓冲区发完之后,如何判断? [复制链接]

上一主题 下一主题
离线zfszfs
 

只看楼主 正序阅读 楼主  发表于: 2014-10-11

QIODevice里面的缓冲区的数据发完之后,是否会产生一个事件?
我在网上看了有个bytesWritten的信号,但是好像不是缓冲区清空的信号。
有个atEnd,但是是个函数,不算是信号。
我希望在缓冲区的数据发完之后,进行响应的动作。

离线begboy

只看该作者 7楼 发表于: 2014-10-19
回 zfszfs 的帖子
zfszfs:感谢你的详细作答。谢谢。
我确实是ARM+LINUX+QT的开发环境,而且操作硬件485实现通讯。
所以,出现了前述的问题。
多谢指路。 (2014-10-18 18:35) 

zfszfs , 不用客气!

祝好运!
begboy
离线zfszfs

只看该作者 6楼 发表于: 2014-10-18
回 begboy 的帖子
begboy:zfszfs,你好!
       从您的描述,可否理解如下:您所说的485串口通讯,是否指RS485串口?如是,你是否进行嵌入式开发(例如ARM类的开发)或工控?若上述猜测成立,真心不建议您使用QT进行底层硬件的开发,因为这不是它的强项。
  &nb .. (2014-10-16 10:29) 

感谢你的详细作答。谢谢。
我确实是ARM+LINUX+QT的开发环境,而且操作硬件485实现通讯。
所以,出现了前述的问题。
多谢指路。
离线begboy

只看该作者 5楼 发表于: 2014-10-16
回 zfszfs 的帖子
zfszfs:多谢,这几天没有上网,所以,这个帖子没有及时回复。
我是Linux下面采用485串口通讯,由于485是单工的,因此在发送的时候,我需要把某个引脚拉低,这样才能把数据发出去,发出去之后,立即将该引脚恢复,这样才能保证及时接受。
现在的问题是,QIODevice,好像是有缓冲的,往缓 .. (2014-10-14 14:15)

zfszfs,你好!
       从您的描述,可否理解如下:您所说的485串口通讯,是否指RS485串口?如是,你是否进行嵌入式开发(例如ARM类的开发)或工控?若上述猜测成立,真心不建议您使用QT进行底层硬件的开发,因为这不是它的强项。
       在Linux下,请直接使用C语言和ioctl系统调用。直接调用ioctl()的目的是避免用户级的缓存,那么发送延迟就只剩下linux核心级的缓存延迟;
       另外由于RS485是半双工的,是需要I/O口控制RS485数据方向(例如您所说的需要把某个引脚拉低,同理),建议发送时,在ioctl ()和write()系统调用后,增加一个delay()的延迟,具体延迟时间可自行测试后确定;
      发送完毕后,置反数据方向进入接收数据(例如您所说的立即将该引脚恢复,同理),采用ioctl ()和read()系统调用进行接收数据;
      同时为避免硬件原因出现数据不完整情况,建议在程序上自定义发送和接收数据帧格式,自行进行校验处理,不符则重发该数据帧。
供参考。
祝好运!
begboy


离线zfszfs

只看该作者 4楼 发表于: 2014-10-14
回 dbzhang800 的帖子
dbzhang800:QIODevice 没有相关的信号。
你用QIODevice操作的什么IO设备,或者你考虑使用系统API来操作该设备 (2014-10-13 14:49)

已经回复在楼上,谢谢。
离线zfszfs

只看该作者 3楼 发表于: 2014-10-14
回 begboy 的帖子
begboy:zfszfs,你好!
    从你的描述,本人觉得deBao兄讲的对。
....... (2014-10-13 16:26) 

多谢,这几天没有上网,所以,这个帖子没有及时回复。
我是Linux下面采用485串口通讯,由于485是单工的,因此在发送的时候,我需要把某个引脚拉低,这样才能把数据发出去,发出去之后,立即将该引脚恢复,这样才能保证及时接受。
现在的问题是,QIODevice,好像是有缓冲的,往缓冲区送数据是采用线程处理的。
因而,实际上,很难把握何时缓冲区的数据已经发送完毕。
不知道是如何解决的?
求建议,谢谢。
离线begboy

只看该作者 2楼 发表于: 2014-10-13
回 dbzhang800 的帖子
dbzhang800:QIODevice 没有相关的信号。
你用QIODevice操作的什么IO设备,或者你考虑使用系统API来操作该设备 (2014-10-13 14:49) 

zfszfs,你好!

    从你的描述,本人觉得deBao兄讲的对。

  但如果一定要知道设备相应缓冲区是否已清空,如果
您是使用UNIX(Linux)类操作系统,建议如下处理:
1、直接使用ioctl()系统调用,获取常见串口等相关硬件设备
握手信号情况,来进行判断;
2、假如设备为自带芯片处理缓冲的,自行编写驱动程序,
并入Linux操作系统核心,待清空缓冲后以中断方式进行判断;

祝好运!
begboy

离线dbzhang800

只看该作者 1楼 发表于: 2014-10-13
QIODevice 没有相关的信号。

你用QIODevice操作的什么IO设备,或者你考虑使用系统API来操作该设备
快速回复
限100 字节
 
上一个 下一个