蓝牙错误(11,资源暂时不可用)

时间:2017-07-06 12:19:42

标签: python bluetooth arduino

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

错误消息"

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

这个计划的目的是向Arduino发送0,如果Arduino收到0个蜂鸣器不会报警,否则它会报警... 2分钟一切顺利但突然蜂鸣器报警但是2蓝牙在' pi'和#Arduino'仍然没有断开连接。

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

这是代码

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   
    } 
}

1 个答案:

答案 0 :(得分:0)

我认为你在淹没它,因为你没有延迟。您生成的数据发送速度比实际发送速度快,最终会填满缓冲区。只需在time.sleep(0.5)中添加while,然后通过测试哪一个效果最佳而不填充缓冲区来减少值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()

这是做什么的:

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

  • 读取incomming数据,从入站缓冲区消耗它: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   
    } 
}