문제

Arduino가 직렬 포트를 통해 Python 스크립트로 지침을 보내고받습니다.

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

그러나 Python 스크립트가 어떤 이유로 든 충돌 한 경우 (이상적으로는 배경에서 실행되므로 쉽게 확인할 수 없음) Arduino는 영원히 기다리며 스크립트 재시작에서도 사용할 수 없습니다.

내 Arduino가 직렬 포트에 듣고 있는지 확인하는 방법이 있습니까? (그리고 깜박이는 조명 등으로 나를 알리십시오. 최악의 경우 타임 아웃을 사용할 수 있다고 생각하지만 이상적이지는 않지만.

도움이 되었습니까?

해결책

DSR/DTR 핀을 사용하여 다른쪽에 듣는 것이 있는지 감지 할 수있는 능력이 제한되어 있습니다.

컴퓨터에서 직렬 포트를 열면 스크립트가 실행되면 DTR 핀을 올리십시오 (또는 그렇게하도록 설득 할 수 있어야합니다. COM 포트를 구동하는 데 사용하는 라이브러리의 문서는 방법을 알려야합니다). .

그런 다음 Arduino에서 DSR 핀 (PC DTR 핀이 Arduino의 DSR+CD에 연결된 핸드 쉐이킹을 통해 Null-Modem 배선을 가정 할 수 있음)을 정기적으로 확인할 수 있습니다. 당신이 적합한 방식.

이 접근법의 한 가지 문제는 PC 스크립트가 충돌/응답을 중지 할 때 직렬 포트를 닫지 않을 수 있다는 것입니다. 또한 스크립트는 직렬 라인의 오류로 인해 Arduino의 메시지를 놓칠 수 있습니다.

그런 이유로 당신은해야합니다 언제나 수신 루틴에서 타임 아웃 구현 : 다른 쪽 끝에 파티가 듣는 경우에도 메시지를 받거나 응답이 손상되지 않을 것이라는 보장은 없습니다.

타임 아웃이 발생하면 프로토콜이 더 안정적으로 만들어지면 (DSR이 제기된다고 가정) 메시지를 한 번 이상 다시 중단합니다.

다른 팁

Arduino는 DSR 라인이나 다른 핸드 쉐이킹 라인을 사용하지 않으므로 제안한 것을 할 수 없습니다.

나는 시간 초과가 필요하다는 MDB에 동의하지만, 누군가가 듣고 있는지 정기적으로 확인하는 간단한 도전/응답 시스템을 구현할 수도 있다고 덧붙일 것입니다. (저는 IRCD의 핑 폰 비유를 좋아합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top