2017-01-24 7 views
0

私はarduinoからirコードを受け取り、results.value(irデコード)をBluetooth経由でアンドロイドに送信するアンドロイドアプリ+ arduinoを作っています。アンドロイド側では、コードを受け取って(例えば)92c0にしてarduinoに返信して、デバイスにirコードを送信するテストボタンを作成しましたirsend.sendNEC(0x92c0, 32)問題はコードを受け取るときですcharを演算子として使用しますか?

#include <IRremote.h> 
#include <SoftwareSerial.h> 



SoftwareSerial bluetoothPort(4,5); 
const int RECV_PIN = 12; 
char data = "0"; 
const int SEND_PIN = 13; 

IRsend irsend; 


IRrecv irrecv(RECV_PIN); 

decode_results results; 
int BTval; 
int IRval; 



void setup() 
{ 
    bluetoothPort.begin(9600); 
    Serial.begin(9600); 
    irrecv.enableIRIn(); 

} 




void loop() 
{ 
    if(bluetoothPort.available() > 0) 
    { 
    data = bluetoothPort.read(); 
    Serial.print(data); 
    irsend.sendNEC(operator[data],32); 
    irrecv.resume(); 
    } 
    if(irrecv.decode(&results)) 
    { 
    Serial.println(results.value); 
    int set = results.value; 
    bluetoothPort.println(results.value, HEX); 
    irrecv.resume(); 


    } 
} 

答えて

0

ここで問題があることである:バックアンドロイドアプリから私はどのように私はcharがあるdataを使用し、ダウン以下irsend.sendNマイスケッチに0x92c0の代替としてそれを使うのですか、char dataことによってそれを受信する必要がされます0x92c0をchar(またはbyte)として転送することはできません。ちょうどそれがバイトではなく2つであるからです。

は今、私はアンドロイドにあまりないので、私はあなたの3つの方法でこれを扱うことができる真の解決策を作成するには、Androidのコードを参照する必要があります。

  1. バイナリ(2バイト)のデータを転送
  2. データを文字列として転送する(5バイト)
  3. 可能な応答を配列に索引付けし、索引を転送します(少量のコードに対してのみ適用可能)。

第1位が最も効果的ですが、私はあなたがアンドロイドからバイナリ形式でデータを送受信するための適切な知識を持っているとは思いません(と確かに私はしませんそれを持っている)。

データを文字列形式(あなたがそれをアップロードしているのと同じ方法)で転送されるのであれば、あなたはより多くのバイト受信します:

  • 1〜4桁の16進数字
  • 1キャリッジリターン

コードはちょうどあなたが変数に受信バイトを格納し、その後、あなたはCRやLFを受信したときにそれを送信します。

// Outside the loop function 
uint16_t receivedData; 

// Inside the loop function 
if(bluetoothPort.available() > 0) 
{ 
    data = bluetoothPort.read(); 

    if ((data >= '0') && (data <= '9')) 
    { // If it is a digit between 0 and 9 (in ascii) 
     receivedData = (receivedData << 4) | (data - '0'); 
    } 
    else if ((data >= 'A') && (data <= 'F')) 
    { // If it is a digit between A and F (in ascii) 
     receivedData = (receivedData << 4) | (data - 'A' + 10); 
    } 
    else if ((data >= 'a') && (data <= 'f')) 
    { // Lowercase case 
     receivedData = (receivedData << 4) | (data - 'a' + 10); 
    } 
    else if (((data == '\r') || (data == '\n')) && (receivedData > 0)) 
    { // I tend to consider both CR and LF, because windows always screws this 
     Serial.print(receivedData, HEX); 
     irsend.sendNEC(receivedData,32); // Not sure about the 32 here... 
     irrecv.resume(); 
     receivedData = 0; 
    } 
    else 
     receivedData = 0; // Something went wrong, just reset the variable 
} 

いくつかのコードを送信するだけであれば、コードを保存してから適切なインデックスのみを転送することができます。例えば:あなたが値0

にアンドロイドから送信する必要があります0x92c0

この場合、例えば
// Outside the loop function 
uint16_t possibleCodes[] = { 0x92c0, 0x8238, 0x5555 }; 

// Inside the loop function 
if(bluetoothPort.available() > 0) 
{ 
    data = bluetoothPort.read(); 
    // If you are using string transmission, use the following 
    // line to get the correct value 
    // data = bluetoothPort.read() - '0'; 

    if (data < sizeof(possibleCodes)/sizeof(possibleCodes[0])) 
    { 
     Serial.print(possibleCodes[data], HEX); 
     irsend.sendNEC(possibleCodes[data],32); // Not sure about the 32 here... 
     irrecv.resume(); 
    } 
} 

を送信します

関連する問題