2017-07-06 100 views
1

当我运行树莓PI程序将数据发送到Arduino的它正常工作,但突然停止发送数据,并返回一个错误蓝牙错误(11,资源暂时不可用)

错误消息“

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

这个计划的目的是送0的Arduino Arduino的,如果收到0蜂鸣器不会报警否则就报警..for2分钟所有的事情进展顺利,但突然蜂鸣器报警,但2蓝牙“圆周率”和“Arduino的”仍连接没有断开。

我海rch的错误,并找到它是因为在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 
    } 
} 

回答

0

我认为你是洪水淹没了,因为你有你的,而没有延迟。您生成的数据发送速度比实际发送数据要快,最终会填充缓冲区。只需在您的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 
    } 
} 
+0

我做到这一点,但仍然有同样的错误一些minutes..i试图0.5或0.2或0.01或0.001后,但错误依然发生 –

+0

我修改回答让你的代码更具韧性 –

+0

不幸的是,2分钟后蜂鸣器停止而蜂鸣器开始报警,现在蜂鸣器闪烁(pep一次),持续2分钟后报警。 –

相关问题