문제

Arduino 보드에 데이터 패킷을 작성하는 Python 스크립트가 있습니다. pyserial. 때로는 보드에 코드를 작성하는 동안 Pyserial은 Errno 5의 입력/출력 오류가 발생합니다.

일부 연구에 따르면 이것은 Arduino 보드와의 연결을 나타내는 파일에 쓰는 동안 오류를 나타냅니다.

보내는 코드는 단일 바이트 패킷 만 보냅니다.

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # Check if it's an integer
    elif isinstance(byte, int):
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it
    else: raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

이 코드에서 인쇄 한 오류는 다음과 같습니다.

OS 오류 입력/출력 오류 Errno 5

보내는 동안 내 코드에 문제가 있습니까? 직렬 연결이 무언가를 보낼 준비가되었는지 확인해야합니까? 아니면 전송 후 지연이 있어야합니까? 아니면 하드웨어 또는 하드웨어와의 연결에 문제가있을 수 있습니까?

편집하다: Pyserial의 Linux 구현을 살펴 보았고 구현은 오류 만 내 코드에 전달합니다. 그래서 거기에서 새로운 실제 통찰력이 없습니다. 프로그램에서 무슨 일이 일어나고 있는지 테스트하는 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

당신을 괴롭히게되어 죄송합니다. 그러나 Arduino가 스스로 재설정되어 컴퓨터 연결을 닫아 오류가 발생한다고 확신합니다.

다른 팁

코드에서 즉시 볼 수있는 유일한 문제는 압입 문제입니다. 코드를 다음과 같이 변경하십시오.

try:
    # Check if it's already a single byte
    if isinstance(byte, str):
        if len(byte) == 1: # It is. Send it.
            self.serial.write(byte)
        else: # It's not
            raise PacketException
    # else, check if it's an integer
    elif isinstance(byte, int): 
        self.serial.write(chr(byte)) # It is; convert it to a byte and send it 
    else: 
        raise PacketException # I don't know what this is.
except Exception as ex:
    print("Exception is: " + ex.__getitem__() + " " + ex.__str__())

나는 당신의 오류가 이것으로부터 오는 것을 의심하지만, 이런 식으로 시도하고 우리에게 알려주십시오! 당신은 확인하고있었습니다 byte 이다 int 그것이 a 인 경우에만 str, 그래서 elif 언제나 정의에 따라 실패했습니다. 하지만 당신이 생각한다면 진짜 코드 들여 쓰기는 이와 같았습니다. SyntaxError, 그래서 나는 당신이 게시 할 때 방금 잘못되었고 당신의 실제 문제는 여전히 숨겨져 있다고 생각합니다.

Windows에서 이것을 실행하는 경우 Python 스크립트를 실행하는 것과 동시에 Arduino IDE를 연속 연결할 수 없습니다. 동일한 오류가 발생합니다.

당신과 비슷한 문제가있는 다른 사람들에게 도움이 될 수있는 몇 가지 의견을 제시하겠습니다. 먼저 직렬 모니터로 Arduino 스케치를 몇 번만 실행하십시오. IDE 메뉴에서 도구에서 직렬 모니터를 찾을 수 있습니다. Ctrl-Shift-M을 입력하여 직렬 모니터를 호출 할 수도 있습니다.

직렬 모니터는 Arduino 스케치가 귀하에게 다시 보내는 내용을 표시합니다. 그러나 Arduino 스케치로 전송되는 데이터를 입력 할 수 있습니다. 즉, 직렬 모니터를 사용하여 직렬 데이터 흐름의 양쪽을 테스트하고 디버깅합니다.

무엇이 나타나는지보세요. 스케치가 Serial.print ()를 통해 데이터를 다시 보내려고한다고 가정하면 종종 도움이됩니다. 몇 가지 메모. 직렬 모니터 내부에 설정된 보드 속도가 스케치의 보드 속도와 정확히 일치하는지 확인하십시오 (9600은 거의 모든 경우에 좋은 선택입니다).

두 번째 메모는 중요합니다. 직렬 모니터를 키우면 Arduino 보드에서 재설정이 재설정됩니다. 스케치가 시작됩니다 (항상). 매번 새로운 달리기를 제공하기 때문에 이것은 좋은 일입니다. 보드 속도를 9600으로 설정하여 리셋을 강요 할 수 있습니다 (이미 9600이라도). 이를 통해 매번 직렬 모니터를 다시 시작하지 않고 직렬 모니터 내부에서 많은 테스트를 실행할 수 있습니다.

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