Ответ 1
Я столкнулся с такой проблемой раньше. Забудьте использовать Java, в фоновом режиме он делает неисчислимое количество вещей, которые препятствуют доступу в реальном времени, например. сбор мусора, обработка резьбы. Также забывайте использовать управляемое событиями программирование даже в высокоприоритетных потоках, это может занять много времени до того, как событие будет обработано, и вы можете потерять данные.
То, как я исправил это, было написать "недружественный" код! Использовал C или сборку и написал такую функцию опроса (в псевдокоде C-like):
#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()
.
Устройство будет заметно медленнее, пока это происходит, но это компромисс в режиме реального времени.