Russian Qt Forum

Компиляторы и платформы => Windows => Тема начата: juvf от Сентябрь 21, 2016, 11:20



Название: Windows Sockets Support for Bluetooth
Отправлено: juvf от Сентябрь 21, 2016, 11:20
пытаюсь общаться с устройством через БТ. Использую winsock2
создаю сокет, вызываю коннект - всё нормально. связь устанавливается. далее посылаю пакет и пытаюсь вычитать...
Код:
char array[100] = {0x80, 8, 0xff, 0x7f, 2, 0x27};
iResult = ::send(sock, array, 8, 0);
            if (iResult == SOCKET_ERROR)
            {
                return getLastErrorAsString();
            }
            iResult = shutdown(sock, SD_SEND);
            iResult = ::recv(sock, array, 100, 0);
send возвращает 8, но в применом устройстве нет этого приема. ни чего приемное устройство не получает. если поставить точку останова на строке
iResult = ::send(sock, array, 8, 0);
и дальше пошагово пройти, то все функции (send, shutdown и recv) выполняются нормально и я ответ получаю. если непошагово, то ответа нет.
если между send, shutdown и recv поставить секундные паузы, то тоже всё нормально работает. Почему без пауз не работает?


Название: Re: Windows Sockets Support for Bluetooth
Отправлено: Old от Сентябрь 21, 2016, 11:28
Потому что это не работает мгновенно. Вы отправили пакет, пока он дойдет это время, потом устройство должно сформировать ответ и отправить его - это еще время.
Вам нужно не сразу читать, а подождать пока придет ответ и только после этого его вычитывать.
Или использовать блокирующее чтение, тогда оно будет ждать ответа само. Но если он вообще не придет, то это чтение прервать получиться только сигналом.


Название: Re: Windows Sockets Support for Bluetooth
Отправлено: juvf от Сентябрь 21, 2016, 11:37
при работе с компорттом использую АПИ от винды
Код:
 WriteFile(port, array, 2,&BytesCnt,NULL);
 ReadFile(port, &array[2], 34, &BytesCnt, NULL);
тут тоже самое. но WriteFile и ReadFile дожидаются отправки и получения ответ. если ответа не будет, то из ReadFile выскочишь через COMMTIMEOUTS::ReadTotalTimeoutConstant милисекунд.

как в сокетах БТ этого добиться? как сделать блокирующую отправку или блокирующее чтение?


Название: Re: Windows Sockets Support for Bluetooth
Отправлено: kuzulis от Сентябрь 21, 2016, 12:03
Цитировать
как сделать блокирующую отправку или блокирующее чтение?

Установить сокету соответствующие аттрибуты/флаги чтобы он стал блокирующим, не?

Цитировать
как в сокетах БТ этого добиться?

Использовать нотификацию что сообщение доставлено / принято.

Я бы, раз уж используется WinSock, и использовал бы его АПИ, а не POSIX прослойку. И мониторил бы эвенты на дескрипторе через QWinEventNotifier/QWinIoOverlappedNotifier.

Если уж так нужна POSIX прослойка, то мониторил бы через QSocketNotifier.

Хотя, если дать сокету нужные аттрибуты, то нет необходимости в нотификациях, т.к. весь I/O будет блокирующим, ИМХО.

PS: Это, если используется Qt


Название: Re: Windows Sockets Support for Bluetooth
Отправлено: juvf от Сентябрь 21, 2016, 12:54

Установить сокету соответствующие аттрибуты/флаги чтобы он стал блокирующим, не?

Как это сделать?