2013-05-20 1 views
0

파이썬 측 int()의 데이터가 예상과 같이 기본 10 자릿수가 아님을 의미하는 잘못된 리터럴 오류가 발생했습니다. 나는 것을 얻을 수 있지만, 아두 이노 측면에 나는 시리얼을 통해 보내 :이 그것을 집어arduino에서 python (raspberryPi)으로 오는 데이터가 유효하지 않습니다. 리터럴 오류

void loop() 
{ 
    temperature = bmp085GetTemperature(bmp085ReadUT()); 
    pressure = bmp085GetPressure(bmp085ReadUP()); 
    Serial.println(temperature, DEC); //fails on python side, outputs a 240 usually 
    delay(50); 
    Serial.println(pressure, DEC); //pa 
    delay(1000); 
} 

및 파이썬 측 :

while True: 
    if(serialFromArduino.inWaiting() > 0): 
      input = serialFromArduino.readline().rstrip() 
      print(input) 
      inputAsInteger =int(input) #FAILS 
      print("done") 

심지어 rstrip가 확인 않았다 내가 어떤 \의 t \ r에 \를 제거 N 등

그래서 나는 왜 일정

[email protected] ~/pythoncode $ python serialtest.py 
Running 
240 
Traceback (most recent call last): 
File "serialtest.py", line 18, in <module> 
    inputAsInteger =int(input) 
ValueError: invalid literal for int() with base 10: '' 

그냥 있는지 여부에 의아해입니다 얻을 내가 실종 됐어? 파이썬에 익숙하다. 그렇기 때문에 내가 할 수있는 일은 믿기지 않을 정도로 어리 석다.

+0

디버그 프린트에서 정확히 무엇을 처리하는지 알기 때문에 다음을 시도해보십시오 :'print (input.encode ('hex'))' –

+0

awesome! 좋아, 내가 그 옵션을 가지고 있었는지, 다시 bazillion 0을 가지고 도망 간다는 것을 알지 못한다. 0323430은 아스키 값인가? 이전 숫자가 2951의 수인 0s – Codejoy

+0

예, '00 32 34 30'은 (널 바이트)'2 ''4 ''0 '입니다. 그래서 당신의 데이터는 널 문자들로 가득 차 있습니다. 그들을 제거하는 방법에 대한 내 대답을 참조하십시오. 나는 왜 그것이 일어나고 있는지 확실하지 않다. 'serialFromArduino' 란 무엇입니까? –

답변

1

데이터와 같은 소리에는 null 바이트 (ASCII 코드 0x00)가 있습니다. strip('\x00')으로 제거하고 싶습니다. 기본적으로 strip()은 null 바이트를 포함하지 않는 whitspace 만 제거합니다. 따라서 우리는 수동으로 제거 할 바이트를 지정합니다.

if(serialFromArduino.inWaiting() > 0): 
     input = serialFromArduino.readline().strip().strip('\x00')  # <-- 
     print(input) 
     inputAsInteger = int(input) 
     print("done") 

은 아마도 더 나은 솔루션 널 바이트에서 오는 를 확인하고 일어나는 일련의 대역폭이 거대한 낭비를 방지하는 것입니다.

추신. 오류 메시지가 여기 이렇게 인정했다 그 이유는 그들이 자신의 오류 메시지에 잘못된 문자를 포맷 문자열이기 때문에

ValueError: invalid literal for int() with base 10: '' 

아마입니다. 그러나 일부 라이브러리 호출은 널 바이트를 널 종료 자로 해석하고 나머지 문자열을 인쇄하지 않습니다.

+0

만약 라이브러리에 대한 호출에서 내가 쓰지 않았던 것을 추측해야한다면 :'temperature = bmp085GetTemperature (bmp085ReadUT()); pressure = bmp085GetPressure (bmp085ReadUP()); ' – Codejoy

+0

p.s. 스트립 \ x00을 사용하여 바이트를 제거하고 16 진수 호출에서 같은 것을 인쇄했습니다 – Codejoy

+0

나는 그것을 깨달았을 것이라고 생각하지만'strip()'*는 수정 된 문자열을 반환합니다; 즉석에서 수정하지 않습니다. –

1

오류는 입력에 빈 줄 ''이 수신되었고이를 정수로 변환하려고 시도했음을 의미합니다.

외부 입력을 신중하게 처리해야합니다 (input = serialFromArduino.readline()). 적절한 정수가 아닌 경우 (예 : 빈 줄 또는 잡음) 프로그램이 중단됩니다. 예를 들면 다음과 같습니다.

try: 
    input = serialFromArduino.readline().rstrip() 
except ValueError: 
    raise InputError('got bad value {}'.format(input)) 
관련 문제