Я пишу программу, которая непрерывно отправляет «Hello» на CAN-шину и считывает данные с шины через SocketCAN. Я хочу, чтобы эти два шага были независимыми. Это означает, что даже если на шине нет данных, программа все равно отправит «Hello». Но с обычным считыванием CAN это невозможно, потому что эта функция останавливает запуск программы и ждет данных.SocketCAN непрерывное чтение и запись
Есть ли способ сделать это неблокирующим или ожидающим данных только на несколько миллисекунд?
Вам не нужно использовать 'select' для SocketCAN (хотя это не проблема, если вы это делаете); вы также можете использовать 'setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, & tv, sizeof (tv))' где 'tv' является' timeval' для тайм-аутов приема. Тогда 'read' будет терпеть неудачу с' EAGAIN', если истечет время ожидания. –
@Jason C: Мне нравится ваше предложение, но это не сработало для меня: я пробовал, как описано выше, а также с «setsockopt (skt, SOL_CAN_RAW, SO_RCVTIMEO, ...», поскольку это показалось более вероятным, но в обоих случаях «read» call заблокирован навсегда, пока не появится кадр (без таймаута). – Jeremy
К сожалению, моя ошибка ... из руководства по Linux для «socket»: «Если таймаут установлен на ноль (по умолчанию), то операция никогда не будет таймаутом . Я использовал таймаут 0 в надежде получить немедленное возвращение, если не было кадра для чтения. – Jeremy