【问题标题】:How to send only one Byte over a Bluetooth Socket (RFCOMM, SPP) or How to flush a Bluetooth Socket (RFCOMM, SPP)?如何通过蓝牙套接字(RFCOMM、SPP)仅发送一个字节或如何刷新蓝牙套接字(RFCOMM、SPP)?
【发布时间】:2011-12-13 05:36:09
【问题描述】:

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

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

这里是sn-ps的代码(错误处理省略):

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

【问题讨论】:

    标签: c++ winapi sockets bluetooth rfcomm


    【解决方案1】:

    好的,试试 2 号! :-)

    这行可能是问题所在:

    btSockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID; //SerialPortServiceClass_UUID 
    

    为什么要从 SerialPortServiceClass_UUID 更改?使用 RFCOMM_PROTOCOL_UUID 告诉 RFCOMM 套接字连接到使用协议 RFCOMM 的 SDP(服务数据库)中的 any 服务。您希望拥有:

    btSockAddr.serviceClassId = SerialPortServiceClass_UUID 
    

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

    【讨论】:

    • 不幸的是,您的最后一句话适用;-)。只有一项服务(SPP)可用,因此替换 serviceClassID 不会改变任何事情。
    • 顺便说一句,我期望这个基于 RFCOMM 的套接字发送无缓冲的所有内容是否正确?我的意思是,一个通用的 TCP/UDP 套接字缓冲区,让底层决定何时实际发送。
    【解决方案2】:

    当您将 Putty 与虚拟 COM 端口一起使用时,您是否会在输入单个命令字符后按回车键?

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

    【讨论】:

    • 感谢您的回答。不,该设备不是基于线路的。一旦我按下一个键,它的模式就会立即改变,不需要回车。不过,这将是一个好点:-)
    猜你喜欢
    • 2013-01-08
    • 2011-07-31
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2015-10-25
    • 1970-01-01
    • 2012-08-08
    相关资源
    最近更新 更多