직렬 모니터를 시작하면 왜 스케치가 다시 시작됩니까?


31

직렬 데이터를 전송하는 스케치를 업로드하면 스케치가 업로드되면 TX / RX LED가 즉시 깜박입니다. 그런 다음 직렬 모니터를 시작하면 스케치가 다시 시작된 것으로 나타납니다.

이 동작을 보여주는 최소한의 스케치 :

void setup()
{
    Serial.begin(9600);
    Serial.println("Setup");
}

void loop()
{
  Serial.println("Loop");
  delay(1000);
}

여러 보드와 IDE의 Mac 및 Windows 버전으로 테스트되었습니다.

출력 예-직렬 모니터를 열면 "설정"으로 돌아갑니다.

재시작

왜 이런거야?


5
나는 직렬을 사용하는 스케치가 이것을하지 않는 것을 본 적이 없으므로 말 그대로 스케치입니다.
Cybergibbons



별도의 문제가 있습니다. Arduino 레오 스틱 (및 기타)은 더 이상 자동 재설정되지 않습니다. 그것을 어떻게 재사용 할 수 있습니까?
CMCDragonkai

답변:


33

Arduino는 RTS (Request To Send) (그리고 DTR (Data Terminal Ready) ) 신호를 사용하여 자동 재설정합니다. 흐름 제어 설정을 변경할 수있는 직렬 터미널이있는 경우이 기능을 변경할 수 있습니다.

Arduino 터미널은 많은 옵션을 제공하지 않으며 이것이 기본값입니다. 다른 것들은 훨씬 더 구성 할 수 있습니다. 흐름 제어를 없음으로 설정하면 보드를 재설정하지 않고 직렬에서 연결 / 분리 할 수 ​​있습니다. 커넥터를 꽂고 스케치를 시작하지 않고도 출력을 볼 수 있기를 원할 때 디버깅에 매우 유용합니다.

자동 리셋을 비활성화하는 또 다른 방법은 리셋 핀에 풀업 저항을 배치하는 것입니다.

직렬 연결에서 자동 재설정 비활성화


2
Arduino Unos는 RESET 및 GND에서 10µF 커패시터로 고정 될 수 있습니다. 그것은 지금까지 내가 사용한 하나의 설치에서 작동합니다…
scruss

1
PuTTY를 사용 하여 Arduino가 나타나는 COM 포트 (내 경우에는 COM16)에 연결 하려고했습니다 . Connection / Serial의 "Flow control"이 "None"으로 설정된 경우 Arduino가 여전히 재설정됩니다 (다른 옵션은 "XON / XOFF", "RTS / CTS"및 "DSR / DTR"). PuTTY 0.60 버전을 사용했습니다.
Peter Mortensen

-cont : Arduino Uno R3에서 시도했습니다.
Peter Mortensen

Duemilanove 및 Uno에는이 동작을 제어하는 ​​"EN RESET"이라는 레이블이 있습니다. 자동 재설정을 비활성화하려면 해당 추적을 긁습니다. 패드를 가로 질러 와이어를 납땜하여 다시 활성화하십시오.
mhopeng

12

진실은 항상 데이터 시트, 회로도 및 코드에 있습니다.

Arduino UNO는 실제로 /DTR다음 데이터 시트에서 볼 수 있듯이 라인을 사용하여 재설정을 트리거합니다.

회로도 재설정


회로도 이미지에 대한 링크가 손상되었습니다.
linhartr22

1
고마워요, 고 쳤어요! 나는 실제로 SO가 이미지를 캐싱한다고 생각했지만 그렇지 않은 것처럼 보이기 때문에 항상 계속 유지할 것입니다.
zmo

다시 한 번 깨졌습니다. 아마도 StackExchange의 imgur 옵션을 사용하여 이미지로 추가 할 수 있습니까? 편집기 툴바에서 '이미지'옵션을 클릭하십시오.

끝으로 감사의 말을 전합니다 (일시적으로 유지 관리 작업을 수행했기 때문에 실제로 10 일 동안 자체 사이트를 다운했습니다)
zmo

1
예,하지만 실제로 어떻게됩니까? ATmega16U2가 프로그래밍되는 방식 때문입니까 (프로그램이 COM 포트를 열 때 PD7이 낮게 설정되어 있습니까?) 또는 DTR에 대한 표준을 따릅니 까?). 그리고 C5의 의미는 무엇입니까? -두 전환 모두에 대해 메인 프로세서를 재설정합니까 (낮음에서 높음 및 높음에서 낮음)? 메인 프로세서의 리셋 핀에서 대략적인 펄스 폭 (마이크로 초)은 얼마입니까?
Peter Mortensen

1

이것은 문제를 해결합니다

import os
import sys
import termios
import fcntl

        self.fd = sys.stdin.fileno()

        # Stop resetting the arduino on serial connect

        self.newattr = termios.tcgetattr(self.fd)
        self.newattr[2] = self.newattr[2] & ~termios.HUPCL
        termios.tcsetattr(self.fd, termios.TCSANOW, self.newattr)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.