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

标签 python bluetooth arduino

当我在树莓派上运行程序向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/

相关文章:

python - 删除特殊引号和其他字符

Python,lambda 函数作为 groupby 的参数

android - 蓝牙在 VirtualBox 上的 Android x86 中不起作用

c - 将数组传递给函数并在 Arduino 中使用 sizeof

c++ - 通过 Arduino 上的 gprs shield 接收短信

automation - 使用 Arduino 进行照明控制

python - 如何用pynput按住键?

python - 在 python (lxml) 中抓取嵌套和非结构化表

ios - 通过蓝牙接收字符串数据

android - 如何使用 adb shell 控制蓝牙操作?