Как отправить только один байт через гнездо Bluetooth (RFCOMM, SPP) или Как очистить гнездо Bluetooth (RFCOMM, SPP)? - PullRequest
2 голосов
/ 22 октября 2011

Я установил соединение между моим ПК и устройством 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

Ответы [ 2 ]

0 голосов
/ 24 октября 2011

ОК, попробуйте номер 2! : -)

Эта строка, вероятно, является проблемой:

btSockAddr.serviceClassId = RFCOMM_PROTOCOL_UUID; //SerialPortServiceClass_UUID 

Почему вы изменили SerialPortServiceClass_UUID? С RFCOMM_PROTOCOL_UUID, который сообщает сокету RFCOMM подключиться к любой службе в SDP (базе данных службы), которая использует протокол RFCOMM. Вместо этого вы хотите иметь:

btSockAddr.serviceClassId = SerialPortServiceClass_UUID 

(Конечно, это на самом деле не вызовет проблемы, которую вы видите, если устройство имеет только одну службу RFCOMM на SD).

0 голосов
/ 23 октября 2011

Когда вы используете Putty с виртуальным COM-портом, нажимаете ли вы клавишу return после ввода единственного командного символа?

Я подозреваю, что так, и поэтому вам нужно отправить CR + LF после байта команды. Поэтому передайте буфер размером три для отправки (т. Е. {, 0x0D, 0x0A}). Ваше устройство предположительно основано на линии, и оно ожидает "линию".

...