我之前遇到过这种问题。忘记使用Java,在后台它做了无数的事情,阻止实时访问,例如。垃圾收集,线程处理。还要忘记使用事件驱动编程,即使在高优先级线程,它可能需要很长时间,在事件被处理,你可以失去数据。
我修复它的方式是写“不友好”的代码!使用C或程序集,并写了一个这样的轮询函数(在类似C的伪代码中):
#define PAUSE 2 /* Check twice as often as the packet rate */
#define TIMEOUT (500 / PAUSE) /* Abort if half a second of no data */
/* Provide handle, data buffer and size of buffer
Returns TRUE if full buffer read, FALSE if not, data unread in size
*/
BOOL real_time_read(HANDLE handle, BYTE *data, size_t *size)
{
BOOL result = FALSE;
int timeout = TIMEOUT;
set_thread_priority(REALTIME);
while (is_handle_valid(handle))
{
if (is_data_pending(handle))
{
size_t count = get_data(handle, data, size);
data += count;
*size -= count;
if (!*size)
{
result = TRUE;
break;
}
}
else if (!--timeout)
break;
/* Give a tiny time slice to other processes */
usleep(PAUSE);
}
return result;
}
你提到你试过C,所以应该很直接把它转换为真正的函数。避免使用方便功能的诱惑,你希望尽可能接近金属。例如。如果一个O / S函数Read()依次调用read(),它又调用_read(),你想使用_read()。该设备将显着减慢,而这正在进行,但这是权衡的实时访问。