2017-07-06 13 views
1

私はそれが正常に動作Arduinoのためにデータを送信するためにラズベリーパイ上でプログラムを実行しているが、突然データの送信を停止し、エラーブルートゥース・エラー(11、リソースが一時的に利用できない)

エラーメッセージ "

socket.send('0') 
bluetooth error(11,resource are temporarily unavailable) 
をバック返します

Arduinoが0を受信するとArduinoに0を送信することを目的としています。ブザーはそれ以外のアラームを発することはありません..すべてのものはうまくいっていますが、突然ブザーアラームが鳴りますが、2のBluetoothは 'pi'と 'Arduino' 。

I海エラーの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

であるあなたがあなたの中には遅延がないように私は、あなたがそれを氾濫していると思います。データを実際に送信できるよりも速く送信すると、最終的にバッファがいっぱいになります。 whiletime.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分後にデータが停止し、ブザーがアラームを開始するのではなく...ブザーが点滅(1回pep)し、2分アラームが連続して機能するようになりました。 –

関連する問題