gpt4 book ai didi

python - 蓝牙错误(11、资源暂时不可用)

转载 作者:太空宇宙 更新时间:2023-11-03 15:02:28 25 4
gpt4 key购买 nike

当我在树莓派上运行程序向Arduino发送数据时,它工作正常,但突然停止发送数据并返回错误

错误信息“

socket.send('0') 
bluetooth error(11,resource are temporarily unavailable)

这个程序的目的是发送0到Arduino,如果Arduino收到0个蜂鸣器不会报警,否则它会报警..2分钟内一切顺利,但突然蜂鸣器报警,但“pi”和“Arduino”中的2个蓝牙仍然没有连接已断开连接。

我搜索错误,发现它是因为 pi 中的缓冲区已满并且它变成了 block ,但我无法解决问题,有人可以帮助我吗?谢谢。

这是代码

import bluetooth
import time
bd_addr = "98:D3:31:FB:19:AF"
port = 1
sock = bluetooth.BluetoothSocket (bluetooth.RFCOMM)
sock.connect((bd_addr,port))
while 1:
sock.send("0")
time.sleep(2)
sock.close()

arduino代码

#include <SoftwareSerial.h>
SoftwareSerial bt (5,6);
int LEDPin = 13; //LED PIN on Arduino
int btdata; // the data given from the computer
void setup() { bt.begin(9600); pinMode (LEDPin, OUTPUT); }
void loop() {
if (bt.available()) {
btdata = bt.read();
if (btdata == '1') {
//if 1
digitalWrite (LEDPin,HIGH);
bt.println ("LED OFF!");
}
else {
//if 0
digitalWrite (LEDPin,LOW);
bt.println ("LED ON!");
}
} else { digitalWrite(LEDPin, HIGH);
delay (100); //prepare for data
}
}

最佳答案

我认为你正在淹没它,因为你没有耽搁你的时间。您生成要发送的数据的速度比实际发送数据的速度要快,这最终会填满缓冲区。只需在 while 中添加一个 time.sleep(0.5) 并通过测试哪个在不填满缓冲区的情况下效果最好来减小值 0.5 即可。

这是我尝试让您的代码更具弹性:

import bluetooth
import time
bd_addr = "98:D3:31:FB:19:AF"
port = 1
sock = bluetooth.BluetoothSocket (bluetooth.RFCOMM)
sock.connect((bd_addr,port))
while 1:
try:
sock.send("0")
time.sleep(0.1)
sock.recv(1024)
except bluetooth.btcommon.BluetoothError as error:
print "Caught BluetoothError: ", error
time.sleep(5)
sock.connect((bd_addr,port))
time.sleep(2)
sock.close()

它的作用是:

  • 发送新数据包之前稍等一下:防止计算机生成数据的速度快于发送数据的速度,从而最终填满缓冲区

  • 读取传入数据,从而从入站缓冲区中消耗它:arduino 实际上响应您的请求,并填充入站缓冲区。如果你不偶尔清空它,它就会溢出,你的套接字将变得无法使用

  • 监视连接错误,并尝试通过关闭并重新打开套接字来恢复错误

我也会像这样修改arduino代码:

#include <SoftwareSerial.h>
SoftwareSerial bt (5,6);
int LEDPin = 13; //LED PIN on Arduino
int btdata; // the data given from the computer
void setup() { bt.begin(9600); pinMode (LEDPin, OUTPUT); }
void loop() {
if (bt.available()) {
btdata = bt.read();
if (btdata == '1') {
//if 1
digitalWrite (LEDPin,HIGH);
bt.println ("LED OFF!");
}
else {
//if 0
digitalWrite (LEDPin,LOW);
bt.println ("LED ON!");
}
delay(1000);
} else { digitalWrite(LEDPin, HIGH);
delay (10); //prepare for data
}
}

关于python - 蓝牙错误(11、资源暂时不可用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44948710/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com