如何通过蓝牙套接字(RFCOMM,SPP)仅发送一个字节或如何刷新蓝牙套接字(RFCOMM,SPP)?

时间:2011-10-22 16:13:28

标签: c++ winapi sockets bluetooth rfcomm

我已经使用基于RFCOMM和串行端口配置文件(SPP)的MS蓝牙插座在我的PC和蓝牙设备之间建立了连接。

连续接收数据没有问题。但是,如果要发送一个字节(用作命令),则设备不会接收它。

以下是代码片段(省略错误处理):

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成功返回,但设备的模式未更改。所以,显然,给定的字节尚未传输,仍然驻留在发送缓冲区中(这是我的假设)。有没有办法强制只发送一个字节,即发送无缓冲的?

我可以排除设备端的错误。手动设置蓝牙链接(Windows通知栏/蓝牙/添加设备)并使用Putty建立串行连接,接收和发送都按预期工作。

操作系统:Windows 7 IDE:Visual Studio 2010

2 个答案:

答案 0 :(得分:0)

当您使用Putty和虚拟COM端口时,您是否在输入单个命令字符后点击返回?

我怀疑是这样,因此你需要在命令字节后发送CR + LF。因此,传递一个大小为3的缓冲区来发送(即{&lt; command&gt;,0x0D,0x0A})。您的设备可能是基于线路的,它正在等待“线路”。

答案 1 :(得分:0)

好的,试试2号! : - )

这一行可能是问题所在:

btSockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID; //SerialPortServiceClass_UUID 

为什么要从SerialPortServiceClass_UUID更改?使用RFCOMM_PROTOCOL_UUID告诉RFCOMM套接字连接到使用协议RFCOMM的SDP(服务数据库)中的任何服务。你想要的是:

btSockAddr.serviceClassId = SerialPortServiceClass_UUID 

(当然,如果设备在SD中只有一个RFCOMM服务,这不会导致您遇到的问题。)