|
RS232 и медиаплейеры |
|
|
|
Aug 28 2008, 11:15
|

Местный
  
Группа: Свой
Сообщений: 468
Регистрация: 13-10-06
Из: Россия, Томск
Пользователь №: 21 291

|
Написал программу чтения-записи через COM-порт, и столкнулся с такой интересной особенностью - программа не читает данные с порта до тех пор, пока не запущен какой-нибудь медиаплейер, причем для FooBar2000 требуется, чтобы проигрывалась музыка, как только нажимаю паузу, прием данных тут же отваливается. Стандартный виндовый плейер достаточно просто запустить, и прием данных идет. Не могу предположить, в чем может быть причина столь странного поведения.
|
|
|
|
|
 |
Ответов
|
Sep 3 2008, 07:21
|

Местный
  
Группа: Свой
Сообщений: 468
Регистрация: 13-10-06
Из: Россия, Томск
Пользователь №: 21 291

|
Суть программы такова: отсылаем короткий запрос на устройство (5 байт), далее переключается интерфейс RS485 на прием и ждем некоторое время ответа. Потом переключаем интерфейс RS485 на передачу и снова шлем запрос. Свою проблему "вылечил" увеличением времени задержки в отвечающем устройстве до 18 мс, раньше было 2 мс. Программа стала работать на любом ПК, но решение мне категорически не нравится. Вот собственно кусок кода, отвечающий за передачу-прием: while(true) { WriteFile(CommHandle, wrbuffer, 3, &BytesWritten, &WriteEx); ReadFile(CommHandle, rdbuffer, 7, &BytesRead, &ReadEx); WaitForSingleObject(WriteEx.hEvent, 10);
GetOverlappedResult(CommHandle, &ReadEx, &BytesRead, true))
if (BytesRead == 0) далее следует разбор на тему принято/не принято и декодируются кадры (если принято)
Sleep(10); } все работает в отдельном потоке, таймауты на передачу общий 5 мс, на прием 25мс
|
|
|
|
|
Sep 3 2008, 07:36
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(WEST128 @ Sep 3 2008, 11:21)  WaitForSingleObject(WriteEx.hEvent, 10); GetOverlappedResult(CommHandle, &ReadEx, &BytesRead, true)) } все работает в отдельном потоке, таймауты на передачу общий 5 мс, на прием 25мс смущают эти строчки! зачем два вызова функций? когда можно обойтись только GetOverlappedResult к тому же если Event создан с bManualReset = false будет глючить! Цитата if (BytesRead == 0) далее следует разбор на тему принято/не принято и декодируются кадры (если принято) и эти Вы проводите разбор если байты не считаны?
|
|
|
|
Сообщений в этой теме
WEST128 RS232 и медиаплейеры Aug 28 2008, 11:15 KRS А вы "чужой" программой проверяли? ( тер... Aug 28 2008, 11:43 VDG отдыхать надо Aug 28 2008, 12:06 WEST128 Проверял я не программой, а осциллографом, так что... Aug 28 2008, 12:12 KRS Цитата(WEST128 @ Aug 28 2008, 16:12) Пров... Aug 28 2008, 15:54 VDG Причина столь странного поведения в том, что криво... Aug 28 2008, 20:28 WEST128 Комп на CoreQuad 6600 с 2 Гб памяти, нагрузка исчи... Sep 2 2008, 03:49 Sat360 Было подобное. Одна программа работала нормально т... Sep 2 2008, 03:56 SysRq Ожидания завершения операции overlapped записи нет... Sep 3 2008, 18:00 WEST128 SysRq WaitForSingleObject(WriteEx.hEvent, 10) как ... Sep 4 2008, 04:29 KRS Цитата(WEST128 @ Sep 4 2008, 08:29) - мож... Sep 4 2008, 08:05 SysRq Цитата(WEST128 @ Sep 4 2008, 08:29) SysR... Sep 4 2008, 08:57 goodwin Все вполне объяснимо - интервал стандартного тайме... Sep 4 2008, 05:36 VDG Цитата(goodwin @ Sep 4 2008, 09:36) При р... Sep 5 2008, 14:10 WEST128 goodwin Спасибо за мультимедийный таймер, я даже ... Sep 5 2008, 04:15 KRS Цитата(WEST128 @ Sep 5 2008, 08:15) KRS п... Sep 5 2008, 07:26 WEST128 Мне помогло использование мультимедийного таймера,... Sep 6 2008, 05:54 VDG Цитата(WEST128 @ Sep 6 2008, 09:54) Мне п... Sep 6 2008, 17:58 WEST128 Может быть, сейчас просто нет времени выяснять это... Sep 9 2008, 07:31
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|