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

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

|
Написал программу чтения-записи через COM-порт, и столкнулся с такой интересной особенностью - программа не читает данные с порта до тех пор, пока не запущен какой-нибудь медиаплейер, причем для FooBar2000 требуется, чтобы проигрывалась музыка, как только нажимаю паузу, прием данных тут же отваливается. Стандартный виндовый плейер достаточно просто запустить, и прием данных идет. Не могу предположить, в чем может быть причина столь странного поведения.
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 20)
|
Aug 28 2008, 20:28
|

Знающий
   
Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193

|
Причина столь странного поведения в том, что криво сделан прием байтов с порта. Я не знаю что там умудрились намудрить, но скорее всего "додумались" между приёмами каждого байта ставить выдержку по таймеру (обыкновенному, WIN32, через систему сообщений). Комп видать слабенький. Когда он ложится под нагрузкой, то сообщения таймера идут с нарушениями тайминга и то ли начинают обрабатываться, то ли наоборот, но прогая ваша начинает якобы "работать".
Разумеется под обыкновенной стандартной виндовой терминалкой ничего подобного не будет, так как там сделано всё нормально, ассинхронно и без извратов.
--------------------
|
|
|
|
|
Sep 2 2008, 03:56
|
Участник

Группа: Свой
Сообщений: 26
Регистрация: 26-02-08
Из: Томск
Пользователь №: 35 391

|
Было подобное. Одна программа работала нормально только в том случае, если запущена ICQ или QIP. Если программу отключить - начинает терять байты. Проявлялось на 2 компьютерах из 8 испытанных. Вылечилось увеличением таймингов. Но, к слову сказать, программа была написана достаточно коряво.
|
|
|
|
|
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) далее следует разбор на тему принято/не принято и декодируются кадры (если принято) и эти Вы проводите разбор если байты не считаны?
|
|
|
|
|
Sep 4 2008, 04:29
|

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

|
SysRq WaitForSingleObject(WriteEx.hEvent, 10) как раз и делает ожидание завершения записи. Собственно, время ограничено, и бесконечно ждать я не могу. Однако, судя по тестовому прибору (анализатор кадров самодельный) все кадры на запись ходят нормально. SetupComm используется, само собой, буферы ставлю по 2 кБ. KRS Попробую убрать WaitForSingleEvent(), может и действительно не нужно, я этой строчкой хотел подождать завершение записи, а потом уже приступить к чтению. Цитата к тому же если Event создан с bManualReset = false будет глючить! - можете пояснить этот момент ? врде в документации написано, что функции WriteFile и ReadFile следует использовать именно с автоматическим сбросом, или я неправильно понял ? Цитата Вы проводите разбор если байты не считаны? - конечно нет, просто я не стал приводить весь код целиком.
|
|
|
|
|
Sep 5 2008, 04:15
|

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

|
goodwin Спасибо за мультимедийный таймер, я даже не знал про его существование . KRS почему криво, WaitForSingleEvent ждет запись, а GetOverlappedResult - чтение, или я не прав ? На данный момент проблема решена, всем спасибо за помощь. А вообще наверно стоило делать аппаратную примочку, чтобы сама опрашивало, будет явно быстрее. Если будет вторая версия, так и предложу заказчику.
|
|
|
|
|
Sep 5 2008, 14:10
|

Знающий
   
Группа: Участник
Сообщений: 845
Регистрация: 10-02-06
Пользователь №: 14 193

|
Цитата(goodwin @ Sep 4 2008, 09:36)  При работе winamp в системе задействуется мультимедийный, посему и события обрабатываются оперативнее. Глупости какие-то говорите. Мультимедийный таймер и таймер WIN32 работают совершенно не зависимо друг от друга. Цитата На данный момент проблема решена, всем спасибо за помощь. Так в чем все таки был у Вас косяк?
Сообщение отредактировал VDG - Sep 5 2008, 14:12
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|