我发现这篇很棒的文字解释了很多有关 TTY 设备的内容。它重点关注 TTY 设备和 shell(及其衍生的作业)之间的关系。但它很少提及终端仿真器和 TTY 设备之间的关系;现在我想知道这一点。我用谷歌搜索,但找不到答案......
1)终端仿真器负责什么样的输入逻辑?它只是将每个字符代码(通过窗口事件接收)发送到 TTY 设备,还是在传输到 TTY 之前/期间进行更复杂的处理?这些字符代码是如何发送到TTY设备的呢?通过文件?
2) 前台进程调用write()TTY 设备文件(又名stdout/ )后stderr,会发生什么?这些数据如何到达终端仿真器进程并进行渲染?再次,通过文件?
3) 终端仿真器是否负责“分配”TTY 设备?TTY 设备可以由内核“即时”创建,或者内核可以管理的可用 TTY 设备数量是否有限?
当打开插入基于 ARM9 的嵌入式板的 USB 主机的基于 FDTI USB UART 的串行端口时,它会自发传输数据。它在打开时就正确执行此操作,甚至在设置比特率或对 fd 执行任何其他操作之前。
发送的数据总是或多或少相同:
^@^@^@^@^@
Run Code Online (Sandbox Code Playgroud)
用十六进制表示为:0x5e 0x40 0x5e 0x40 0x5e 0x40 0x5e 0x40 0x5e 0x40。重复次数从一对到最多 256 对不等。
我追溯了这个数据,它源自 tty 内核工作队列。因此,这不是由有错误的驱动程序和未正确初始化的传输队列或沿该线的任何内容引起的。显然,内核在打开系统调用时有意传输此数据。
仅在重新启动后或插入 FTDI USB UART 后首次打开 tty 端口时才会出现此问题。(重新启动会重新启动 USB 设备,因此这两者基本相同。)
是的,我确实意识到 ^@ 意味着“\0”。而且 NULL 还可以用来实现延迟。从手册中:
延迟位指定当某些字符发送到终端时,传输停止多长时间以允许机械或其他运动。在所有情况下,值 0 均表示没有延迟。如果设置了 OFILL,则应延迟传输填充字符,而不是定时延迟。这对于只需要最小延迟的高波特率终端很有用。如果设置了OFDEL,则填充字符为DEL;否则,NUL。
但是,我的 TTY 设置并不表明此类设置处于活动状态:
root@IVW78103 ~$ stty -F /dev/ttyUSB0 -a
speed 9600 baud;stty: /dev/ttyUSB0
line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; …Run Code Online (Sandbox Code Playgroud) 我知道它们有不同的文件描述符,stdxx 可以重定向。
int tty_fd = open("/dev/tty", O_RDWR);
Run Code Online (Sandbox Code Playgroud)
那么,下面的代码有什么区别(stdxx 未重定向):
n = read(tty_fd, buf, sizeof(buf));
n = read(STDIN_FILENO, buf, sizeof(buf));
n = write(tty_fd, buf, sizeof(buf));
n = write(STDOUT_FILENO, buf, sizeof(buf));
Run Code Online (Sandbox Code Playgroud)
stdxx 与 /dev/tty 的链接相同吗?
我升级了我的 Linux(Opensuse 从 42.3 到 15),但遇到了新的错误。当我连接 USB 串行加密狗时,它在开发文件夹中显示 ttyUSB0,并立即断开连接并从开发列表中消失。
似乎都是来自“brltty”,但我不知道这是在做什么。
我的 dmesg 输出是:
[ 960.719371] usb 1-4: new full-speed USB device number 5 using xhci_hcd
[ 960.898481] usb 1-4: New USB device found, idVendor=10c4, idProduct=ea60
[ 960.898483] usb 1-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 960.898484] usb 1-4: Product: CP2102 USB to UART Bridge Controller
[ 960.898485] usb 1-4: Manufacturer: Silicon Labs
[ 960.898486] usb 1-4: SerialNumber: 0001
[ 961.424298] usbcore: registered new interface driver usbserial …Run Code Online (Sandbox Code Playgroud) 我的 pl2303 转换器有问题。我正在使用其中两个,如下所示:
笔记本电脑 <-USB-串行-> <-串行-串行-> <-串行-USB-> RASPBERRYPI
换句话说,我使用两个 USB 转串口转换器并在中间使用空调制解调器将 Raspberry Pi 与我的笔记本电脑连接起来。
我可以通过 minicom 进行通信,“视觉上”它看起来很好(所有信息都正确发送),但是当我查看日志时,它会产生以下 dmesg 输出:
[ 343.390610] pl2303 ttyUSB1: pl2303_get_line_request - failed: -32
[ 343.685367] pl2303 ttyUSB1: error sending break = -32
Run Code Online (Sandbox Code Playgroud)
只要一切正常,我就可以忍受……但事实并非如此。例如,我无法通过 ser2net 与 RPi 连接。“另一方”根本没有收到消息。我怀疑这个错误是导致这个问题的原因。我四处搜寻,但没有找到任何解决方案。有人可以帮我吗?
另外 - 当我尝试通过 ser2net 连接时,有一件事发生了。在那之前我可以做类似的事情
cat -v < /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
和
echo "blablabla" > /dev/ttyUSB0
Run Code Online (Sandbox Code Playgroud)
成功了。当我尝试通过 ser2net 连接后,它停止工作,只有 minicom 通信正常。
在 Linux 中,我可以通过调用 C 来从 USB 设备写入和读取数据fopen('/dev/ttyUSB0', 'rw')
具体来说,Windows 中的目录“/dev/ttyUSB0”相当于什么,我想在 Windows 中为 COM3 执行相同的操作。
我读过很多关于 tty 的帖子。都是从tty这个名字的历史原因说起。请忽略这一点,只描述目前存在的 tty 系统。然后他们讨论 tty 是一个文件,并且在终端中启动的进程的 stdin、stdout 和 sterr 都映射到该文件。三个文件如何映射到一个文件?
有人说 tty 允许在按下 Enter 键之前进行行编辑,并执行其他行规则操作。有一篇博客文章说每个 tty 都有自己的 stdin 和 stdout 。Linus Akesson 的博客文章(我仍在努力解决)解释说,内核中实际上有一个 tty 驱动程序和一个 tty 设备文件。然后是控制终端、会话、终端仿真器、原始模式和熟模式、pty 等等。
为了更好地理解 tty 是什么,有人可以向我解释一下在这个简单的情况下会发生什么:打开一个终端并运行默认的 shell。从 shell 运行一个进程并要求输入。
输出部分:当同一个进程输出某些内容时,它是否写入tty设备?但是tty不是已经输出当前编辑缓冲区行了吗?
如果有更好的方法来描述 tty 的作用而不回答上述问题,那么请这样做。如果我错过了一些关键部分,请填写您认为必要的部分。
我有这个 docker-compose 服务,我正在尝试使其工作。
app:
build: ./
volumes:
- .:/app:delegated
devices:
- ${DEVICE:-/dev/null}:-/dev/ttyUSB*
Run Code Online (Sandbox Code Playgroud)
运行时响应docker-compose up app
Error response from daemon: error gathering device information while adding custom device "/dev/ttyUSB*": no such file or directory
Run Code Online (Sandbox Code Playgroud)
这里的想法是从本地获取所有匹配的设备/dev/ttyUSB*并在容器内创建它们。这样我就可以在容器中拥有 0-N 个设备,处理没有设备连接时的场景。我也不必知道每个设备的tty<id>
我读过一些旧答案,例如: 在 docker-compose 中映射所有可用设备 ,但这些要么使用
--privileged或者不回答如何复制和访问(所有|无设备)的问题。
我知道:
Error response from daemon: error gathering device information while adding custom device "/dev/ttyUSB*": no such file or directory
Run Code Online (Sandbox Code Playgroud)
有效,但当设备被分配不同的编号时无效,因此需要将它们全部映射。
使用以下代码:
use strict;
use warnings;
use utf8;
use IO::Pty;
use Data::Dump qw(pp);
my $pty = IO::Pty->new;
open *STDOUT, '>&', $pty->slave;
if ( my $pid = open *STDOUT, '|-' ) {
# parent
my $str = "foo\n";
print {*STDERR} "parent [1]: ", pp($str), "\n";
print {*STDOUT} $str;
my $line = <$pty>;
print {*STDERR} "parent [2]: ", pp($line), "\n";
} else {
# child
while (<>) {
print {*STDERR} "child [1]: ", pp($_), "\n";
s/foo/bar/;
print {*STDERR} "child [2]: ", pp($_), "\n"; …Run Code Online (Sandbox Code Playgroud) 我找不到任何简单地使用Node.JS在机器上读取串口的例子,似乎我不是唯一一个看的人.
最近它是一个包含的图书馆,但我不能做它的头或尾!
http://nodejs.org/docs/v0.3.8/api/tty.html
有没有人有一个简单的读取串口,只是console.log输出的例子?