Реализация SerialPortEventListener - PullRequest
0 голосов
/ 06 января 2010

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

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

Ответы [ 3 ]

1 голос
/ 06 января 2010

Извините за все эти ответы, я серьезно думаю о вашей проблеме.

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

0 голосов
/ 06 января 2010

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

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

0 голосов
/ 06 января 2010

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

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

...