2016-07-21 1 views
1

저는 파이썬을 처음 접했고 약간 까다 롭습니다. 그래서 본질적으로 데이터를 빛으로 보내려고합니다. 단지 적은 양의 텍스트. 그래서 바이너리에 ASCII 인코딩하는 코드의 라인을 가지고, 그것은 잘 작동 등데이터 전송 및 수신 코드 사이의 타이밍 문제

n=['0','b','1','0','1'] 

와 같은 문자열로 바이너리와 목록이 저를 떠난다. 나는 하나의 라스베리 pi을 아래 코드와 함께 보내도록 설정하고, 하나는 코드를 더 내려 받아 수신하도록 설정했습니다. 모두 작동하는 것처럼 보입니다.하지만 두 타이밍 사이에 타이밍이 틀렸다고 생각합니다. 수신 된 목록의 목록이 이동하고 때로는 임의적 인 0이있을 수 있습니다. (나는 그것이 보내는 것보다 빨리 읽고 있다고 생각한다). 이 문제를 쉽게 해결할 수있는 방법이 있습니까? for 루프는 푸시 버튼을 통해 동시에 시작됩니다.

송신 :

For x in range(2,130): 
    If myList[x] != '1': 
     Led.off() 
     Sleep(.5) 
     Led.off() 
    Elif myList == '1': 
     Led.on() 
     Sleep(.5) 
     Led.off() 

수신 :

For x in range(2,130): 
    If gpio.input(14) == True: 
     myList[x] = '1' 
     Sleep(.5) 
    Elif gpio.input(14) ==False: 
     myList[x] = '0' 
     Sleep(.5) 

gpio.input(14)는 LED로부터의 신호를 수신하는 photodiode에 접속된다. 수신 코드가 전송 코드보다 빠르게 실행되고 왜 타이밍이 느려지는지 추측하지만이를 수정하는 방법을 모르겠습니다.

답변

0

목록에 쓰는 것이 GPIO 핀을 설정하는 것보다 작업으로 완료하는 데 다소 시간이 걸릴 수 있다고 생각합니다. 그래서 각각의 루프 사이클은 올바른 것을 읽지 않을 때까지 점점 더 동기화되지 않습니다. 내가 할 수있는 것은 다른 LED와 다른 포토 다이오드를 첫 번째 것보다 반대쪽에있는 라스베리 파이에 추가하여 "수신 된"신호를 출력하는 것입니다. 보내기

:

For x in range(2,130): 
    If myList[x] != '1': 
    Led.off() 
    Sleep(.5) 
    Led.off() 
    Elif myList == '1': 
    Led.on() 
    Sleep(.5) 
    Led.off() 
while GPIO.input(receivepin) == False: #wait until 'receive' pin reads a value 
    Sleep(0.1) 
#here you might want to also add another 
#pulse to let the reciever know that another piece of data is about to be sent 

잡 : 그래서 당신의 코드는 다음과 같이 보일 것이다

For x in range(2,130): 
If gpio.input(14) == True: 
    myList[x] = '1' 
Elif gpio.input(14) == False: 
    myList[x] = '0' 
Led.on() 
#wait until the sender puts out a pulse to signal the next piece of data 

이것은하지 않을 수 있습니다 그것을 할 수있는 최선의 방법을,하지만 당신은 아이디어를 얻을. 기본적으로 시간 지연을 제거하고 특정 매개 변수가 충족 될 때까지 대기하는 코드 비트로 대체하려고합니다.

관련 문제