A resposta a esta pergunta é a mesma que a resposta a Porque é / dev / rfcomm0 dando problemas PySerial? , um simples problema do estouro do buffer Bluetooth no PC.
Estou usando o Python para escrever um script Bluetooth serial simples que envia informações sobre as estatísticas do meu computador periodicamente. O dispositivo receptor é um Sparkfun BlueSmirf Silver .
O problema é que, depois que o script é executado por alguns minutos, ele para de enviar pacotes para o receptor e falha com o erro:
(11, 'Resource temporarily unavailable')
Percebendo que isso inevitavelmente acontece, adicionei alguns códigos para tentar reabrir a conexão automaticamente. No entanto, então eu recebo:
Could not connect: (16, 'Device or resource busy')
Estou fazendo algo errado com a conexão? Eu preciso reabrir ocasionalmente o soquete? Não sei como recuperar esse tipo de erro.
Eu entendo que às vezes a porta estará ocupada e uma operação de gravação será adiada para evitar o bloqueio de outros processos, mas não esperaria que a conexão falhasse tão regularmente. Alguma idéia?
Aqui está o script:
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:
print "Could not connect: ", error, "; Retrying in 5s..."
time.sleep(5)
return gaugeSocket;
gaugeSocket = connect()
while(1):
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("Wrote temp: " + str(temp))
except bluetooth.btcommon.BluetoothError as error:
print "Caught BluetoothError: ", error
time.sleep(5)
gaugeSocket = connect()
pass
gaugeSocket.close()
EDIT: devo acrescentar que este código se conecta bem depois de ligar e desligar o receptor e iniciar o script. No entanto, ele falha após a primeira exceção até que eu reinicie o receptor.
P.S. Isso está relacionado à minha pergunta recente, Por que o / dev / rfcomm0 está dando problemas ao PySerial? , mas isso era mais sobre o PySerial especificamente com o rfcomm0. Aqui estou perguntando sobre a etiqueta geral do rfcomm.
A resposta a esta pergunta é a mesma que a resposta a Porque é / dev / rfcomm0 dando problemas PySerial? , um simples problema do estouro do buffer Bluetooth no PC.