Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Дрейф
Зарегистрирован: 20.02.2003 Сообщения: 9
|
Добавлено: Чт Фев 20 2003 11:19 Заголовок сообщения: Работа с СОМ портом |
|
|
Хотелось бы узнать работал ли кто-нибудь с СОМ портами? Интересует точное выдерживание интервалов времени (хотя бы до 1 мс) между отправкой запроса - приёмом ответа. Как этого добиться под Win98, W2K, WinNT. Если можете помочь - буду рад увидеть в аське. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Вячеслав Гость
|
Добавлено: Чт Фев 20 2003 11:39 Заголовок сообщения: Re: Работа с СОМ портом |
|
|
Какая связь между СОМ портом и точным выдерживанием интервалов времени? Язык? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Дрейф
Зарегистрирован: 20.02.2003 Сообщения: 9
|
Добавлено: Чт Фев 20 2003 12:14 Заголовок сообщения: Re: Работа с СОМ портом |
|
|
Требуется точно выдержать интервал между запросом и ответом. Ответ раньше X мс и позже Y мс считается ошибкой. Язык VC++. Всё работает, но времена используются раз в 10 больше реальных. Т.е. если ответ всегда приходит через 2 мс, то для его стабильного приёма приходится ждать 20 мс. А ошибкой приходится считать не приход через 3 мс, а отсутствие ответа через 20 мс - т.е. физическое отсутствие ответа. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Вячеслав Гость
|
Добавлено: Чт Фев 20 2003 12:40 Заголовок сообщения: Re: Работа с СОМ портом |
|
|
Попробуй посмотри "winmm.dll" timeBeginPeriod timeEndPeriod timeSetEvent
Хотя вариант на мой взгляд тупиковый Лучшее решение взять чип PIC и на нем сделать обеспечение протокола связи иначе в случае разогнанного компа у заказчика придется "весело ..." |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Дрейф
Зарегистрирован: 20.02.2003 Сообщения: 9
|
Добавлено: Чт Фев 20 2003 13:48 Заголовок сообщения: Re: Работа с СОМ портом |
|
|
Кусок делающий обмен:
//Выставляем признак ожидания ответа SetCommMask(open,EV_RXCHAR);
//Запись в буфер WriteFile(open,bufOut,2*lenghtOut+1,&bw,&o); //За прос результатов записи GetOverlappedResult(open,&o,&err,true); if (err != 2*lenghtOut+1) { GetCommModemStatus(open,&err); if ((err&MS_CTS_ON)!=MS_CTS_ON) Global=5; else Global=2; goto ERR; }
//Ждём прихода байта WaitCommEvent(open,&b2,&w); if (WaitForSingleObject(w.hEvent, delay2*5) != WAIT_OBJECT_0) // { //Если не пришёл GetCommModemStatus(open,&br); if ((br&MS_CTS_ON)!=MS_CTS_ON) Global=5;//проверка наличия устройства else Global=4; goto ERR; }
//Чтение из буфера ReadFile(open,bufIn,2*lenghtIn,&br,&o);
//Запрос результатов чтения GetOverlappedResult(open,&o,&err,true);
В ожидании события прихода байта (WaitForSingleObject) приходится выставлять большой таймаут, иначе вообще ничего не ловится. Думал, что связано с буферизацией отсылки через порт. Событие отсылки последнего байта, не ловится вообще, потому что происходит сразу же после WriteFile. Вообщем все эти события происходят с большими флуктуациями по времени и сильно зависят от операционки. Указанные функции ИМХО не помогут, не вижу места их применения в указанных условиях. Есть предположение что я, что-то делаю принципиально неправильно. Может кто-нибудь что-то вопиющее заметит? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Dmitry.Karpov http://prof Гость
|
Добавлено: Чт Фев 20 2003 21:04 Заголовок сообщения: А какова длина сообщения? |
|
|
COM-порт может дать максимум 115 Kbpc, а т.к. данные передаются байтами со стоп-битами, то на байт нужно 0.075 ms. Сообщение из ста байт - и ты уже в три раза превышаешь заданный тобой параметр 2 ms. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Вячеслав Гость
|
Добавлено: Пт Фев 21 2003 00:15 Заголовок сообщения: Re: Работа с СОМ портом |
|
|
(WriteFile...) Знакомые грабли посмотри здесь http://www.codeproject.com/system/serial.asp
на будущее четче формулируй вопрос - проще будет ответить |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Valera Гость
|
Добавлено: Пт Фев 21 2003 06:43 Заголовок сообщения: Пиши свой драйвер serial.sys. MSDK поможет. (+) |
|
|
средствами ос не получится из-за переключения задач. Попробуй работу с портом запихнуть в отдельный поток и поднять его приоритет до почти realtime. Сам я не пробовал. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Дрейф
Зарегистрирован: 20.02.2003 Сообщения: 9
|
Добавлено: Вт Фев 25 2003 18:47 Заголовок сообщения: Re: Пиши свой драйвер serial.sys. MSDK поможет. (+) |
|
|
Не почти, а в RealTime стоит, сделано отдельной задачей. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Дрейф
Зарегистрирован: 20.02.2003 Сообщения: 9
|
Добавлено: Вт Фев 25 2003 18:57 Заголовок сообщения: Re: А какова длина сообщения? |
|
|
Проблема в определении интервала между уходом последнего байта запроса и приходом первого байта ответа. От размера посылки не зависит. А работаю на 19200. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Dmitry.Karpov http://prof Гость
|
Добавлено: Ср Фев 26 2003 00:08 Заголовок сообщения: Все равно очень много получается |
|
|
Время на отправку байта = 8/19200=0.4e-3, т.к. 0.4 милисекунды. Байт отправить, байт принять, да еще накладные расходы - вот одна милисекунда и набегает... |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|