Russian Qt Forum
Март 28, 2024, 19:26 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Windows Sockets Support for Bluetooth  (Прочитано 4194 раз)
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« : Сентябрь 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 поставить секундные паузы, то тоже всё нормально работает. Почему без пауз не работает?
« Последнее редактирование: Сентябрь 21, 2016, 11:22 от juvf » Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #1 : Сентябрь 21, 2016, 11:28 »

Потому что это не работает мгновенно. Вы отправили пакет, пока он дойдет это время, потом устройство должно сформировать ответ и отправить его - это еще время.
Вам нужно не сразу читать, а подождать пока придет ответ и только после этого его вычитывать.
Или использовать блокирующее чтение, тогда оно будет ждать ответа само. Но если он вообще не придет, то это чтение прервать получиться только сигналом.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #2 : Сентябрь 21, 2016, 11:37 »

при работе с компорттом использую АПИ от винды
Код:
WriteFile(port, array, 2,&BytesCnt,NULL);
 ReadFile(port, &array[2], 34, &BytesCnt, NULL);
тут тоже самое. но WriteFile и ReadFile дожидаются отправки и получения ответ. если ответа не будет, то из ReadFile выскочишь через COMMTIMEOUTS::ReadTotalTimeoutConstant милисекунд.

как в сокетах БТ этого добиться? как сделать блокирующую отправку или блокирующее чтение?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #3 : Сентябрь 21, 2016, 12:03 »

Цитировать
как сделать блокирующую отправку или блокирующее чтение?

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

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

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

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

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

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

PS: Это, если используется Qt
« Последнее редактирование: Сентябрь 21, 2016, 12:05 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
juvf
Программист
*****
Offline Offline

Сообщений: 564


Просмотр профиля
« Ответ #4 : Сентябрь 21, 2016, 12:54 »


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

Как это сделать?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.111 секунд. Запросов: 22.