Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Скорость Com-порта.

243
24 ноября 2004 года
pacific_7
1.9K / / 06.09.2004
Требуется настроить COM-порт на нестандартную скорость. Поискал в форуме подобные темы, нашел много полезного и интересного (в частности статью Титова Олега), нашел как узнать скорость - в том числе и нестандартную, а вот как ее установить, да так, чтобы порт нормально работал найти не могу.
Требуемая скорость - 12500 бод. Помогите пожалуйста кто чем может. Очень нужно (я бы сказал дело жизни и смерти :()!
310
24 ноября 2004 года
fellow
853 / / 17.03.2003
А как сейчас устанавливаешь?

Не забывай, что оборудование последовательного порта не всякую скорость сможет установить. Если порт у тебя стандартный, то, скорее всего, получишь не точно 12500, а что-нибудь из ближайших возможных значений. Если порт на плате расширения (индустриальный мультипорт какой-нибудь), то, может быть, и удастся.
243
25 ноября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by fellow
А как сейчас устанавливаешь?


Да в том то и дело, что пока никак. А порт у меня самый обычный - узкий на материнке.
Задача состоит в том, что бы подключить самодельную плату с микроконтроллером Siemens, частота тактового генератора которого составляет 12 МГц и соответственно последовательный канал может работать только на близких к этому частотах. Вообще это все успешно работало на 9х/DOS, а мне нужно переложить на NT (интерфейс как пользователя, так и программный). Исходники есть, но в них настройки порта производятся на асме (паскалевские вставки). В 9х все это работало замечательно, а вот серия NT, что вполне естественно с ее стороны, не пропускает эти вставки. Не возникает ошибок, никаких сообщений, просто теряется связь с контроллером.
Ладно - попробую на ближайшей стандартной (14400 бод).

243
26 ноября 2004 года
pacific_7
1.9K / / 06.09.2004
Всем спасибо за внимание, отбой. Присоединился!
Если кому интересно, то на скорости 12800 бод.
1
26 ноября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by pacific_7
Всем спасибо за внимание, отбой. Присоединился!
Если кому интересно, то на скорости 12800 бод.


Интересно. Если можно опиши как.

243
28 ноября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by kot_

Интересно. Если можно опиши как.



DCB *dcb;//указатель на структуру для конфигурирования СОМ порта
OVERLAPPED ovr;//структура для чтения/записи из/в порт
COMMTIMEOUTS ct;//структура для установки таймаутов чтения/записи порта
HANDLE port;//дескриптор порта
DWORD bc;//переменная указывающая количество считываемых/записываемых байт

HANDLE COM2=CreateFile("COM2",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);//открытие "файла" порта

И функция (вызвается с дескриптором порта, например COM2):

void WritePort(HANDLE port,char comand)
{
dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));//выделение памяти под структуру dcb служащей для настройки так сказать за один раз
//занесение данных в структуру dcb
dcb->DCBlength=sizeof(DCB);
BuildCommDCB("baud=12800 parity=N data=8 stop=1",dcb);
dcb->fNull=FALSE;
//установка временных интервалов ожидания чтения из порта и записи в порт
ct.ReadIntervalTimeout=100;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;
//конфигурирование порта
if(!SetCommState(port,dcb))ShowMessage("Сконфигурировать не удалось");
if(!SetCommTimeouts(port,&ct))ShowMessage("Не удалось установить таймауты");
PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);//"сброс" порта
memset(&ovr,0,sizeof(ovr));//обнуление структуры ovr
ovr.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//корректное создание дескриптора события порта
if(WaitForSingleObject(ovr.hEvent,-1)==WAIT_OBJECT_0)//ожидаем события в порту бесконечно
{
GetOverlappedResult( port,&ovr,&bc,FALSE);//записываем принятый байт если событие наступило в течение указанного времени ("-1" - бесконечность)
}
CloseHandle(ovr.hEvent);
}

Функция конечно жутко недоработанная - чето не получается разделить конфигурирование и собственно запись: не дожидается события, вернее ждет до бесконечности, хотя они (события) идут чередой. Думаем-с...

Теперь мучаюсь с записью. Если получится (а оно должно, иначе - фатал) могу выложить.

1
29 ноября 2004 года
kot_
7.3K / / 20.01.2000
На счет записи наверно сейчас ничего подсказать не смогу - я при чтении делал следующее, при работе использовался класс TBlockSerial. Данные из порта читал в отдельном потоке с приоритетом ниже среднего, при создании потока создавал объект и устанавливал его параметры:
 
Код:
cPort = new TBlockSerial;
cPort->Connect("COM2",9200,8,'N',0,false,false);

в методе выполнения:
 
Код:
Priority = tpLowest;
while(true){
   do{}while(!cPort->WaitingDataEx());
    Recvs = cPort->Recvstring(60);
 //Здесь выполняются необходимые действия и при завершении потока удаляется объект TBlockSerial. Recvs открытая переменная имеющая тип AnsiString.

События отлавливались нормально. Вобщем то, нужно при создании потока настраивать его, указывать порт и прочее - но мне для задачи в этом не было необходимости.
243
30 ноября 2004 года
pacific_7
1.9K / / 06.09.2004
Цитата:
Originally posted by kot_
На счет записи наверно сейчас ничего подсказать не смогу - я при чтении делал следующее...


За это спасибо, если найдешь что нибудь про запись, покажи. Я пока еще ничерта не могу в него записать (или могу, да вот только последовательный порт контроллера этого в упор не видит).
З.Ы. Нужен асинхронный режим считывания.
З.Ы.З.Ы. Че то я не понял ни фига в твоем примере при ближайщем рассмотрении: что за cPort и TBlockSerial? Объясни бревну если не лень.

1
30 ноября 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by pacific_7

За это спасибо, если найдешь что нибудь про запись, покажи. Я пока еще ничерта не могу в него записать (или могу, да вот только последовательный порт контроллера этого в упор не видит).
З.Ы. Нужен асинхронный режим считывания.
З.Ы.З.Ы. Че то я не понял ни фига в твоем примере при ближайщем рассмотрении: что за cPort и TBlockSerial? Объясни бревну если не лень.


Прошу прощения - это я торопился. TBlockSerial - классс-компонент для работы с портом, cPort - указатель на объект этого класса. Прикрепленный файл скинь в папку VCL и поменяй расширение на .hpp. Компонент сам называется SynaSer, я его закачал давненько уже не помню где - толи на королевстве, то ли на торинете. Помоему это единственный файл из которого он состоит.

243
01 декабря 2004 года
pacific_7
1.9K / / 06.09.2004
Огромное спасибо! Проверю - напишу результат.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог