Ускорение передачи данных с помощью Pyserial в Python

Я создал программу передачи данных, используя python и модуль pyserial. В настоящее время я использую его для передачи текстового файла по радиоустройству между Raspberry Pi и моим компьютером. Проблема в том, что файл, который я пытаюсь отправить, который содержит 5000 строк текста и имеет размер 93,0 КБ, отправляется довольно долго. Если быть точным, это занимает около полной минуты. Мне нужно, чтобы это было сделано за секунды. Вот следующий код, я уверен, что есть много оптимизаций, которые можно сделать с чтением файлов и таких, которые бы увеличили скорость передачи данных. У моего радиоустройства скорость передачи данных 250 кбит/с, что явно недостижимо. Любая помощь будет принята с благодарностью.

Код для отправки (находится на raspberry pi)

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'

Код для получения (на моем ноутбуке)

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

person user3117351    schedule 06.02.2014    source источник
comment
Вы устанавливаете скорость передачи данных последовательного порта? По умолчанию, я думаю, pyserial устанавливает его на 9600.   -  person mtrw    schedule 07.02.2014
comment
Я попытался установить скорость передачи данных на 230400 бод вместо 9600. Я не получаю ошибок, но время, необходимое для отправки файла, точно такое же. Я рассчитал время. И что странно, код выводит, что передача занимает всего 2 секунды, тогда как мой физический таймер показывает, что процесс занимает почти 2 минуты.   -  person user3117351    schedule 07.02.2014


Ответы (1)


Возможно, накладные расходы на ser.read(1) замедляют работу. Кажется, что у вас есть \n в конце каждой строки, поэтому попробуйте использовать метод readline() pySerial, а не создавать свой собственный. Изменение line = "".join(readline()) на line = ser.readline() должно помочь. Вам также нужно будет изменить условие конца цикла на == "<<EOF>>\n".

Вам также может понадобиться добавить ser.flush() на стороне письма.

person mtrw    schedule 07.02.2014