10 years ago.

BTStackの改造方法について

AndroidからBluetoothを使ってmbedを操作しようと思い、その先駆けとして、 BTStackを改造して4つのボタンそれぞれの押下に合わせてmbed上のLED1~4を点灯させる(もう1度押すと消える)ソースを作り実験しています。 ソース中ではsscanfでAndroidから送信された文字を受け取り、それに対応させようとしていますが、 Android中のどのボタンを押してもどういうわけかLED4のみが点灯してしまいます。

ソースはspp_demo.cppをベースとしてこちらを参考にしています。必要最低限の箇所のみ表記します。

static int command(uint8_t *packet,uint16_t size){
        
    char cmd;
    unsigned long int sign1;
    unsigned long int sign2;
    int ret=0;
    int err=1;
    
    if(size<2)return err;
    if(packet[size-1]!=0x0d && packet[size-1]!=0x0a)return err;
    packet[size]=0x00;
    
        switch(packet[0]){
            case 'A':
              ret=sscanf((char *)packet,"%c,%x,%x",&cmd,&sign1,&sign2);
              pc.printf("ret=%d,cmd=%c,sign1=%x,sign2=%x\n",ret,cmd,sign1,sign2);
              if(ret==3){
              if(sign1==0x0001)led1=!led1;
              }
            break;

以下caseB~Dまであります。sign1==0x0004まで、led4までつけるようになっています。

        err=0;
                }
    return err;
    }

// Bluetooth logic

(中略)

       case RFCOMM_DATA_PACKET:
            // loopback
            if (rfcomm_channel_id) {
 /*               err = rfcomm_send_internal(rfcomm_channel_id, packet, size);
                if (err) {
                    log_info("rfcomm_send_internal -> error %d", err);*/
                command(packet,size);
                }
            //led3 = !led3;
            break;
        default:
            break;
    }
}

Androidからの受信方法に不備があるのでしょうか。それともAndroid側のプログラムの問題でしょうか。 ちなみにAndroid側からsendmessage()関数で文字を指定して直接mbedへ送る方式にしています。

こんにちは。

BTstackの処理については分かりませんが、まずは想定しているパケットが飛んできているかを確認するのが良いのではないでしょうか?

例:packet[0] が 'D' 以外で、 sign1が0x4以外の場合など

posted by Toyomasa Watarai 04 May 2014
Be the first to answer this question.

Assigned to Ptarmigan_TB nanatsuboshi 10 years ago.

This means that the question has been accepted and is being worked on.