我正在尝试使用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只是没有及时唤醒我的线程。
这种行为有什么解释,我该如何消除它?