2014-01-27 2 views
0
을 읽을 수 없습니다 내가 쓰고

pySerial는 : 데이터를 8 개 이상의 문자

라즈베리 파이 1 UART를 통해 두 라즈베리 파이 (들) 사이에 읽을 pyserial 사용

: 라즈베리 파이로 데이터를 전송 2

while 1: 
     ser=serial.Serial('/dev/ttyAMA0') 
     if not ser.isOpen(): 
      ser.open() 
     msg=raw_input('RPi 1 send:') 
     ser.write(msg) 
     ser.close() 

라즈베리 파이 2 : 라즈베리 파이 1

while 1: 
     ser=serial.Serial('/dev/ttyAMA0' ,timeout=0) 
     if not ser.isOpen(): 
      ser.open() 
     data=ser.read(1024) 
     if data.__len__()>0: 
      print 'RPi 2 receive:',data 
     ser.close() 

내가 모두 코드를 실행로부터 데이터를 수신.

RPi 2 receive : Hello 

그러나 예를 들어 RPI 1 송신 데이터 8 개 이상의 문자

RPi 1 send : Hello Raspberry pi NO.2 

경우 결과는

및 전송 데이터

RPi 1 send : Hello 

및 수신 데이터

RPi 2 receive: Hello Ra 
    RPi 2 receive: spberry 
    RPi 2 receive: pi NO.2 

이것은 내 문제입니다. 이런 수신을 받고 싶기 때문에

(RPi 2 수신 : Hello Raspberry pi NO.2) # 단 한 줄만 보입니다.

그리고 (8 자 이상) 다시 보내면 새 줄에 표시됩니다.

한 줄에 어떤 코드를 추가 하시겠습니까? 또는 이렇게 다른 방법? :)

+1

read()는 해당 시간만큼 준비됩니다. – cmd

답변

1

나는이

sender.py에게

delim = "\x00" 
ser.write(msg+delim) 

리시버를 할 것을 좋아합니다.py

+0

이제 제안과 함께 코드를 편집하고 It이 올바르게 표시됩니다. 하지만 저는 파이썬에 익숙하지 않습니다. 잘 모르겠습니다. "delim"을 추가하는 이유는 무엇입니까? delim이 "\ x00"이어야하는 이유는 무엇입니까? 이 줄은 어떻게 동작합니까? "(. iter (lambda : ser.read (1), delim))? 이 코드를 설명해 주시겠습니까? 그래서 답을 많이 주셔서 고마워요 :) – Wittaya

+1

그 줄은 우리가 구분 기호를 얻을 때까지 계속 읽는다고합니다 ... 당신은 원하는 구분 기호를 사용할 수 있습니다. 그러나 \ 0은 (거의) 실제 메시지 내용에 절대 존재하지 않을 것입니다. 사용하기 좋은 사람 –

3

ser.read을 사용하여 읽을 때 이미 버퍼에있는 내용을 읽거나 버퍼에 문자가 도착할 때까지 기다리는 것입니다. 으로 지정한 크기는을 수신 할 수있는 최대 문자 수는 이지만, 만큼 경험할 수 있습니다. '

  1. 사용 ser.readline 당신이 알고있는 경우에 많은 문자를 읽는 방법을 사전에 (\ n을 같은) 당신의 문자열에
  2. 을 터미네이터를 넣어, 당신까지 를 읽고 반복 :

    당신이 개 쉬운 솔루션을 그들 두 경우 모두

를받은 적이하는 제한을 지정 (예컨대 1 초) 제어 방식을 다시 얻기 위해, 시리얼 라인을 열 때 원격 엔드 어떤 이유로 든 아무것도 보내지 않는 경우 귀하의 코드에.

희망이 있습니다.

관련 문제