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