我有两个Raspberry Pi使用串行端口和一对XRF Radio发送数据.通常它们工作正常并且完整的程序循环多次但是每隔一段时间其中一个程序会停止程序,并出现以下错误:
File "BaseListener.py, line 56, in <module>
recieved=serialport.read()
File "/usr/lib/python2.7/dist-packages.serial/serialposix.py", line 465, in read raise SerialException('Device reports readiness to read but returned no data (device disconnected?)')
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected?)
Run Code Online (Sandbox Code Playgroud)
我的代码是:
import sys
import serial
import time
import datetime
date = datetime.date.today()
strdate = str(date)
serialport=serial.Serial("/dev/ttyAMA0", 9600, timeout=0.25)
command=''
loop=0
recieving=False
recieving2=False
format = "%Y-%m-%d %H:%M:%S"
while True:
while (recieving==False):
loop = 0
command=''
while (loop<30):
recieved = serialport.read()
command = command + recieved
loop = loop+1
if "DR" in command:
print"DR Recieved"
serialport.write("BSAKAKBS")
recieving=True
while (recieving ==True):
loop = 0
command=''
while (loop<30):
recieved = serialport.read()
command = command + recieved
loop = loop+1
sensorid = command[0:2]
print ("Command: "+command)
print ("SensorID: "+sensorid)
graintemp = command[2:6]
print "GrainTemp Recieved"
serialport.write("BS"+graintemp+"BS")
print (str(graintemp))
loop = 0
command=''
while (loop<30):
recieved = serialport.read()
command = command + recieved
loop = loop+1
if sensorid in command:
if "AK" in command:
print "GrainTemp AK recieved"
serialport.write("BSAKAKBS")
recieving2=True
while (recieving2==True):
loop=0
command=''
while (loop<30):
recieved = serialport.read()
command = command + recieved
loop = loop+1
print ("Command: "+command)
airtemp = command[2:6]
print "AirTemp Signal Recieved"
serialport.write("BS"+airtemp+"BS")
print ("AirTemp: "+str(airtemp))
loop = 0
command=''
while (loop<30):
recieved = serialport.read()
command = command + recieved
loop = loop+1
if sensorid in command:
if "AK" in command:
print ("AK command: ")
print "AirTemp AK Recieved"
serialport.write("BSAKAKBS")
#File Storage
today = datetime.datetime.today()
fulltime = today.strftime(format)
strtime = str(fulltime)
graindata = fulltime + ' ' + graintemp +'\n'
airdata = fulltime + ' ' + airtemp +'\n'
file = open(sensorid+"Graindata.dat", "a")
file.write(graindata)
file.close
file = open(sensorid+"Airdata.dat", "a")
file.write(airdata)
file.close
recieving=False
recieving2=False
loop=0
command=''
graindata=''
airdata=''
graintemp=0
airtemp=0
print "Files stored. Restarting"
else:
print ("IC Command: ")
print "Airtemp IC Recieved"
serialport.write("BSICICBS")
loop = 0
command=''
else:
print "Airtemp ID IC Recieved"
serialport.write("BSICICBS")
loop = 0
command=''
else:
serialport.write("BSICICBS")
print "Graintemp IC Recieved"
loop = 0
command=''
else:
serialport.write("BSICICBS")
print "Graintemp ID IC Recieved"
loop = 0
command=''
Run Code Online (Sandbox Code Playgroud)
另一个Pi上的代码是相似的(如果需要我可以提供).
从我在网上找到的,尝试读取串口但它是空的是一些问题.我已经看到了使用try和catch异常的建议,但我不确定这会有所帮助(或者知道如何真正做到这一点).我需要代码连续运行而不会对用户造成任何干扰.如果串口是空的,那么AK和IC环路应该将它与不正确的传输相同,所以我只需要它来传递空值.有没有办法做到这一点?
这对我有用。
来自官方 RPI 文档:
“要手动更改设置,请使用 编辑内核命令行sudo nano /boot/cmdline.txt。找到引用 Serial0 设备的控制台条目,并将其删除,包括波特率设置。它看起来像console=serial0,115200。确保该行的其余部分仍然是同样,因为此配置中的错误可能会阻止 Raspberry Pi 启动。”
只需要编辑这一行。
这是链接https://www.raspberrypi.org/documentation/configuration/uart.md