ttyUSB0에서 DTR 비활성화


11

Pi에서 Arduino 클론 보드로 연결하고 있습니다. 문제는 연결시 Arduino가 재설정되지 않도록 DTR 회선을 비활성화해야한다는 것입니다.

RPi에서 DTR, DCD 및 기타 회선을 제어 할 수 없다는 것을 읽었습니다. 전 세계적으로 RPi 또는 직렬 통신에 사용되는 GPIO 핀에만 해당됩니까?

USB 포트에서 DTR을 비활성화 할 수 있다면 어떻게해야합니까?

답변:


6

USB 직렬 변환기의 속성은 호스팅 시스템의 하드웨어와 는 관련 이 없지만 USB 직렬 칩 자체와 호스팅 시스템의 소프트웨어 스택과는 관련이 없습니다.

파이는 재고 Linux USB 직렬 드라이버를 사용해야합니다.

따라서 hupclArduino 사이트 및 다른 곳에서 문서화 된 일반적인 Linux 방법을 통해 DTR의 포트 열기 / 닫기 연결을 활성화 / 비활성화 할 수 있습니다 .

stty -F /dev/ttyUSB0 -hupcl

또는 / dev / ttyUSB0을 실제로 USB 직렬 포트에 해당하는 장치 파일로 바꾸십시오 (예 : 첫 번째 Uno 연결은 / dev / ttyACM0 일 수 있음)

PI 자체의 고유 직렬 포트와 관련하여 DTR의 이러한 동작은 궁극적으로 소프트웨어 제어하에 있습니다. 다른 주장을하는 사람은 포트에 대한 지식이있는 하드웨어가 아니라 Linux 드라이버라는 사실을 무시하고 있습니다 열거 나 닫았습니다. 실제 포트 하드웨어는 직렬 장치를 여는 것과 동의어가 아닌 것으로 읽거나 쓰거나 재구성 중임을 알 수 있습니다.


호스팅 pi가 다시 시작되지 않는 한이 기능 만 작동합니까?
user2395126

6

@ChrisStrattons poststty -F /dev/ttyUSB0 는 끊기를 방지하기 위해 사용하는 방법을 설명합니다 . 다음은 파이썬에서 수행하는 스 니펫입니다.

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 케이블을 다시 꽂을 때 정확한 숫자가 표시 될 수 있으므로 globbing을 통해 경로를 감지합니다.

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

나는 이것이 일반적인 x86_64 랩탑과 Raspberry Pi 2에서 우분투에서 작동한다는 것을 확인했다.
Cerin

사용하는 어떤 이유가 termios이상은 말 os.system("stty -F /dev/ttyUSB0 -hupcl")? 또한 btw, 호스트 시스템의 전원을 켠 후 처음 연결할 때 Arduino가 재설정되는 것을 막을 수는 없습니다. 후속 연결시 재설정되지 않습니다. 아무것도 아닌 것보다 낫습니다. 그러나 DTR 전환을 막는 방법을 알아낼 수 있기를 바랍니다.
Jason C

2
@JasonC Using termios는 포크 / 실행 (호출)을 외부 프로그램 ( stty)에 저장합니다. DTR에 대해 어떻게해야할지 모르겠지만 방금이 "기능"을 수락하고 Arduino와 Pi의 응용 프로그램이 동기화되었는지 여부를 감지하는 몇 가지 논리 (쓰기 / 읽기를 통한 사용자 지정 핸드 셰이크)를 추가했다고 생각합니다.
Lekensteyn

필자의 궁극적 인 해결책은 pi가 부팅 할 때 stty 명령을 추가 한 다음 에코를 포트에 추가하여 첫 번째 재설정을 강제하고 3 초 지연하여 arduino 재설정을 기다리는 것입니다. 그런 다음 더 이상 그것에 대해 생각하거나 파이썬 스크립트에서 그것에 대해 걱정할 필요가 없습니다. 나는 rc.local에서 그것을했지만 어디에서나했다. 비용은 +3 초 파이 부팅 시간입니다.
Jason C

3

당신은 120Ω의 저항 사이 (또는 조합이 120Ω의를 만들기 위해) 추가 할 수 있습니다 RESET5V이 완전히 재설정 방지 할 수 있습니다. 다른 솔루션이 보드에서 저항이나 커패시터를 제거해야하므로 업로드가 복잡해지기 때문에 이는 가장 침습적입니다. 프로그래밍중인 경우 저항을 유지하지 마십시오. 제거하십시오.

여기에 이미지 설명을 입력하십시오

Leonardo 보드 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

이것이 다른 리눅스에서 작동하는 것에 대한 정확한 진술이라면, pi 하드웨어는 일반적인 리눅스 소프트웨어 만을 호스팅 하고 고유하게 관여하지 않기 때문에 pi에서도 작동해야합니다 .
Chris Stratton

1
작동하지 않습니다. Linux에서는 여전히 Arduino가 재설정됩니다.
Cerin

1
내가 가지고있는 Pi와 Arduino의 모든 버전에서 작동하지 않는다는 것을 확인할 수 있습니다. 또한 관련이 있는지 확실하지 않지만 stty -F /dev/ttyUSB0 -cdtrdsr보고합니다 invalid argument: -cdtrdsr.
Jason C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.