Я установил соединение между моим ПК и устройством Bluetooth с помощью разъема MS Bluetooth на основе RFCOMM и профиля последовательного порта (SPP).
Нет проблем для непрерывного получения данных.Однако, если требуется отправить один байт (который действует как команда), устройство не получает его.
Вот фрагменты кода (обработка ошибок опущена):
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
успешно возвращается, режим устройства не изменился.Таким образом, очевидно, что данный байт не был передан и все еще находится в буфере отправки (это мое предположение).Есть ли способ заставить отправлять только один байт, т.е. отправлять без буферизации?
Я могу исключить ошибку на стороне устройства.Настройка связи Bluetooth вручную (панель уведомлений Windows / Bluetooth / Добавить устройство) и использование Putty для установки последовательного соединения, прием и отправка работают должным образом.
ОС: Windows 7 IDE: Visual Studio 2010