реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> RS232 и медиаплейеры
WEST128
сообщение Aug 28 2008, 11:15
Сообщение #1


Местный
***

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



Написал программу чтения-записи через COM-порт, и столкнулся с такой интересной особенностью - программа не читает данные с порта до тех пор, пока не запущен какой-нибудь медиаплейер, причем для FooBar2000 требуется, чтобы проигрывалась музыка, как только нажимаю паузу, прием данных тут же отваливается. Стандартный виндовый плейер достаточно просто запустить, и прием данных идет. Не могу предположить, в чем может быть причина столь странного поведения.
Go to the top of the page
 
+Quote Post
KRS
сообщение Aug 28 2008, 11:43
Сообщение #2


Профессионал
*****

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



А вы "чужой" программой проверяли? ( терминалом например )
Может быть проблема в каких нибудь таймерах? Вы полностью настрайиваете порт, используете SetCommTimeouts?
Go to the top of the page
 
+Quote Post
VDG
сообщение Aug 28 2008, 12:06
Сообщение #3


Знающий
****

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



отдыхать надо smile.gif


--------------------
Go to the top of the page
 
+Quote Post
WEST128
сообщение Aug 28 2008, 12:12
Сообщение #4


Местный
***

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



Проверял я не программой, а осциллографом, так что достоверность 100%. К тому же работает аппартное устройство, которое шлет/принимает данные, тоже гарантированно (проверял тем же осциллографом). Прикол исключительно виндовый какой-то.
Go to the top of the page
 
+Quote Post
KRS
сообщение Aug 28 2008, 15:54
Сообщение #5


Профессионал
*****

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



Цитата(WEST128 @ Aug 28 2008, 16:12) *
Проверял я не программой, а осциллографом, так что достоверность 100%. К тому же работает аппартное устройство, которое шлет/принимает данные, тоже гарантированно (проверял тем же осциллографом). Прикол исключительно виндовый какой-то.

Причем здесь осцилограф?
Я же говорю это только Ваша программа не принимает данные или другие ( терминал например) тоже?
скорее всего вы не полностью делаете инициализацию порта.... или синхронизация хромает. а загруженность системы на это влияет
Go to the top of the page
 
+Quote Post
VDG
сообщение Aug 28 2008, 20:28
Сообщение #6


Знающий
****

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



Причина столь странного поведения в том, что криво сделан прием байтов с порта. Я не знаю что там умудрились намудрить, но скорее всего "додумались" между приёмами каждого байта ставить выдержку по таймеру (обыкновенному, WIN32, через систему сообщений).
Комп видать слабенький. Когда он ложится под нагрузкой, то сообщения таймера идут с нарушениями тайминга и то ли начинают обрабатываться, то ли наоборот, но прогая ваша начинает якобы "работать".

Разумеется под обыкновенной стандартной виндовой терминалкой ничего подобного не будет, так как там сделано всё нормально, ассинхронно и без извратов.


--------------------
Go to the top of the page
 
+Quote Post
WEST128
сообщение Sep 2 2008, 03:49
Сообщение #7


Местный
***

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



Комп на CoreQuad 6600 с 2 Гб памяти, нагрузка исчисляется в 1-2 % максимум. Никакого таймера между приемом байтов нет, таймаут только общий. Причем протестил софт на еще одном компе - все работает без каких-либо замудрений, вот и думаю, почему так.
Go to the top of the page
 
+Quote Post
Sat360
сообщение Sep 2 2008, 03:56
Сообщение #8


Участник
*

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



Было подобное. Одна программа работала нормально только в том случае, если запущена ICQ или QIP. Если программу отключить - начинает терять байты. Проявлялось на 2 компьютерах из 8 испытанных. Вылечилось увеличением таймингов.
Но, к слову сказать, программа была написана достаточно коряво.
Go to the top of the page
 
+Quote Post
WEST128
сообщение Sep 3 2008, 07:21
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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мс
Go to the top of the page
 
+Quote Post
KRS
сообщение Sep 3 2008, 07:36
Сообщение #10


Профессионал
*****

Группа: Модераторы
Сообщений: 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)
далее следует разбор на тему принято/не принято и декодируются кадры (если принято)

и эти
Вы проводите разбор если байты не считаны?
Go to the top of the page
 
+Quote Post
SysRq
сообщение Sep 3 2008, 18:00
Сообщение #11


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Ожидания завершения операции overlapped записи нету, результат WaitForSingleObject не анализируется...

Да и в курсе вы, что все задержки Windows для программ прикладного уровня считает с точностью плюс\минус эдак 30 ms запросто?..

PS: функцию SetupComm() используете, буферы какие заданы?

Сообщение отредактировал SysRq - Sep 3 2008, 18:06
Go to the top of the page
 
+Quote Post
WEST128
сообщение Sep 4 2008, 04:29
Сообщение #12


Местный
***

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



SysRq WaitForSingleObject(WriteEx.hEvent, 10) как раз и делает ожидание завершения записи. Собственно, время ограничено, и бесконечно ждать я не могу. Однако, судя по тестовому прибору (анализатор кадров самодельный) все кадры на запись ходят нормально. SetupComm используется, само собой, буферы ставлю по 2 кБ.
KRS Попробую убрать WaitForSingleEvent(), может и действительно не нужно, я этой строчкой хотел подождать завершение записи, а потом уже приступить к чтению.
Цитата
к тому же если Event создан с bManualReset = false будет глючить!
- можете пояснить этот момент ? врде в документации написано, что функции WriteFile и ReadFile следует использовать именно с автоматическим сбросом, или я неправильно понял ?
Цитата
Вы проводите разбор если байты не считаны?
- конечно нет, просто я не стал приводить весь код целиком.
Go to the top of the page
 
+Quote Post
goodwin
сообщение Sep 4 2008, 05:36
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 481
Регистрация: 1-08-05
Пользователь №: 7 267



Все вполне объяснимо - интервал стандартного таймера в NT - 10 мс, мультимедийного -1 мс.
При работе winamp в системе задействуется мультимедийный, посему и события обрабатываются оперативнее.
Попробуйте задействовать в своем приложении мультимедийный...
Go to the top of the page
 
+Quote Post
KRS
сообщение Sep 4 2008, 08:05
Сообщение #14


Профессионал
*****

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



Цитата(WEST128 @ Sep 4 2008, 08:29) *
- можете пояснить этот момент ? врде в документации написано, что функции WriteFile и ReadFile следует использовать именно с автоматическим сбросом, или я неправильно понял ?

Дело в том что если event автоматический, то его ждать можно только один раз на событие. Т.е. WaitForSingleObject у вас подождет окончания чтения, потом event сам сбросится.
А GetOverlappedResult - реализован криво. раз event не стоит он считает что результата надо ждать. и все...
Поэтому IMHO лучше там где можно всетаки использовать ручной сброс event. Тогда будет работать и в таком варианте.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Sep 4 2008, 08:57
Сообщение #15


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(WEST128 @ Sep 4 2008, 08:29) *
SysRq WaitForSingleObject(WriteEx.hEvent, 10) как раз и делает ожидание завершения записи.

Ваша правда, я мимо проглядел! 05.gif

Можно попробовать переписать через WaitCommEvent...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01465 секунд с 7
ELECTRONIX ©2004-2016