Answers:
USB串行转换器的属性与主机系统的硬件无关,而与USB串行芯片本身以及主机系统的软件堆栈无关。
pi应该使用库存的Linux USB串行驱动程序。
因此,您可以通过hupcl
Arduino网站和其他地方记录的清除设置的常规Linux方法启用/禁用DTR与端口打开/关闭的链接:
stty -F /dev/ttyUSB0 -hupcl
或将/ dev / ttyUSB0替换为实际上与您的USB串行端口相对应的任何设备文件(例如,连接的第一个Uno可能是/ dev / ttyACM0)
即使对于PI自己的本机串行端口,DTR的这种行为最终仍受软件控制-否则,任何人争辩说都忽略了事实,即只有Linux驱动程序而不是硬件才知道该端口是打开或关闭。实际的端口硬件只能告诉您正在对其进行读取,写入或重新配置,但实际上这些都不与打开串行设备同义。
@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
termios
用完os.system("stty -F /dev/ttyUSB0 -hupcl")
吗?另外,顺便说一句,我注意到这并不能防止在主机系统开机后第一次连接到Arduino时复位。它防止它在后续连接上重置。总比没有好。但我希望我能弄清楚如何阻止它切换DTR。
termios
将fork / exec(调用)保存到外部程序(stty
)。不确定如何处理DTR,我想我只是接受了这一“功能”并添加了一些逻辑(通过写/读进行自定义握手)来检测Arduino和Pi上的应用程序是否同步。
您可以使用PySerial。这是关于Python代码的示例:
port =serial.Serial(
"/dev/ttyUSB0",
baudrate=57600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
dsrdtr = False
)
有关更多选项,请检查Pyserial。
stty -F /dev/ttyUSB0 -cdtrdsr
报告invalid argument: -cdtrdsr
。