2

RFCOMMとシリアルポートプロファイル(SPP)に基づくMS Bluetoothソケットを使用して、PCとBluetoothデバイス間の接続を設定しました。

連続してデータを受信して​​も問題ありません。ただし、1バイト(コマンドとして機能)を送信する場合、デバイスはそれを受信しません。

コードスニペットは次のとおりです(エラー処理は省略)。

SOCKET s = ::socket (AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM); //successful
...
SOCKADDR_BTH btSockAddr;
ZeroMemory(&btSockAddr, sizeof(SOCKADDR_BTH));

btSockAddr.addressFamily = AF_BTH;
btSockAddr.btAddr = DEVICE_ADDRESS;
btSockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID; //SerialPortServiceClass_UUID
btSockAddr.port = BT_PORT_ANY;
...
err = ::connect(s, reinterpret_cast<SOCKADDR*>(&btSockAddr), sizeof(SOCKADDR_BTH)); //successful

char cmd = 'm'; //switch mode
int sentSize = ::send(s, &cmd, 1, 0); //successful, sentSize = 1

...
for(;;)
{
    char out;
    int recvSize = ::recv(s, &out, 1, 0);   //successful, receive byte by byte
    ...
}

::send正常に戻りますが、デバイスのモードは変更されていません。したがって、明らかに、指定されたバイトは送信されておらず、送信バッファに残っています(これが私の仮定です)。1バイトのみを強制的に送信する方法、つまりバッファなしで送信する方法はありますか?

デバイス側の間違いは除外できます。Bluetoothリンクを手動で設定し(Windows通知バー/ Bluetooth /デバイスの追加)、Puttyを使用してシリアル接続を確立すると、受信と送信の両方が期待どおりに機能します。

OS:Windows 7 IDE:Visual Studio 2010

4

2 に答える 2

0

OK、2番を試してください!:-)

この行はおそらく問題です:

btSockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID; //SerialPortServiceClass_UUID 

なぜSerialPortServiceClass_UUIDから変更したのですか?プロトコルRFCOMMを使用するSDP(サービスデータベース)内の任意のサービスに接続するようにRFCOMMソケットに指示するRFCOMM_PROTOCOL_UUIDを使用します。代わりに次のものが必要です。

btSockAddr.serviceClassId = SerialPortServiceClass_UUID 

(もちろん、デバイスのSDにRFCOMMサービスが1つしかない場合でも、実際に問題が発生することはありません)。

于 2011-10-24T13:27:18.520 に答える
0

仮想 COM ポートで Putty を使用する場合、単一のコマンド文字を入力した後にリターン キーを押しますか?

私はそう思うので、コマンド バイトの後に CR+LF を送信する必要があります。したがって、送信するサイズ 3 のバッファを渡します (つまり、{ <command>, 0x0D, 0x0A })。お使いのデバイスはおそらく回線ベースで、「回線」を待っています。

于 2011-10-23T19:47:15.507 に答える