2016-10-01 4 views
0

Parserial로 내 Arduino에서 보낸 데이터를 압축 해제하려고합니다. 이 코드는 Python 2.7에서 작동하지만 Python 3.4에서는 동일한 코드가 실패합니다. 이유는 모르겠습니다. 이것은 코드입니다.바이트 압축 해제 : 파이썬 2와 3의 차이

temp=struct.unpack('<'+'h'*int(datalength/2),data) 
struct.error: unpack requires a bytes object of length 36 

내가 무슨 일이 일어나고 있는지 볼 수 resp, datalengthdata을 인쇄 :

resp=ser.read() 
datalength=struct.unpack('<b',resp)[0] 
data=ser.read(datalength) 
temp = struct.unpack('<'+'h'*int(datalength/2),data) 
ser.flushInput() 
ser.flushOutput() 
print(temp) 

파이썬 3.4의 결과 오류입니다.
Resp: b'$' 
Datalength: 36 
Data: b'M>\x06l\xf6\xff\x00\x00\x14\x00w' 

전체 응답을 얻으려면, 내가 ser.readline()을했고, 그것은 반환 : 3

b'$M>\x06l\xab\xff\x13\x00O\x00b' 

사람이 Py3 대 Py2에 .unpacking 과정에 대한 차이를 설명 할 수 이유는 Py2에서 작동하지? 그 전혀 도움이된다면

내가 내 Multiwii에서 데이터를 분석하기 위해 노력하고있어, 모든 Multwii 파싱은 Py2에 있고없는 3 ....

+0

'.read (size)'는 ** 최대 ** size' 바이트까지 읽으려고합니다. 아마도 실제로 많은 바이트를받을 때까지 반복 할 필요가 있을까요? –

+0

무슨 소리 야? 대신'.read (size + 1)'을 할 수 있을까요? – aseylys

+0

'len (data)

답변

0

이것은 파이썬 버전의 결과가 아닙니다. read()은 모든 데이터 (36 바이트, 분명히)가 도착하기에 충분히 오랫동안 대기하지 않기 때문에 가능성이 큽니다. 직렬 객체에 대한 시간 초과 인수를 늘려 다음과 같이 변경되는지 확인하십시오.

ser = serial.Serial(port, baud, timeout=2) 

단위는 초입니다.

관련 문제