2014-02-06 2 views
0

나는 파이썬과 pyserial 모듈을 사용하여 데이터 전송 프로그램을 만들었습니다. 나는 현재 라스베리 파이와 내 컴퓨터 사이의 무선 장치를 통해 텍스트 파일을 전달하는 데 사용하고 있습니다. 문제는 내가 보내려고하는 파일이 5000 줄의 텍스트를 포함하고 있으며 크기가 93.0 Kb 인 것이 꽤 오래 걸리는 것입니다. 정확히 말하면 약 1 분이 걸립니다. 몇 초 안에 끝내야합니다. 여기에 다음 코드가 있습니다. 파일 읽기와 데이터 전송 속도를 향상시킬 수있는 많은 최적화가 있다고 확신합니다. 내 무선 장치의 데이터 속도는 250kbps이며, 분명히 도달하지 못했습니다. 어떤 도움이라도 대단히 감사하겠습니다.Python에서 Pyserial을 사용하여 데이터 전송 속도 향상

코드 (내 노트북에)

def r_f_bird(self): #send command to bird to start func, 
    if ser_open == True: 


     readline = lambda : iter(lambda:ser.read(1),"\n") 

     NAME = self.tb2.get() 

     ser.write('/' + NAME) 

     print NAME 
     sleep(0.5) 
     ser.write('\n<<SENDFILE>>\n') 

     start = clock() 
     with open(str(NAME),"wb") as outfile: 
      while True: 
       line = "".join(readline()) 
       if line == "<<EOF>>": 
        break 
       print >> outfile, line 
     elapsed = clock() - start 
     print elapsed 


     ser.flush() 

    else: 
     pass 
+0

직렬 포트의 전송 속도를 설정하고 있습니까? 기본적으로 pyserial은 9600으로 설정합니다. – mtrw

+0

나는 9600에서 230400 baud로 전송 속도를 설정해 보았습니다. 오류는 없지만 파일을 보내는 데 걸리는 시간은 정확히 같습니다. 나는 시간을 잰다. 그리고 이상한 점은 코드를 출력하는 데 2 ​​초 밖에 걸리지 않지만 실제 타이머는 프로세스가 거의 2 분이 걸린다는 것을 보여줍니다. – user3117351

답변

0

아마도 ser.read(1)의 오버 헤드가 둔화되고 일을 내려받을 (라즈베리 파이에 위치)

def s_file(): 

    print 'start' 

    readline = lambda : iter(lambda:ser.read(1),"\n") 
    name = "".join(readline()) 
    print name 
    file_loc = directory_name + name 

    sleep(1) 

    print('Waiting for command from client to send file...')  

    while "".join(readline()) != "<<SENDFILE>>":     
     pass 

    with open(file_loc) as FileObj: 
     for lines in FileObj: 
      ser.write(lines) 

    ser.write("\n<<EOF>>\n") 

    print 'done' 

코드를 보낼 수 있습니다. 각 줄의 끝 부분에 \n이있는 것 같습니다. 따라서 자신의 롤링 대신 pySerial의 readline() 메소드를 사용해보십시오. line = "".join(readline())에서 line = ser.readline()으로 변경하면됩니다. 또한 루프 종료 조건을 == "<<EOF>>\n"으로 변경해야합니다.

쓰기면에 ser.flush()을 추가해야 할 수도 있습니다.