在ttyUSB0上禁用DTR


11

我正在从Pi连接到Arduino克隆板。问题是,我需要禁用DTR线,以防止Arduino在连接时重置。

我读过在RPi上无法控制DTR,DCD和其他线路。对于全局RPi还是仅对用于串行通信的GPIO引脚是这样吗?

如果可以禁用USB端口上的DTR,该如何完成?

Answers:


6

USB串行转换器的属性与主机系统的硬件无关,而与USB串行芯片本身以及主机系统的软件堆栈无关

pi应该使用库存的Linux USB串行驱动程序。

因此,您可以通过hupclArduino网站和其他地方记录的清除设置的常规Linux方法启用/禁用DTR与端口打开/关闭的链接:

stty -F /dev/ttyUSB0 -hupcl

或将/ dev / ttyUSB0替换为实际上与您的USB串行端口相对应的任何设备文件(例如,连接的第一个Uno可能是/ dev / ttyACM0)

即使对于PI自己的本机串行端口,DTR的这种行为最终仍受软件控制-否则,任何人争辩说都忽略了事实,即只有Linux驱动程序而不是硬件才知道该端口是打开或关闭。实际的端口硬件只能告诉您正在对其进行读取,写入或重新配置,但实际上这些都不与打开串行设备同义。


仅在不重新启动托管pi的情况下这才有效吗?
user2395126

6

@ChrisStrattons帖子描述了如何使用stty -F /dev/ttyUSB0以避免挂断导致重置的方法。这是在Python中执行的代码段:

import termios

path = '/dev/ttyACM0'

# Disable reset after hangup
with open(path) as f:
    attrs = termios.tcgetattr(f)
    attrs[2] = attrs[2] & ~termios.HUPCL
    termios.tcsetattr(f, termios.TCSAFLUSH, attrs)

ser = serial.Serial(path, 9600)
# etc.

请注意,确切的数字可能在重新插入USB电缆时出现,因此我通过遍历来检测路径:

try:
    path = glob.glob('/dev/ttyACM*')[0]
except IndexError:
    # retry, error out, etc.
    pass

我已经证实,这个工程在Ubuntu上无论是普通x86_64的笔记本电脑和树莓派2
Cerin

有什么理由要termios用完os.system("stty -F /dev/ttyUSB0 -hupcl")吗?另外,顺便说一句,我注意到这并不能防止在主机系统开机后第一次连接到Arduino时复位。它防止它在后续连接上重置。总比没有好。但我希望我能弄清楚如何阻止它切换DTR。
杰森C

2
@JasonC Using termios将fork / exec(调用)保存到外部程序(stty)。不确定如何处理DTR,我想我只是接受了这一“功能”并添加了一些逻辑(通过写/读进行自定义握手)来检测Arduino和Pi上的应用程序是否同步。
Lekensteyn '16

我的最终解决方案是在pi启动时添加stty命令,然后在端口上执行回显以强制进行第一次重置,并等待3秒钟等待arduino重置。然后,我不必再考虑它,也不必在Python脚本中担心它。我在rc.local中做到了,但是无论在哪里。成本是+3秒pi启动时间。
Jason C

3

您可以在RESET和之间添加一个120Ohm(或组合使用以形成120Ohm)的电阻器,5V这将完全阻止复位。这是侵入性最小的,因为其他解决方案需要从板上移除电阻器或电容器,这会使上传变得复杂。如果要编程,请不要保留电阻。去掉它。

在此处输入图片说明

莱昂纳多板即使DTR被触发也不会复位,但是问题开始于您需要远程复位时,有时它会失去与Raspberry的连接,并且您必须进行物理复位。


3
我不确定这是否值得批评。它很烂,并且不是基于软件的,但是经过一些研究,它似乎是可行的硬件解决方案。
Jason C

0

如果您使用Seria和pySerial库,则可以使用:

ser = serial.Serial('/ dev / ttyACM0',9600,dsrdtr = True)


-1

您可以使用PySerial。这是关于Python代码的示例:

port =serial.Serial(
    "/dev/ttyUSB0",
    baudrate=57600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    dsrdtr = False
    )

有关更多选项,请检查Pyserial。


1
这不是图书馆的问题。我已经尝试了4个不同的库,总是得到相同的结果-DTR命令被忽略。
jnovacho

如果这是对可以在其他Linux上运行的某些东西的准确陈述,那么它也应该在pi上运行,因为pi硬件仅托管通用 linux软件,并且没有唯一的参与。
克里斯·斯特拉顿

1
这行不通。在Linux上,这仍然会导致Arduino重置。
塞林

1
可以确认这在我拥有的任何版本的Pi和Arduino上均不起作用(我不知道,对不起,我不知道这些事情,我不想知道,我只是得到了一个调试某些代码的系统,等等。)此外,不确定是否相关,但要stty -F /dev/ttyUSB0 -cdtrdsr报告invalid argument: -cdtrdsr
Jason C
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.