【问题标题】:Setting DTR high, RTS low using Linux bash?使用 Linux bash 将 DTR 设置为高,RTS 设置为低?
【发布时间】:2014-07-22 11:30:15
【问题描述】:

我有一个没有流量控制的串行设备,但通过保持 RTS 高 和 DTR 低 由 RS232 端口供电

我希望使用简单的 bash 脚本从该设备读取,但找不到任何方法来设置握手线,使用 stty 或其他方式,以允许上述配置。

如果可能的话,有什么想法吗?

【问题讨论】:

  • 当然可以,但需要设备驱动支持。您使用的是什么设备驱动程序?
  • 我正在使用其中之一:moxa.com/product/UC-7112_UC-7110.htm 我总是可以在硬件中“修复”它,只需将这些线直接连接到电源......但如果可能的话最好不要!跨度>
  • MOXA MU860 UART Device Driver version 2.0 Tty devices major number = 30 Register IO misc ver1.0 OK。通用 Moxa RC7000 RTC 驱动程序 v1.0 注册 Moxa misc ver1.0 OK。初始化。 (nowayout=0) 已初始化。 (debug=0) (C)2004-2005 Moxa Inc. Crypto Driver at /dev/mxcrypto 10 Serial: 8250/16550 driver $Revision: 1.90 $ 4 个端口,IRQ 共享在 I/O 0xf9820000 (irq = 31) 处启用 ttyS0是 I/O 0xf9820020 (irq = 31) 处的 16550A ttyS1 是 16550A
  • 是否可以向设备驱动程序发送特定命令来控制这些行?由于设备驱动程序命令接口非常低级,您可能需要一个小程序来格式化和发送命令。
  • 你确定解决方案了吗?

标签: stty


【解决方案1】:

我没有关于在不接触 DTR 的情况下设置 RTS 的答案,因为我的加密狗上没有任何 DTR 引脚;但是,尝试设置 RTS 在纯 shell 中已经非常棘手了。

您可能需要使用 stty crtscts 和 clocal 标志。

我在这里发布了详细的答案: https://forums.gentoo.org/viewtopic-p-8132756.html#8132756

这是简短的版本:

#!/bin/bash
MySerialPort="/dev/ttyUSB0"
MyLatency="2"
echo "#include <fcntl.h>
#include <sys/ioctl.h>
main()
{ int fd; fd = open(\"${MySerialPort}\",O_RDWR | O_NOCTTY );
int RTS_flag; RTS_flag = TIOCM_RTS;
ioctl(fd,TIOCMBIS,&RTS_flag);
sleep (${MyLatency});
ioctl(fd,TIOCMBIC,&RTS_flag);
close(fd); } " | tcc -run -

请注意,在 TX 上发送数据可能会弄乱 RTS;有关详细信息,请参阅 Gentoo 论坛。

【讨论】:

    【解决方案2】:

    我一直在这里尝试类似的东西。 我使用了ioctl。然后用万用表测量。 这是我发现的:

      dsrv=TIOCM_DTR;//this sets RTS to -11.7?
      dsrv=TIOCM_RTS;//sets DTR -11.7
      ioctl(fd, TIOCMBIS, &dsrv);
    
      dsrv=TIOCM_DTR;//this sets RTS to 11.7?
      dsrv=TIOCM_RTS;//sets DTR 11.7
      ioctl(fd, TIOCMBIC, &dsrv);
    

    有点奇怪……

    【讨论】:

    • 请忽略我的上一篇文章。这是不正确的。我被 open() 绊倒并关闭了 DTR 线以及反转。打开将 DTR 设置为负电压,清除 TIOCM_DTR 也是如此。设置 TIOCM_DTR 设置一个正电压,并且在关闭的端口上也可以观察到。
    【解决方案3】:

    当 hucpcl=1 时,socat 控制 DTR

    (Atmel EDBG USB Serial 需要 DTR 高)

    sleep 1; while true; do echo -en "\x01\x02"; sleep 0.1; done | socat -T1 -t1 - /dev/ttyUSB0,hupcl=1,raw,b1000000,cs8,echo=0
    

    man socat - 可能会为您的串行问题找到更多解决方案。

    【讨论】:

    • 请解释一下您的代码为何以及如何工作,以便经验不足的程序员能够完全理解它
    猜你喜欢
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2018-12-29
    相关资源
    最近更新 更多