首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >蓝牙错误(11,资源暂时不可用)

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

Stack Overflow用户
提问于 2017-07-06 12:19:41
回答 1查看 967关注 0票数 1

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

错误信息“

代码语言:javascript
复制
socket.send('0') 
bluetooth error(11,resource are temporarily unavailable)

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

我搜索错误并发现它是因为pi中的缓冲区已经满了,它变成了块,但我不能解决问题,谁可以帮助我?谢谢。

这是代码

代码语言:javascript
复制
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码

代码语言:javascript
复制
#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   
    } 
}
EN

回答 1

Stack Overflow用户

发布于 2017-07-06 12:32:31

我认为你是在淹没它,因为你没有拖延的时间。您生成的数据发送速度比实际发送的要快,这最终会填满缓冲区。只需在您的time.sleep(0.5)中添加一个while,并通过测试哪一个在不填充缓冲区的情况下工作得最好,从而降低0.5值。

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

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
#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   
    } 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44948710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档