问题标签 [termios]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 标准输入上的 read() 返回 EOF 而不是等待输入
有谁知道为什么运行以下代码可能会导致该 fd(即标准输入)上的所有未来 read() 调用立即返回 0 而不是阻塞输入?
删除 tcsetattr 行使 read() 按预期工作。
也试过:
没有运气。
请注意,我目前有 2 个不同的终端。在其中一个中运行应用程序会导致 read 立即返回。在其他情况下运行它会导致 read 阻塞输入。会是什么呢?
提前致谢 :-)
复制来源:
linux - 未知原因读取串行端口块
我正在尝试使用 Linux 下的 termios 框架通过 UART(usbserial)连接非接触式智能卡读卡器。该代码在 PC 上运行良好,但是当我在 ARM9 目标上进行交叉编译并试用时,它能够打开设备甚至将命令写入设备,但读取命令会无限期地阻塞。这是代码片段:
mifare_1K 结构包含串行设备的文件描述符、termios 结构和我正在使用的各种缓冲区。我提到的设备是usb-to-serial(模块:ftdi_sio)设备。它在 termios 的规范模式下配置为 38400@8-N-1。
规范模式,因为来自阅读器的响应以“\n”结尾,因此在规范模式下处理更好,因为它会读取设备直到收到“\n”(如果我错了,请纠正我)。
首先我调用 init() fn,然后调用 get_rdr_version()。字符串“cmd sent, read version...”被打印出来,所以我知道它可以写,但不打印字符串“reading done”。在那之后。
另一件事是,如果我卸下读卡器并将该端口连接到另一台 PC 上的 gtkterm(串行端口终端程序),我不会在该 gtkterm 上收到“$1V\n”??!!. 然后经过一点 RnD,我发现如果我重新启动连接读卡器的系统,那么只有我在另一个 Gtkterm 上得到那个 cmd "$1V\n"。如果我在不重新启动的情况下重试,则在该 Gkterm 上看不到该 cmd ...一个线索,但尚未弄清楚。
是否类似于将 cmd 写入设备文件,但没有排入实际设备?有什么办法可以检查这个吗?
任何帮助都深表感谢,因为我已经被困在这个 fr 一段时间了......谢谢。
更新 :
好的,我通过稍微修改代码来让它工作,如下所示。
这是在我的 init() 函数中打开端口的代码的修改部分。两个变化:
1) O_NDELAY 添加到 open() 调用中的标志,它忽略数据载波检测 (DCD) 线,以查看另一端是否已连接并准备好进行通信。这本来是用于MODEM的,我不需要,事实上,因为我使用的是usbserial,所以我根本没有它。但是这个标志也会进一步调用 read() 和 write() 作为非阻塞。需要注意的是,我曾认为可以通过将 CLOCAL 添加到 termios 结构的 cflag 来解决这个问题,我尝试过但没有奏效。
2) fcntl(fd,F_SETFL,0) 恢复进一步 read() 和 write() 调用的阻塞行为。
这个组合对我来说非常有效。我没有将此作为答案发布的唯一原因是我还不明白为什么它在没有这种修改的情况下在 PC 上工作,因为它是相同的硬件。事实上,我可以使用minicom从 ARM9 TARGET 上的智能卡读卡器读取数据,但不是我的程序。我将检查 FT232BL 文档,看看默认情况下 DCD 的状态是什么。
无论如何,我在POSIX 操作系统的串行编程指南中找到了一些信息。解释任何人???当然,当我找到答案时,我会发布答案..
干杯:)
python - 检查 Linux 终端缓冲区中的额外字符
我尝试getch()
在 Python 中实现函数,它还应该返回特殊键(如 F1-F12 和箭头键)的字符列表。这些特殊键按顺序生成多个字符。因此getch()
在阻塞模式下读取一个字符,然后应该检查输入缓冲区中是否还有额外的字符来获取它们。
我将ioctl
call 与termios.FIONREAD一起使用来获取输入缓冲区中的字节数。它会捕获堆积在缓冲区中的非特殊按键,但会丢失特殊键中的额外符号。似乎有两个不同的缓冲区,如果有人可以解释这一点,那就太好了。
这是交互式示例:
注意sleep(1)
中间。如果您在这一秒到期之前按下一个键,输出将是:
对于一秒钟内输入的 5 个普通键(例如 'asdfg'),输出为:
但对于单个箭头键,输出:
这里有两个问题:
为什么普通按键队列中的4个符号被丢弃?是因为切换到“原始”终端模式吗?
getch()
如何在不让终端处于“原始”模式的情况下为后续运行保留字符?为什么
ioctl
单个特殊按键的缓冲区为空?这些角色是从哪里来的后续getch()
运行?如何检查它们?
c - VTIME 和 VMIN 串行端口选项是否与 select 一起使用?
select()
我有使用and读取串行端口的 Linux 程序read()
。它工作正常,但存在性能问题:
程序每次read()
调用仅接收 1-4 个字节的数据。这会导致不必要的开销。
我将 VTIME 设置为 20(2 秒)和 VMIN 设置为 9,以避免该问题。
select()
但当只有 1-4 个字节可用时仍会立即返回。从程序跟踪:
我的问题是:
VTIME 和 VMIN 串行端口选项是否适用select
?
如果它应该工作,为什么select
过早返回?
使用非规范模式。串口配置为:
objective-c - 为什么在与 USB 转串行适配器通信时,此串行通信代码会挂起?
我正在编写一个应用程序,它应该从 Mac Mini 的桌面控制投影仪。我正在使用 Xcode 和 termios.h 在 Objective-C 中编写应用程序来与串行端口通信。我从 USB 转串口适配器连接,并且我知道驱动程序安装正确,因为我可以将 HEX 命令发送到投影仪以控制其功能。
我编写了我认为应该打开串行端口、连接到投影仪、发送代码并断开连接的代码:
我想知道我哪里出错了,因为当我运行程序时它会挂起。
c - 将 POSIX C 代码移植到 Windows
我刚刚完成了一个用 C 编写的小项目,我从串口读取数据流并解析传入的数据。该软件是为 POSIX 系统(使用 termios)编写的,并遵循使用串行 i/o 的标准步骤
- 使用 open() 打开串口设备
- 配置通信参数 (termios)
- 在文件句柄 (fcntl) 上设置阻塞模式
- 在串行接口上执行 read()。
- 完成后在串行接口上执行 close()。
除了插座部分,代码是直接的 ANSI C。
我的问题是,使代码在 Windows 平台上工作的参与程度如何。移植不是由我编写的,我只想向可能对移植它感兴趣的其他人提供一个指示(即微不足道,不是那么微不足道,把你的眼睛挖出来导致精神错乱)。
此外,如果有人拥有带有“UNIX 的 Windows 服务”的 Windows,他们是否能够在不修改代码的情况下使用该代码?
所以,如果有人有这方面的经验,请分享一下。
c++ - 如何在不重启的情况下在 Ubuntu 和 C/C++ 下拔出 USB 设备
我正在使用带有 termios 的 C 程序在我的带有 Ubuntu 的电脑和 USB 电机控制器之间交换信息和命令。
它工作得很好,我能够通过串行端口成功发送消息;但是,有时如果我以错误的方式关闭程序或发生其他事情,我将无法再重新连接到我的 USB 设备。
为了能够再次连接到设备,我必须重新启动我的电脑并重新启动 ubuntu。
我想避免这个问题,并找到一个解决方案来再次启用 USB 端口,而不必每次都重新启动我的系统。
第一次,我试图杀死所有正在使用 USB 端口的进程(sudo killall -9 program_name),但端口仍然被阻塞,我必须重新启动它。
你能给我一些避免重启的解决方案吗?为什么会这样?
我以这种方式连接到 USB 端口(/dev/ttyACM0):
c - ttys0 丢失/乱码数据,而 ttyusb0 没有
如果端口是 ttyusb0,则使用 termios 的 c 程序运行良好,但如果通过 ttys0 即 comport com1 获得数据,则会丢失/乱码。
程序在 ubuntu 9.04 & 10.04 下运行
请就造成这种差异的补救措施提出建议。
c - 当 ICANON 在非规范中时如何绕过没有退格键
我正在使用我在上一个问题中建议的 termios ,但现在询问是否有办法让退格键在非规范模式下使用 termios 时工作。我正在使用 termios 没有echo
如果我使用&=ECHO
并且&=ICANON
这是我想要的结果,则键盘输入会在按下并显示键后立即发送到 putchar() 但如果我执行相反的操作,则'\b'
键显示为hex
在按下输入之前我看不到文本,但'\b'
可以。我查了说明书和其他一些论坛,他们说“不可能只是不要犯任何错误”,这是有道理的,因为当我在 Ubuntu 的终端中没有正确输入密码时,我无法退格并更改它. 但我确保我没有错过手册中的任何内容。
代码是从标准输入获取输入而不显示空行。
谢谢拉克兰
PS 在我的研究中,我注意到有人说 Termios 不是“标准 C”,这是因为它依赖于系统吗?(仅用于评论)