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

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

|
Написал программу чтения-записи через COM-порт, и столкнулся с такой интересной особенностью - программа не читает данные с порта до тех пор, пока не запущен какой-нибудь медиаплейер, причем для FooBar2000 требуется, чтобы проигрывалась музыка, как только нажимаю паузу, прием данных тут же отваливается. Стандартный виндовый плейер достаточно просто запустить, и прием данных идет. Не могу предположить, в чем может быть причина столь странного поведения.
|
|
|
|
|
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 следует использовать именно с автоматическим сбросом, или я неправильно понял ? Цитата Вы проводите разбор если байты не считаны? - конечно нет, просто я не стал приводить весь код целиком.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|