Я использую Python для написания простого последовательного скрипта Bluetooth, который периодически отправляет информацию о моей компьютерной статистике. Приемное устройство представляет собой Sparkfun BlueSmirf Silver .
Проблема в том, что после того, как скрипт выполняется в течение нескольких минут, он прекращает отправку пакетов получателю и завершается с ошибкой:
(11, 'Resource temporarily unavailable')
Заметив, что это неизбежно происходит, я добавил некоторый код в автоматически попробуйте снова открыть соединение. Однако тогда я получаю:
Could not connect: (16, 'Device or resource busy')
Я что-то не так делаю с соединением? Нужно ли время от времени открывать розетку? Я не уверен, как исправить ошибку такого типа.
Я понимаю, что иногда порт будет занят, и операция записи откладывается, чтобы избежать блокирования других процессов, но я не ожидаю, что соединение будет прерываться так регулярно. Есть мысли?
Вот сценарий:
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()
РЕДАКТИРОВАТЬ: я должен добавить, что этот код нормально подключается после того, как я включаю и выключаю приёмник и запускаю скрипт. Однако после первого исключения произойдет сбой, пока я не перезапущу приемник.
P.S. Это связано с моим недавним вопросом: Почему / dev / rfcomm0 создает проблемы с PySerial? , но это было больше о PySerial, особенно с rfcomm0. Здесь я спрашиваю об общем этикете.
Ответ на этот вопрос совпадает с ответом на Почему / dev / rfcomm0 вызывает проблемы с PySerial? , простой вопрос переполнения буфера Bluetooth на ПК.