【问题标题】:write() with ttyS is non block带有 ttyS 的 write() 是非阻塞的
【发布时间】:2013-03-27 07:03:00
【问题描述】:

我的问题是——如何在 uCLinux 2.6.21 中同步调用 write(),即在发送结束之前调用未完成? 现在我有以下代码:

//...
fd = open (PORT, O_RDWR | O_SYNC)
//...

FIO3CLR |= 0x30000000; // RTS = 0 (enable transfer)
write (fd, "A", 1) // pass
FIO3SET |= 0x30000000; // RTS = 1 (disable transfer)

命令FIO3SET |= 0x30000000; 在调用write() 后几乎立即开始执行,因为该任务是不可取的。 谢谢。

【问题讨论】:

  • 我认为O_SYNC只对磁盘文件有意义,对其他I/O流没有意义。
  • 您没有定义FIO3CLR 是什么。
  • 既然你声称使用的是Linux,我怀疑FIO3SET |= 0x30000000; 没有任何意义。您不应该调用ioctl() 或类似函数来处理串行线TTY 吗?
  • 巴尔玛,你完全正确。
  • Basile Starynkevitch,它在文件顶部的#include 中定义

标签: c linux tty


【解决方案1】:

我的猜测是您应该设置 TTY 属性,如果您设置了属性,Linux 内核将执行 RTS/CTS 处理。有关完整示例,请参阅http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/x115.html。我猜想回答你问题的部分是这样的:

newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; // CRTSCTS is set here
//...
tcsetattr(fd,TCSANOW,&newtio);

【讨论】:

  • 威尔克斯,感谢您的评论。我的控制器有 4 个 uart 端口,其中只有一个(uart1)具有对 RTS/CTS 的硬件支持,他习惯于另一项任务。在当前任务中,我使用没有硬件支持 RTS\CTS 的端口,因此不建议包含这些标志。
【解决方案2】:

tcdrain() 等到所有写入 fd 引用的对象的输出都已传输完毕。 它解决了我的问题 C read call blocking on serial port operation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-13
    • 2013-05-15
    • 1970-01-01
    • 2012-11-22
    • 2014-10-19
    • 1970-01-01
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多