我正在尝试将一些十六进制值发送到 tty 端口/dev/ttyS2。当我使用echoorprintf \x0A它会\x0D在\x0A.
i=1
a=$(printf "\xAA\xEE\x0A\x%02x" $i)
echo -ne "$a" > /dev/ttyS2
Run Code Online (Sandbox Code Playgroud)
我在终端/串行端口上得到了这个——注意额外的 0D。我怎样才能删除它?
我有一个通过串行线和两个以太网 NIC 连接的高可用性集群 (Heartbeat)。我想设置一个能够识别断开的串行线路的监控脚本(基本上在 SO 上回答了相同的问题,但是我对这样的一般答案不满意)。
我不能简单地打开串行设备并自己读取数据,因为串行线是由 Heartbeat 打开的。
于是我开始寻找一些间接的线索。到目前为止,我发现的唯一区别在于/proc/tty/driver/serial. 这是连接后的样子:
# cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:2722759 rx:2718165 brk:1 RTS|CTS|DTR|DSR|CD
Run Code Online (Sandbox Code Playgroud)
当断开连接时:
# cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:2725233 rx:2720703 brk:1 RTS|DTR
Run Code Online (Sandbox Code Playgroud)
我没有足够的信心来决定线路末尾列出的信号是否具有连接/断开电缆的真正含义,因为我没有找到任何关于 /proc/tty/driver/serial 内容的文档。我只能假设信号的存在意味着给定的信号是“现在”(或最近?或?)。所述串行HOWTO说,当电缆被连接(CTS流量控制信号,DSR“我准备好进行通信”,CD“调制解调器连接到另一个”)附加信号呈现都在“输入”的方向。因此,另一端必须有人活着。
假设信号的含义如 Serial HOWTO 中所述,我可以根据是否存在 CD 信号做出决定。不过我不太确定。
所以问题是:我的方法是“正确的”,还是我不知道有更好的选择?
编辑: 我做了一些额外的观察,并与我的同事进行了交谈。结果表明,线路末端是否存在信号是两端串行端口活动的良好指标。但是,它不是电缆物理存在的指标。每当有程序写入串行端口输出信号时,就会出现 (RTS|DTR)。当另一端写入输入信号时,出现 (CTS|DSR|CD)。当双方都没有通信时,根本没有信号(这并不一定意味着没有电缆存在)。不要忘记确切的信号取决于电缆的接线(我有“带部分握手的空调制解调器”)。
我有两个(将来可能还会有更多)USB 串行设备,它们是相同的(不幸的是,直到序列号)——它们实际上是 BTC 矿工。目前,它们最终以ttyUSBXX 为 0、1 或 2 的位置结束,因为还有另一个不相关的 USB 串行设备(此处无需担心)。
我想编写一个 udev 规则,它将在 内为它们分配可预测的名称/dev,例如/dev/miner0零是递增的整数。我不在乎它们中的哪一个最终变成了哪一个,但我确实需要它们在一个不会改变的可预测范围内。
目前我有这个:
SUBSYSTEM=="tty", ATTRS{idVendor}=="10c4", ATTRS{idProduct}=="ea60", SYMLINK+="miner%n"
Run Code Online (Sandbox Code Playgroud)
这非常接近,因为我最终得到了我想要的名字。唯一的问题是,由于矿工和第三个设备有时会以随机顺序出现,我最终可能会得到两个miner0,miner1和miner2,但我永远不知道是哪两个(无需手动查看)。如果我添加更多非矿工 USB 串行设备(这是可能的),它会加剧问题。
我找到了参考%e,看起来它完全符合我的要求,但它似乎不再存在。
我如何为这些设备提供可预测的名称?如果可能的话,我也不想将它们与它们在 USB 总线上的位置联系起来。
更多信息/背景
值得一提的是,我并不关心这些名称是什么,只是即使/当设备插入不同的 USB 插座时,它们也是已知的并且不会改变。我会简单地忘记整个 udev 内容并使用 中的条目/dev/serial/by-id,但是由于它们具有相同的序列号,因此其中只有一个!
还值得一提的是,这样做的原因是挖矿软件需要被告知要探测和查找的设备列表。我可以让它做所有事情(它基本上只是找到ttyUSB*范围内的所有有效矿工),但这会惹恼非矿工设备。所以我需要提前知道矿工的名字,以便我可以配置它只使用那些。遗憾的是它不会接受通配符(所以只是告诉它使用/dev/miner*似乎是不可能的),因此出现了这个问题。
我需要制作一个相当简单的 bash 脚本,一次从二进制文件中提取一个字节,将其发送到串行端口,然后等待一个字节返回,然后再发送下一个。这对于 EEPROM 编程器非常有效,在这种情况下,现成的解决方案将不起作用。
我主要是把字节从文件中提取到一个变量中,除此之外我知道我可以通过串行端口回显这些值并用 dd 读回它们。(有没有更好的方法来做到这一点?)
谢谢您的帮助!
我有一个/dev/ttyS2连接到主管的串行端口。通常,我使用这条线在 CPU 和主管之间来回发送命令。
但是,在某些设置下,我只想将整个控制台重定向到此端口。
我可以通过重新启动并将 uBoot 内核变量更新为 direct 来实现这一点console=ttyS2,115200。但是有没有办法在不重启的情况下实现这一目标?
我在定制板上有一个嵌入式 Linux,我想通过其串行端口发送和接收文件。
与该设备进行通信的唯一方式是通过串行,并且该设备在该串行端口上提供了一个控制台。
这个板子kermit既没有busybox rx也没有lrzsz。
- 发送文件到远程
我能够按照此线程将文件发送到董事会。
Host side Remote side
cat file | base64 > file_b64
cat > file_b64
minicom's ctrlA-S => send 'file_b64'
cat file_b64 | base64 --decode > file
Run Code Online (Sandbox Code Playgroud)
- 从远程获取文件
现在我想从远程系统检索文件。
Minicom 有一个接收文件的工具,但由于我只有串行端口的控制台使用 minicom 在远程端发出命令,我找不到如何去做。
我曾尝试在主机端使用 kermit,但似乎我还需要在远程端使用 kermit。
编辑:
我也尝试反转发送方法,但没有成功,因为我从主机端的串行端口没有收到任何信息。
Host side Remote side
cat file | base64 > file_b64
(sleep 10; cat file_b64 > /dev/ttyS0) &
minicom's ctrlA-X => exit minicom
cat /dev/ttyUSB0 > file_b64
Run Code Online (Sandbox Code Playgroud)
无法使用Minicom的接收工具,因为它仅支持 …
我在 192.168.xx:yyyy(其中“x”和“y”是实数)上有一个串行设备,它工作正常。但我想与它作为/dev/ttyX设备进行通信。
我已经测试了socat命令但不能正常工作
$ while true; do
socat pty,link=/dev/ttyX,raw,echo=0,waitslave tcp:192.168.x.x:yyyy;
done
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
我实际上使用的是 Cygwin,但我的理解是它响应 Unix 命令,所以希望我在正确的位置。
我有一个 Arduino 通过 USB 连接到我的笔记本电脑以读取数据。
我希望能够同时将串行端口数据输出到外壳供我查看,并将所有数据保存为文本文件。
是否有我可以使用的命令来执行此操作?
我有一个基于TrueRNG USB 的硬件 RNG,我正在尝试在 Mac OS X 10.9.2 上读取它的输出。我只需要单向沟通。
该设备说它显示为“CDC 虚拟串行端口”,实际上我将其视为/dev/tty.usbmodem1411.
我从来没能做到cat /dev/tty.usbmodem1411;当我这样做时,我根本没有输出。但是,我可以使用minicom或picocom阅读它。使用picocom,它甚至可以使用--noinit --noreset选项,这表明我应该能够使用cat该设备。
所以,我的问题/问题:
cat那个设备?minicomand picocom,但它只适用于第一个会话:如果我关闭这些程序中的任何一个,然后重新打开它们,那么它们读取大约 300 个字节并永远阻塞。如果我关闭并再次重新打开,他们将无法阅读任何内容。但是,当我拔下并重新插入 USB 设备时,它在第一次尝试时再次可读。为什么会这样,这是否与 TrueRNG 文档中的引用有关?“通过清除虚拟串口上的 DTR 标志,数据流将停止。当 DTR 被设置时,数据流将恢复。”picocom /dev/tty.usbmodem1411 | xxd -p。然而,输出似乎不尊重换行符;只是回车。它移动到下一行而不倒回到行的开头。我更喜欢它是连续的。以下是一些诊断:
% stty -a -f /dev/tty.usbmodem1411
speed 9600 baud; 0 rows; 0 columns;
lflags: -icanon -isig -iexten -echo -echoe -echok -echoke …Run Code Online (Sandbox Code Playgroud) 我目前正在研究一个串行端口库,它已经使用特殊框架来获取有关系统上串行端口的信息。虽然串行端口在基本设计Unix的一个答案,例如这一个证明,我认为,一个好办法,测试文件是否是一个串行端口是通过测试字符设备和检查的主要模式,这是否真的是一个TTY与否。
在互联网上爬行,我找不到任何关于TTYs 跨 unice的主要模式的文档。嗯,只有一个 Linux 手册页说明 ptmx 具有主要模式 5。
虽然我已经问基于TTY字符设备的实现细节,这个堆栈溢出 的问题,我想我可能会问了Unix堆栈交流社区,了解如何将TTY值稳定是跨越Unix操作系统。
因此,我请求您帮助建立系统上所有 tty 文件的主要模式的知识库,即:什么是主要模式
PTS) 端口?FTDI USB 串口?USB串口?要获取字符设备的主要模式的值,您应该使用:
% stat -f " * %N: %Hr%n" /dev/tty* /dev/pts/*
* /dev/ttys001: 16
^^- major mode
Run Code Online (Sandbox Code Playgroud)
或使用好旧ls:
% ls -l /dev/ttys001
crw--w---- 1 <user> tty 16, 1 Apr 30 03:25 /dev/ttys001
major mode -^^ ^^- minor mode
Run Code Online (Sandbox Code Playgroud)
您可以将信息作为您自己的答案,或使用其他信息扩展社区 wiki 答案。