2012-07-03 2 views
3

파이썬 스크립트를 통해 내 Arduino Nano의 데이터를 지속적으로 읽으려고합니다. 하지만 대부분의 경우 readline은 예외를 throw하지 못하거나 숫자가 누락 된 것처럼 손상된 데이터를 반환하지 못합니다. 여기 Arduino에서 Python으로 연속적인 데이터 스트리밍 (readline 실패)

는 연결 부분 :

아두 이노 코드 : 작동하기 때문에 send_rows_cols()에서

void loop() { 
    // Send data only when you receive data: 
    if (Serial.available() > 0) { 

     // Check if it's the right signal. 
     if (Serial.read()=='S') { 
      // Send a string containing the rows and cols number. 
      send_rows_cols(); 

     } // if(Serial.read()=='S') 
     else { 
      send_data(); 
     } // END: else if(Serial.read()=='Y') 
    }// if(Serial.available() > 0) 
} 

, 나는, Serial.write를 사용하고 있지만 send_data() 내가 데이터를 다시 보낼 Serial.println()을 사용했다 .

파이썬 부분. 합법적 인 값이 반환 될 때까지 사용해야했던 말도 안되는 실행 방법이 있습니다.

import serial 
import time 

locations=['/dev/ttyUSB0','/dev/ttyUSB1','/dev/ttyUSB2','/dev/ttyUSB3', 
'/dev/ttyS0','/dev/ttyS1','/dev/ttyS2','/dev/ttyS3'] 

for device in locations: 
    try: 
     print "Trying...",device 
     arduino = serial.Serial(device, 9600) 
     break 
    except: 
     print "Failed to connect on",device 

rows_cols ='' 

try: 

    while True: 
     arduino.write('S') 
     rows_cols = str(arduino.readline()) 
     print len(rows_cols) 
     print rows_cols 
     if (len(rows_cols)>3): 
      break 

except: 
    print "Failed to send!" 

최대 하나까지 또는 두 개의 readlines 후에 작동합니다. 저렴한 가격입니다. 나중에, 나는 심지어 미친 코드를 사용해야했다. Arthon Python에서 Arduino로 문자를 보내면 연결이 끊어지지 않을 것입니다. Arduino가 그 문자를 기다려야한다는 것을 알 수 있습니다. Arduino가 해당 문자를 수신하면 원하는 데이터 (쉼표로 구분 된 문자열)를 다시 전송합니다.

이 마지막 파이썬 부분은 예외 나 손상된 데이터가 없을 때까지 Arduino에서 'Y'char 및 readline을 전송하는 것입니다. 너무 많은 루프는 아무것도 없습니다.

내가 원하는 것은 항상 "핸드 셰이크"가없고 그 데이터가 항상 쓰레기가되지 않으면 서 내 Arduino에서 데이터를 연속적으로 얻는 방법입니다.

그런 방법이 있습니까? 시리얼에 대한 타임 아웃 옵션일까요?

+0

더 높은 수준의 연결 관리를 원한다면 다음과 같은 라이브러리를 사용하는 것이 좋습니다. 꼬인. 연결이 끊어지면 자동으로 다시 연결하기 위해'ReconnectingClientFactory'를 사용하여 장치에 연결할 수 있습니다. 꼬인 사건은 사건에 의해 움직이기 때문에 "계속 살아야한다"는 말을 더 쉽게 받아 들일 수 있습니다. 시작하려면 여기를 참조하십시오. http://stackoverflow.com/questions/4715340/python-twisted-receive-command-from-tcp-write-to-serial-device-return-response – jozzas

답변

4

Arduino IDE 직렬 모니터를 열지 않으셨습니까? 나는 내가이 열려 있음을 왼쪽 깨달았다 전에 내 "파이썬은 인터페이스 코드를 아두 이노"디버깅은 "행복"저녁 보냈다 그리고 내가 확실히와 함께 매우 간단 Serial.write()Serial.println() 코드를 사용했습니다 가끔 문자 :

을 먹고 있었다 readline() 한 번에 수십 분 동안 연속적인 "명령/응답"테스트를 수행하십시오 (수천 줄의 송수신)

+0

직렬 모니터를 의미합니까? 터미널은 항상 Arduino IDE의 하단에 열려 있기 때문에. – storedope

+0

죄송합니다. 예, 그것이 제가 의미했던 것입니다. 당신이 말한대로 –

+0

업데이트. 파이썬 혼란에서 데이터를 읽는 동안 시리얼 모니터를 여는 데는 몇 가지 이유가 있습니다. 도와 주셔서 감사합니다. 아마 나 외에 많은 사람들에게 생명의 은인이 될 것입니다. – storedope