2010-02-24 2 views
4

Python에서 pyserial을 통해 Arduino로 일부 데이터를 보내려고합니다. Arduino가하고 싶은 것은 직렬 포트에서 가변 길이 문자열 데이터를 읽고 파이썬이 읽을 수 있도록 다시 쓰는 것입니다. 이후 내가 할 수 없었습니다, 아래의 코드는 파이썬 문자를 보내고있다. 여기Arduino와 Python 사이의 에코 프로그램

import serial 
import sys 
import pywapi 
import time 

def main(): 
    ser = serial.Serial(3, 9600, timeout=1) 
    print "Conn established" 
    print "Sending: %s" % "z".__repr__() 
    print ser.write('z'.encode("ascii")) 
    time.sleep(2) 
    print "Received: %s" % ser.read(10).__repr__()   
    ser.close() 

아두 이노 코드 것 : 여기 파이썬 코드는

void setup(){ 
    analogReference(DEFAULT); 
    Serial.begin(9600); 
} 

void loop(){ 
    if(Serial.available() > 0) 
    Serial.println("x"); 
    while(Serial.available() > 0){ 
    Serial.print(Serial.read(), BYTE); 
    } 
} 

출력 :

Conn established 
Sending: 'z' 
1 
Received: '' 

나는 데이터가 전송 될 때 작동하기 때문에 아두 이노에 대한 코드가 작동 알고 Arduino 터미널에서. 그러나 파이썬에서 어떤 것을 보내려고하면 실패합니다. 나는 하루 종일 고생하고있다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

"별난 결과"는 무엇을 의미합니까? 어쩌면 핸드 셰이 킹 문제 일 수도 있습니다. –

+0

죄송합니다. 이상한 결과는 내가 여기 게시 한 것과 정확히 일치 함을 의미합니다. – JohnS

+0

OS가 무엇입니까? Windows 또는 * nix? – Earlz

답변

3

시간 초과를 늘리거나 제거하고 읽기 크기를 1로 설정하십시오. 또한 수면 지연을 늘리거나 간단한 읽기 루프를 구현할 수도 있습니다. 같은

뭔가 :

try: 
    while True: 
     data = ser.read(1).__repr__() 
     if data: 
      print "Received: %s." % data 
     else: 
      print "Looping." 
except KeyboardInterrupt: 
    print "Done." 
except: 
    raise 
finally: 
    ser.close() 
    print "Closed port." 

가 그럼 그냥 CTRL-C를 사용을 중지합니다.

+0

어떤 이유로 든 첫 번째 읽기는 항상 ''을 (를) 반환했습니다. 테스트 목적을 위해 두 번째 읽기를 구현 한 후 작업을 시작했습니다 (아직 파이썬 프로그램이 시작될 때마다 더미 읽기를 수행해야 함). – JohnS

+0

아마도 "Serial.println ("x ");"과 관련이 있습니다. Arduino 코드에서. 파이썬 응용 프로그램이 연결시 'x'를 출력합니까? 그렇지 않다면 아마도 파이썬 앱이 'x'다음에 전송되는 개행 문자를 선택했을 것입니다. 또는 여전히 파이썬 직렬 연결에서 시간 제한을 설정하는 경우 읽기가 시간 초과 될 수 있습니다. –

3

PC에서 별도의 직렬 포트 및 직렬 통신 소프트웨어를 사용하여 두 부분을 독립적으로 확인하는 것이 좋습니다.

예. PC에 직렬 포트가 2 개있는 경우 널 모뎀 (루프백) 케이블을 사용하여 연결하십시오. 또는 com0com을 사용하여 연결된 가상 직렬 포트 쌍을 만들 수 있습니다. 하나의 직렬 포트에서 Python 소프트웨어를 실행하고 다른 직렬 포트에는 터미널 프로그램 (하이퍼 터미널 또는 RealTerm)을 실행하십시오. 그런 식으로 파이썬 프로그램의 동작을 수동으로 확인하십시오.

그런 다음 평소대로 PC를 Arduino에 직접 연결하고 터미널 소프트웨어를 사용하여 Arduino 소프트웨어 작동을 수동으로 확인하십시오.

이 과정을 통해 문제의 범위를 좁힐 수 있습니다. 둘 다 확인한 후에는 함께 잘 작동해야합니다. 당신이 사용할 수있는

직렬 포트 모니터

또 다른 방법은 PC의 시리얼 포트 드라이버에 후크 및 직렬 포트의 트래픽을 모니터링 할 수있는 소프트웨어입니다. 나는 과거에 HHD Software의 Free Serial Port Monitor 소프트웨어를 사용했고, 우리의 목적을 위해 잘 작동했습니다. 그것은 당신이 PC의 시리얼 포트를 모니터 할 수있게 해주 며, 양방향에서 포트를 통해가는 직렬 데이터의 로그 (16 진수 및 텍스트)를 보여줍니다.

0

보류 된 직렬 버퍼에서 보낸 문자를 플러시해야합니까?

실제로 캐릭터가 COM 포트를 떠나 Arduino에 도착하지 않았을 수 있습니다. Arduino Terminal로 이것을 테스트 할 때 (실제로 개발 환경의 UI 터미널이라고 가정 함) 실제로 문자 만이 아닌 문자열과 + 캐리지 리턴을 보내고 있습니다. (예 : 테스트에서 'z'를 입력 한 후 답장을 받으시겠습니까?)

ser.flush()를 시도하거나 \ r 문자를 보낼 수도 있습니다. 테스트에서 Arduino는 잘 작동하지만, 아무것도 보내지 않는 것 같은 파이썬 프로그램입니다.

0

두 번 보내야하는 이유는 USB를 통해 연결하는 경우 첫 번째 직렬 연결이 Arduino를 재설정한다는 것입니다.