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

标签 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

最佳答案

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

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

关于c++ - 如何通过蓝牙套接字(RFCOMM、SPP)仅发送一个字节或如何刷新蓝牙套接字(RFCOMM、SPP)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7860816/

相关文章:

c++ - 如何拦截Sendmessage API

c - 使文本无效或剪辑文本

java - 测试DatagramSockets的传输

python - 我创建套接字时未定义套接字

c++ - std::map 发现在 C++ 中不起作用

c++ - C++中多个容器的自定义迭代器

c++ - "Unresolved overloaded function type"尝试将 for_each 与 C++ 中的迭代器和函数一起使用时

c++ - 在父进程中挂接 api 调用

c++ - 如何动态地为 3d 对象着色/纹理化?

C 套接字 : Comparison between pointer and integer terminal error