使用Winsock2进行蓝牙连接的延迟

时间:2016-07-28 20:57:25

标签: c++ bluetooth arduino winsock

我正在尝试使用WinSock2 API来读取我使用HC-06蓝牙发射器从Arduino mega发送的信息。最终,我计划将这个Arduino设置用作Unity游戏中的运动控制器。我已经设法获得所有信息,但在游戏中所有输入似乎都会延迟一秒钟。

我将问题追溯到我对蓝牙插座上的recv的调用。这是有问题的代码:

static int readNext(void * buffer, size_t bufferLength) {
    int ret = -1;
    if (isConnected()) {
        ret = recv(sock, (char*)buffer, (int)bufferLength, 0);
        if (ret == 0 || ret == SOCKET_ERROR) {
            cleanupSocket();
            ret = -1;
        }
    }
    return ret;
}

static void waitForNext(void * buffer, size_t bufferLength) {
    size_t received = 0;
    while (isConnected() && received < bufferLength) {
        select(0, &fset, NULL, NULL, NULL);
        received += readNext(((char*)buffer) + received, bufferLength - received);
    }
}

我在紧密循环内的工作线程中调用waitForNext。此循环中的其他所有内容都具有简单的运行时间(总共小于1毫秒)。由于我以远低于此循环频率的恒定频率进行传输,因此我希望看到recv一次获得单个字节,然后我的其他代码重新组成一个帧。相反,对于大约十分之九的帧(尽管这不是常数),我在不到一毫秒的时间内从recv获得了所有十三个字节。对于最后一帧,我的代码在select调用中挂起,持续时间为70到200毫秒。当我删除select调用(将waitForNext函数转换为忙等待循环)时也会发生同样的事情,所以它似乎不是Windows只是没有及时唤醒我的线程。

这种行为有什么解释,我该如何消除它?

0 个答案:

没有答案