|
RS232 под win, частота опроса СОМ порта под WinXP |
|
|
|
Jul 21 2011, 12:42
|

Местный
  
Группа: Свой
Сообщений: 473
Регистрация: 10-09-06
Из: Тольятти. Самарская обл.
Пользователь №: 20 249

|
Цитата(Dog Pawlowa @ Jul 21 2011, 16:39)  Обмен бездарный. Сами придумали? Предложите, пожалуйста, или ткните ссылкой в правильный. Тоже очень нужно.
--------------------
Если все, то не я...
|
|
|
|
|
Jul 21 2011, 12:59
|

Участник

Группа: Участник
Сообщений: 54
Регистрация: 13-01-09
Пользователь №: 43 304

|
Решалась подобная задача, писал на PureBasic. Открывал в приложении параллельный поток. В нем выполнялась функция приема из COM порта. Пользовался тупым сравнением прошедшего времени в мс. т.е. что то типо того : Код DateTime dt= DateTime.Now while (true) { if (dt<=DateTime.Now) { //твоя операция dt=DateTime.Now.AddMilliseconds(20); } } на PureBasic это выглядит несколько иначе: Код dT.f=MeasureHiResIntervalStop() MeasureHiResIntervalStart() T.f=T+Abs(dT) If T>=0.020 T=0 ;действие EndIF
Сообщение отредактировал ibiza11 - Jul 21 2011, 13:01
|
|
|
|
|
Jul 21 2011, 13:36
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(PhX @ Jul 21 2011, 15:42)  Предложите, пожалуйста, или ткните ссылкой в правильный. Тоже очень нужно. Передавайте данные текстом, а поле текста обрамляйте STX/ETX, или просто после данных код перевода строки Можно будет смотреть данные обычным гипертерминалом. Тайм-аут не нужен вообще.
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Jul 21 2011, 13:51
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769

|
Цитата(Палыч @ Jul 21 2011, 16:48)  Вас не устраивает точность работы таймера? В Win несколько таймеров. Самый точный из них - мультимедийный (см. Multimedia Timer Functions: timeBeginPeriod, timeSetEvent, и др.). А есть в С++ билдере компоненты с этим таймером? Цитата(Сергей Борщ @ Jul 21 2011, 16:47)  Работайте по таймауту, не используя таймер вообще. Посмотрите на SetCommTimeouts. Не совсем понял как это не использовать таймер. Если я без таймера буду непрерывно опрашивать приемник, то программа просто повиснет. Если только добавлю таймаут, то это даст то что вместо 96 байт я приму 16. А остальные 80 потеряются. Т.е. проблема не решится PS изменить протокол нельзя, нам его дали сверху гипертерминал вообще не катит, т.к. надо чтоб обмен был в обе стороны: принял пакет - ответил
|
|
|
|
|
Jul 21 2011, 14:03
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (paskal @ Jul 21 2011, 16:51)  Не совсем понял как это не использовать таймер. Если я без таймера буду непрерывно опрашивать приемник, то программа просто повиснет. Не надо его опрашивать. Функция read() сама веренет управления после приема N байт или истечения таймаута. Можете использовать асинхронные события ( используя структуру OVERLAPPED), тогда вообще ничего ждать не надо будет.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 21 2011, 16:14
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 29-10-06
Из: Тула
Пользователь №: 21 769

|
Цитата(Палыч @ Jul 21 2011, 19:07)  Для приёма использовать таймер - моветон. Рациональнее - вынести приём в отдельный поток. Но ведь переключение между потоками по таймеру. В чем тогда выигрыш?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|