2010-01-06 5 views
0

Я играю с протоколом Firmata, который позволяет вам управлять Arduino через последовательный протокол. Я читаю значения датчиков, используя SerialPortEventListener, слушающий событие DATA_AVAILABLE. Но я замечаю большую задержку, так как обновленные значения датчиков регистрируются моим приложением, протокол работает со скоростью 57600. Мой вопрос заключается в том, что прослушиватель событий запускается в отдельном потоке или выполняет как мое приложение, так и прослушиватель запускается в том же потоке, и мое приложение замедляет работу.Реализация SerialPortEventListener

РЕДАКТИРОВАТЬ: Чтобы я был уверен, я просто спрашиваю теоретически, будет ли быстрее читать последовательную передачу в отдельном потоке или использовать прослушиватель событий?

ответ

1

Простите за все эти ответы, я много размышляю о вашей проблеме.

Помимо проблемы с обновлением графического интерфейса из-за неправильного потока, проблема с потоками, вероятно, довольно неуместна. Поскольку получение обновления из вашего последовательного порта, вероятно, не потребляет много мощности процессора (это не должно, во всяком случае, если это не сделано с жестким циклом опроса), не будет заметного раздора для ресурсов процессора между вашими потоками и поэтому не должно быть возможности, чтобы потоки «замедляли друг друга». Я бы очень отказался от этой возможности. Но вы можете посмотреть в TaskManager (Windows) или системном мониторе (Linux), чтобы узнать, действительно ли ваши процессоры действительно заняты; это может изменить ситуацию.

+0

«Извините за все эти ответы»: проблем нет :-). Вы понимаете, что можете просто отредактировать свой существующий ответ, не так ли? – sleske

+0

Я бы точно так надеялся! Но все это разные и разные ответы, поэтому я чувствую, что они должны быть представлены таким образом. Я знаю, что необычно предлагать несколько ответов, но система позволяет это, поэтому я считаю, что это должно быть правильной вещью, если я считаю это уместным. –

0

Не видя своего приложения, я должен угадать; но возможно ли, что вы пытаетесь отобразить эти события в графическом интерфейсе и обновлять графический интерфейс из потока, отличного от Thread Dispatch Thread?

Как латентность, когда вы просто делаете System.out.println()?

0

Еще одна догадка: когда вы получаете свое событие DATA_AVAILABLE, вы также получаете некоторую информацию о том, сколько данных доступно?

Возможно, вы пытаетесь прочитать больше данных, чем в буфере, и вы не можете увидеть, что у вас есть, до тех пор, пока вы не закончите время чтения. Это означает, что тайм-аут установлен на 1 секунду.