使用Linux bash将DTR设置为高,RTS为低?

时间:2014-07-22 11:30:16

标签: stty

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

我希望使用简单的bash脚本读取此设备,但无法使用stty或其他方式设置握手线以允许上述配置。

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

3 个答案:

答案 0 :(得分:0)

我没有得到关于在不接触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论坛。

答案 1 :(得分:0)

当hucpcl = 1时,socat控制DTR

(Atmel EDBG USB串行需要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-可能会找到更多解决您序列问题的方法。

答案 2 :(得分:0)

我在这里尝试过类似的方法。 我用了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);

有点奇怪...