我在一个非常时间敏感的循环中使用了一些python代码(在raspberry pi上运行)(不应该偏离+ =。0001 s)。我发现了
if serial.Serial('/dev/ttyUSB0').read(): #what to do when there is data pending
data = serial.Serial('/dev/ttyUSB0').read()
似乎是个问题。我很少通过串行连接发送任何东西,当我这样做时,它不到10个字节。看起来这段代码在收到数据之前就会阻止程序。
例如,如果我收到一个恒定的数据流并打印出每个循环的执行时间,它大约为.1ms,这对我的目的有好处,但是如果我一分钟没有收到任何东西,那么就收到数据,该循环需要60秒才能完成。
如果串口中没有数据等待,我需要一点点代码来跳过运行并且不会占用程序。
以下是可能相关的更完整的代码部分:
raspi=serial.Serial('/dev/ttyUSB0')
if raspi.read(): #what to do when there is data pending
print data #this is a messy debugging tool to see what the pi recieves
data = raspi.read()
raspi.write(confirmed + data) #this is the data confirmed message
if((str(data)[0]=='s' or str(data)[0]=='S' or str(data)[0]=='b' or str(data)[0]=='B')): #this is for going straight. Command is s# or b#, # being 1-9.
lspeed=str(data)[1]
print('lspeed is now ' + str(lspeed))
raspi.write('lspeed is now ' + str(lspeed))
rspeed=str(data)[1]
print('rspeed is now ' + str(rspeed))
raspi.write('rspeed is now ' + str(rspeed))
if(str(data)[0]=='r' or str(data)[0]=='R'):
rspeed=str(data)[1]
print('rspeed is now ' + str(rspeed))
raspi.write('rspeed is now ' + str(rspeed))
if((str(data)[0]=='l' or str(data)[0]=='L') and str(data)!='launch'):
lspeed=str(data)[1]
print('lspeed is now ' + str(lspeed))
raspi.write('lspeed is now ' + str(lspeed))
答案 0 :(得分:1)
用if serial.Serial('/dev/ttyUSB0').read():
替换if(serial.Serial('/dev/ttyUSB0').inWaiting>=1):
就可以了。
如果没有数据等待,这种方式会跳过代码。我使用的参考误导了我。