MicroCHIP.RU
Главная Документация Отладочные средства Справочник Поиск Ссылки
 Новости   Конференция   Контакты 
 

Возможно ли переинициализировать СОМ-порт...

 Нoвaя темa  |  Наверх  |  Перейти к теме  |  Поиск  |  Правила  |  Вход 

ВНИМАНИЕ!
Вы просматриваете архив форума.

Этот форум работает только в режиме просмотра и поиска.

Действующий форум переведен на новый движок и
находится по адресу www.microchip.su

 Возможно ли переинициализировать СОМ-порт...
Автор: nicck ()
Дата:   09/08/2004 16:31

Просветите, плиз, по теме: есть прога для компа, работающая под Win98, и читающая регулярно
данные с СОМ-порта. К сожалению, условия эксплуатации всей системы определяют высокую
вероятность того, что пачки информации, находящиеся между битами "Старт" и "Стоп" могут
прерываться на неопределенное время. Потеря этих данных неважна, но комп зависает. Одним из
методов устранения зависания может быть регулярная переинициализация СОМ-порта компьютера
(причем это необходимо делать из этой же программы!).
Но я слышал, что под виндой пререинициализировать порт проблематично. Может быть кто-нибудь
делал что-то подобное и обходился малой кровью? Прошу поделиться идеей или куском проги.
Заранее благодарен.


 
 Можно. Я делал (+)
Автор: Ecole ()
Дата:   09/08/2004 16:41

Даже скорость менял. Примерно так: идет обмен с контроллером на скорости 2400
(специально выбирается низкая скорость для гарантированного обмена). Потом дается
(шлется) команда контроллеру перейти на скорость, скажем, 28000. Потом COM-порт
закрывается, делается пауза порядка секунды (в это время контроллер тоже должен
успеть переинициализировать порт). Потом порт открывается заново, устанавливается
нужная скорость и производится обмен.
На Win98 работает без проблем. Хотя тонкости есть (прежде всего в программе для
Пика).
Если интересуют подробности, могу рассказать.


 
 Re: Можно. Я делал (+)
Автор: nicck ()
Дата:   09/08/2004 16:52

Я был бы Вам весьма признателен за помощь.
Хочу уточнить: дело в том, что у меня несколько сигналов с разных USART-ов коммутируются на
вход МАХ232 через К555КП15, а с выхода МАХ-а подаются на СОМ-порт компутера. Скорость всех
USART-ов - одинаковая (1200), но коммутатор может отключить канал в середине передачи, и
компьютер (точнее СОИ-порт) может не дождаться, скажем стопового бита. Мне хотелось бы просто
через определенное время рестартонуть СОМ-порт, и работать дальше. Но как это сделать по уму -
не знаю. Если не затруднит, растолкуйте поподробнее, т.к. я не ас в подобных делах, а работа
остановилась.
Спасибо!


 
 Вот (+)
Автор: Ecole ()
Дата:   09/08/2004 17:08

Для начала следует прочитать статью О.Титова (ищется в гугле по ключевым словам:
Работа с COM-портами в Win32 Титов).

Вот эта статья:
http://www.rs232.ru/doc002.html

Там ОЧЕНЬ подробно описано программирование на стороне компьютера.
В вашем случае я бы правильно установил таймауты. Даже рестартовать порт по-моему
не нужно. Вообще, нужно экспериментировать.

>коммутатор может отключить канал в середине передачи, и
>компьютер (точнее СОИ-порт) может не дождаться, скажем стопового бита.
Если это ВСЯ проблема, ничего страшного. Установка таймаута ее решит.

------------------------------------------------------
http://www5.domaindlx.com/cprime/lesson/dir2.htm
http://www5.domaindlx.com/cprime/
обновление: новый раздел в Уроках С++

Отправка отредактированного (09/08/2004 17:13)


 
 Re: Вот (+)
Автор: nicck ()
Дата:   09/08/2004 17:13

Большое спасибо!


 
 Re: Возможно ли переинициализировать СОМ-порт...
Автор: Zemfir ()
Дата:   09/08/2004 23:13

комп не должен зависать, т.е. я надеюсь имелась ввиду программа.
нужно ошибки постоянно клирить,
кажись, если не изменяет память, клиаркомеррор. там и основной цикл должен быть такого плана: в цикле
постоянно сбрасываются ошибки, как пришёл байт, его обрабатывают. но вообще Еколе, ссылочку
грамотную дал, это я так, чёнить написать пишу, скучно:(
а лучше снести 98ю и поставить 2000ю.


 
 Re: Возможно ли переинициализировать СОМ-порт...
Автор: nicck ()
Дата:   10/08/2004 11:12

Спасибо, Zemfir, но снести 98-ю я то как раз и не имею права!
За участие также спасибо!


 
 Re: Возможно ли переинициализировать СОМ-порт...
Автор: Vadim ()
Дата:   10/08/2004 11:54

ИМХО, совсем не нужно переинициализировать порт. Вообще не понятно, как от
непринятой посылки можно чего нибудь завесить - если такое происходит, то нужно
переписывать программу (понатыкать таймаутов, использовать контроль четности,
организовать корректные выходы из процедур ожидания очередного байта в случае
принятия неверного байта в пакете данных,и т.д. - это вопрос протокола а не винды -
как раз 98-е лучше чем более старшие форточки)


 
 Re: Возможно ли переинициализировать СОМ-порт...
Автор: Dimal ()
Дата:   10/08/2004 15:21

Вообще-то переинициализировать желательно - у меня прога падала при работе с кое-каким
оборудованием прока не ввел закрытие порта а затем его открытие перед каждым сеансом связи,
причем прога могла вылететь и через час, и через 2 дня.


 
 Re: Возможно ли переинициализировать СОМ-порт...
Автор: Vadim ()
Дата:   10/08/2004 15:43

Возможно это так, но при чем здесь зависание при потере данных? Обычно это
некорректное написание программы, когда при потере (неверном приеме) происходит
зацикливание (ожидание какого то очередного байта...) Если передача пакетом, то
очень важно определить начало этого пакета (старт-посылка), и далее все время
следить за данными, и если обнаружится ошибка - нефиг ждать продолжения - надо
ждать старт!!! А для конроля надо использовать различные ухищрения - самое простое -
контроль четности, передача контрольных сумм и т д
Хотя согласен, программа должна себя реинициализировать в случае обнаружения
аномалий особенно это хорошо в микроконтроллерной программе, где сбой какого-нибудь
управляющего регистра может вызвать отключение периферии


 
 Re: Возможно ли переинициализировать СОМ-порт...
Автор: Zemfir ()
Дата:   10/08/2004 22:14

zemfir писал(а):

> комп не должен зависать, т.е. я надеюсь имелась ввиду
> программа.
> нужно ошибки постоянно клирить,
> кажись, если не изменяет память, клиаркомеррор. там и основной
> цикл должен быть такого плана: в цикле
> постоянно сбрасываются ошибки, как пришёл байт, его
> обрабатывают. но вообще Еколе, ссылочку
> грамотную дал, это я так, чёнить написать пишу, скучно:(


> а лучше снести 98ю и поставить 2000ю.


я не очень корректно выразился.
последнюю фразу нужно читать так: "и ещё лучше снести 98ю и поставить 2000ю"

я боюсь, что эта некорректная фраза затёрла смысл всего сообщения:
пропажа старт/стоп бита или ещё чего, не должна нарушать работу программы. в случае, если бит
пропадёт, точно также как и в пиковском уарте, возникнет ошибка. Эту ошибку нужно сбросить,
после чего продолжать работать в стандартном режиме.
Даже при хорошей линии, полностью избежать потерь не удастся.

Что касается лучшей работы comm* в 98й, вопрос спорный и я не владею вопросом, но по
стабильности работы 2000я 98ю делает.