我使用python和pyserial模块创建了一个数据传输程序。我目前正在使用它在Raspberry Pi和我的计算机之间通过无线电设备传送文本文件。问题是,我试图发送的文件包含5000行文本,大小为93.0 Kb,需要花费很长时间才能发送。确切地说,它需要大约一分钟。我需要在几秒钟内完成。下面是以下代码,我确信可以通过文件读取进行许多优化,这样可以提高数据传输速度。我的无线电设备的数据速率为250 kbps,显然没有达到。任何帮助将不胜感激。
要发送的代码(位于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
答案 0 :(得分:0)
ser.read(1)
的开销可能会减慢速度。看起来你在每一行的末尾都有一个\n
,所以尝试使用pySerial的readline()
方法而不是滚动你自己的方法。将line = "".join(readline())
更改为line = ser.readline()
应该这样做。您还需要将循环结束条件更改为== "<<EOF>>\n"
。
您可能还需要在写作方面添加ser.flush()
。