为什么/ dev / rfcomm0会出现PySerial问题?

我正在通过蓝牙将我的Ubuntu盒连接到无线读出设置。 我写了一个Python脚本来通过/ dev / rfcomm0发送串行信息。 该脚本连接正常并工作几分钟,但随后Python将开始使用100%CPU并且消息不再流过。

我可以在串口终端打开rfcomm0并通过手工沟通就好了。 当我通过终端打开它时,似乎无限期地工作。 此外,我可以将蓝牙接收器换成USB电缆,并将端口更改为/ dev / ttyUSB0,随着时间的推移我不会遇到任何问题。

似乎我正在做rfcomm0的错误或者PySerial没有很好地处理它。

这是脚本:

import psutil import serial import string import time sampleTime = 1 numSamples = 5 lastTemp = 0 TEMP_CHAR = 't' USAGE_CHAR = 'u' SENSOR_NAME = 'TC0D' gauges = serial.Serial() gauges.port = '/dev/rfcomm0' gauges.baudrate = 9600 gauges.parity = 'N' gauges.writeTimeout = 0 gauges.open() print("Connected to " + gauges.portstr) filename = '/sys/bus/platform/devices/applesmc.768/temp2_input' def parseSensorsOutputLinux(output): return int(round(float(output) / 1000)) while(1): usage = psutil.cpu_percent(interval=sampleTime) gauges.write(USAGE_CHAR) gauges.write(chr(int(usage))) #write the first byte #print("Wrote usage: " + str(int(usage))) sensorFile = open(filename) temp = parseSensorsOutputLinux(sensorFile.read()) gauges.write(TEMP_CHAR) gauges.write(chr(temp)) #print("Wrote temp: " + str(temp)) 

有什么想法吗?

谢谢。

编辑:这是修改后的代码,使用Python-BlueZ而不是PySerial:

 import psutil import serial import string import time import bluetooth sampleTime = 1 numSamples = 5 lastTemp = 0 TEMP_CHAR = 't' USAGE_CHAR = 'u' SENSOR_NAME = 'TC0D' #gauges = serial.Serial() #gauges.port = '/dev/rfcomm0' #gauges.baudrate = 9600 #gauges.parity = 'N' #gauges.writeTimeout = 0 #gauges.open() gaugeSocket = bluetooth.BluetoothSocket(bluetooth.RFCOMM) gaugeSocket.connect(('00:06:66:42:22:96', 1)) filename = '/sys/bus/platform/devices/applesmc.768/temp2_input' def parseSensorsOutputLinux(output): return int(round(float(output) / 1000)) while(1): usage = psutil.cpu_percent(interval=sampleTime) #gauges.write(USAGE_CHAR) gaugeSocket.send(USAGE_CHAR) #gauges.write(chr(int(usage))) #write the first byte gaugeSocket.send(chr(int(usage))) #print("Wrote usage: " + str(int(usage))) sensorFile = open(filename) temp = parseSensorsOutputLinux(sensorFile.read()) #gauges.write(TEMP_CHAR) gaugeSocket.send(TEMP_CHAR) #gauges.write(chr(temp)) gaugeSocket.send(chr(temp)) #print("Wrote temp: " + str(temp)) 

似乎Ubuntu必须在一段时间后关闭/ dev / rfcomm0或者我的蓝牙接收器搞砸了。 即使出现蓝牙错误,接收器上的“连接”灯也会保持点亮,直到我重新接通接收器才能重新连接。

我不知道如何解决这个问题。 奇怪的是,连接可以正常工作几分钟(看似随机的时间),然后抓住了。

如果有帮助,蓝牙接收器是来自Sparkfun的BlueSmirf Silver 。 我是否需要尝试维护接收端的连接或其他什么?

事实certificate,PC上的蓝牙缓冲区已经溢出,因为我从未在Python脚本中调用recv()。

蓝牙配件正在向PC发送字符,脚本忽略了该字符,这不可避免地导致缓冲区溢出。 这种溢出显然导致rfcomm通道锁定,直到读取缓冲区。

这是工作脚本,供将来参考:

 import psutil import serial import string import time import bluetooth sampleTime = 1 numSamples = 5 lastTemp = 0 TEMP_CHAR = 't' USAGE_CHAR = 'u' SENSOR_NAME = 'TC0D' filename = '/sys/bus/platform/devices/applesmc.768/temp2_input' def parseSensorsOutputLinux(output): return int(round(float(output) / 1000)) def connect(): while(True): try: gaugeSocket = bluetooth.BluetoothSocket(bluetooth.RFCOMM) gaugeSocket.connect(('00:06:66:42:22:96', 1)) break; except bluetooth.btcommon.BluetoothError as error: gaugeSocket.close() print "Could not connect: ", error, "; Retrying in 10s..." time.sleep(10) return gaugeSocket; gaugeSocket = connect() while(True): usage = psutil.cpu_percent(interval=sampleTime) sensorFile = open(filename) temp = parseSensorsOutputLinux(sensorFile.read()) try: gaugeSocket.send(USAGE_CHAR) gaugeSocket.send(chr(int(usage))) #print("Wrote usage: " + str(int(usage))) gaugeSocket.send(TEMP_CHAR) gaugeSocket.send(chr(temp)) print gaugeSocket.recv(1024) #print("Wrote temp: " + str(temp)) except bluetooth.btcommon.BluetoothError as error: print "Caught BluetoothError: ", error time.sleep(5) gaugeSocket = connect() pass gaugeSocket.close() 

关键的变化是增加了生产线

 gaugeSocket.recv(1024) 

它清除从远程设备发回的“好”消息的缓冲区。