2008-10-12 6 views
5

직렬 포트를 통해 Python 스크립트로 Arduino에서 명령을 보내고받습니다.직렬 포트가 수신 중인지 확인하십시오.

Arduino는 버튼 상태를 취하고 푸시되면 직렬 포트를 통해 Python 스크립트로 메시지를 보내고 응답을 기다립니다. (Serial.available() 경유). 그것은 충분히 잘 작동합니다.

그러나 Python 스크립트가 어떤 이유로 든 추락하면 (이상적으로 백그라운드에서 실행되므로 쉽게 확인할 수 없음) Arduino는 영원히 기다리고 스크립트를 다시 시작하더라도 사용할 수 없게됩니다.

Arduino가 직렬 포트에서 수신 대기중인 것이 있는지 확인하는 방법이 있습니까? (그리고 깜박이는 불빛으로 나를 알려라. 그렇지 않다면) 아니면 직렬 방식이 아닌가? 최악의 경우는 이상적인 것은 아니지만 시간 제한을 사용할 수 있다고 생각합니다.

답변

6

DSR/DTR 핀을 사용하여 상대방에서 청취하는 것이 있는지 여부를 감지하는 기능이 제한되어 있습니다.

스크립트가 실행되는 컴퓨터에서 직렬 포트를 열면 DTR 핀이 올라와야합니다 (그렇지 않으면 COM 포트를 구동하는 데 사용하는 라이브러리의 설명서는 다음과 같아야합니다. 어떻게 말해?).

Arduino에서 규칙적인 간격으로 PC DTR 핀이 Arduino의 DSR + CD에 연결된 DSR 핀 (핸드 쉐이킹을 사용하는 널 모뎀 배선을 가정)을 점검하고 '아무도 연결되어 있지 않습니다. '시나리오가 어떤 방식 으로든 적합하다고 생각합니다.

이 접근법의 한 가지 문제점은 PC 스크립트가 충돌/응답하지 않을 때 직렬 포트를 닫지 않아서 DTR 핀이 모든 것이 여전히 정상인 것처럼 활성화되도록하는 것입니다. 또한 스크립트는 직렬 회선의 오류로 인해 Arduino의 메시지를 놓칠 수 있습니다.

그 이유는 항상은 수신 루틴에 시간 제한을 구현해야합니다. 상대방의 청취자가 있더라도 메시지를 수신했다는 보장이 없거나 응답이 사용자에게 전달된다는 보장이 없습니다. 손대지 않은).

시간 초과가 발생하면 적어도 한 번 메시지를 다시 보내면 (DSR이 발생했다고 가정) 프로토콜의 안정성이 향상됩니다.

+0

건배 메이트. 흥미로운 점으로, Google은 게시 한 후 3 분 내에 응답을 선택했습니다. – Hyposaurus

+0

제프 앳 우드 (Jeff Atwood)는 Google이이 사이트 트래픽의 약 50 %를 차지하고 있다고 말했습니다. (Dang은 트윗을 찾을 수 없습니다. 오늘은 내 Google foo가 작동하지 않습니다.) –

+0

시작 힌트를 보내 주셔서 감사합니다.하지만 불행히도 더 이상 얻을 수있는 정보는 찾을 수 없습니다. Arduino의 DSR 핀에 액세스하는 방법을 몇 가지 예제 코드로 제공 할 수 있습니까? 건배! – RngTng

0

시간 제한이 필요하지만 사용자가 듣고 있는지 정기적으로 확인하는 간단한 챌린지/응답 시스템을 구현할 수도 있다는 점에 동의합니다. (나는 ircd의 Ping-Pong 유추를 좋아한다).

1

Arduino는 DSR 회선이나 기타 핸드 쉐이킹 라인을 사용하지 않으므로 사용자가 제안한 것을 수행 할 수 없습니다.

관련 문제