Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 15 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 15.01.2009, 01:27   #1
evgengold
 
Регистрация: 15.01.2009
Сообщений: 5
Репутация: 10
По умолчанию escapecommfunction и работа com портом

Привет СПЕЦАМ. Нужна ваша подсказка.
На com порт на вывод DTR нужно отправить последовательность 0 и 1 или точнее определенный массив данных состоящих из 1 и 0, и чтоб они передавались на com порт с определенной частотой. Для этого я делаю следующее:
1. Формирую нужный массив данных (размер массива >10000 символов)
2. Открываю com порт и Устанавливаю его параметры
3. С помощью функции escapecommfunction отправляю setDTR если 1 и clrDTR если 0
4. закрываю com порт
код примерно такой
Код:
..........
hCom = CreateFile( "COM1",
GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, NULL );
DCB.BaudRate := 9600;
DCB.ByteSize := 8;
DCB.Parity := 0;
DCB.StopBits := 1;
for i:=0 to 20000 do
begin
escapecommfunction(hCom, setDTR);
escapecommfunction(hCom, clrDTR);
end;
CloseHandle( hCom);
!!! Вопрос
1. Что в итоге должно получится на com порте?- передача 1 и 0 со скоростью 9,6 кб/с или нет? Если нет то как реально организовать нужную последовательность с нужной скоростью?
2. Можно ли при передачи через DTR обходится без служебных символов типа стоп бита, бита четности, т.е. можно ли напрямую передать массив двоичной информации в чистом виде с опрделенной скоростью.

PS. в реалии смотрел что происходит на осцилографе- при таком коде передавалась последовательность 1 и 0 с частотой около 50 кГЦ при этом она не менялась даже при изменении сорости передачи порта!! Где ошибка?


СПАСИБО ВСЕМ!

Последний раз редактировалось rpy3uH; 15.01.2009 в 11:05.
evgengold вне форума   Ответить с цитированием
Старый 20.01.2009, 16:45   #2
urchin
Новичок
 
Регистрация: 20.01.2009
Сообщений: 2
Репутация: 33
По умолчанию

Цитата:
Сообщение от evgengold Посмотреть сообщение
1. Что в итоге должно получится на com порте?- передача 1 и 0 со скоростью 9,6 кб/с или нет?
Какая у тебя операционная система (ОС)? Если новее 98 винды, то ответ: НЕТ! В 2000, ХР и более новой ОС будет передача с той скоростью, с которой "захочет" ОС. А если точнее, с какой скоростью будет передавать управление в твоё приложение планировщик задач.
Цитата:
Сообщение от evgengold Посмотреть сообщение
Если нет то как реально организовать нужную последовательность с нужной скоростью?
Тебе нужно обязательно почитать описание стандарта RS-232.

http://frolov-lib.ru/books/bsp/v04/ch1_2.htm
http://cxem.net/comp/comp38.php
http://www.gaw.ru/html.cgi/txt/inter...s232/start.htm
http://www.delphikingdom.com/asp/ans...IDAnswer=41472
http://www.denvo.ru/hardware/rs-232.html

Для стандартной скорости (9600, 19200,..., 115200 и т.д) данные можно загнать в массив и передавать НЕ через DTR, а функцией WriteFile. Физически данные будут передаваться через TX.

Цитата:
Сообщение от evgengold Посмотреть сообщение
Можно ли при передачи через DTR обходится без служебных символов типа стоп бита, бита четности...

Где ошибка?
Через DTR можно обходиться без стоп-битов и битов четности
Но точно установить скорость 9600 у тебя вряд ли получится. Ошибка в том, что DTR служит совсем для других целей. Он играет роль своеобразного флажка, который говорит внешним устройствам о том, что порт готов или не готов к приёму данных. И поэтому изначально не предназначен для этого.

Цитата:
Сообщение от evgengold Посмотреть сообщение
можно ли напрямую передать массив двоичной информации в чистом виде с опрделенной скоростью.
В определенной степени можно, но для этого нужно использовать специальные драйвера. Такие, например, используются в программаторах. C интерфейсом RS-232 у них общего мало. Только разъём.
Все обычнае приложения, а у тебя именно такое, в средах с кооперативной (в разных источниках этот термин путают с термином "вытесняющая") многозадачностью работают по одному из следующих принципов: синхронный и асинхронный.
Далее упрощенно, чтобы было понятней.
В первом случае (синхронный) ты используешь функцию для отправки данных в СОМ-порт и программа ждёт, когда же эта функция выполнит желаемую операцию, а затем вернет управление программе и так с каждой операцией. Таким образом, интервал времени когда функция вернет управление, может быть разным и зависящим от множества факторов.
Во втором случае используются специальные функции, позволяющие твоей программе продолжать работать параллельно с отправкой данных из СОМ-порта.
Однако в обоих случаях ОС с кооперативной многозадачностью постоянно передает управление другим приложениям в ОС через определенные кванты времени в зависимости от приоритета приложения и уровня кольца. Про многопроцессорность и многопоточность я не говорю, чтобы не усложнять понимание.
Скорость 9600, о которой ты упоминаешь задается не твоим циклом for (), а микросхемой, с которой общается ОС. Твоё приложение непосредственно с этой микросхемой НЕ общается. Именно поэтому тебя не интересует, какая там микросхема и как с ней взаимоодействовать.

Насколько я тебя понимаю, ты хочешь сделать из СОМ-порта генератор. Вынужден тебя разочаровать. Это будет плохой генератор. По меньшей мере, нестабильный. А именно это и ценится в нём помимо формы и мощности сигнала. Т.е. при разной загруженности процессора частота сигнала будет различной на твоём DTR. На разных процессорах, т.е. на разных компах она тоже будет отличаться и тебе нужно будет постоянно носиться с частотомером или осциллографом.

О том, что спаять генератор можно самому, думаю, ты и так знаешь. В инете и книжках полно готовых схем с подробным описанием.
Но если ты не хочешь паять, тебе нужна ОС, работающая в реальном времени (с вытесняющей многозадачностью). Такая как Windows 95 или 98, некоторые *nix-системы и т.д.
Ну или что-то ещё
urchin вне форума   Ответить с цитированием
Старый 20.01.2009, 19:49   #3
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
Репутация: 75
По умолчанию

Цитата:
Сообщение от urchin Посмотреть сообщение
работающая в реальном времени
(с вытесняющей многозадачностью)
по-моему понятия опровергают друг друга
Д'якон вне форума   Ответить с цитированием
Старый 22.01.2009, 11:35   #4
urchin
Новичок
 
Регистрация: 20.01.2009
Сообщений: 2
Репутация: 33
По умолчанию Моя ошибка

Цитата:
Сообщение от Д'якон Посмотреть сообщение
по-моему понятия опровергают друг друга
Согласен
Поэтому, на мой взгляд, чтобы не путаться, лучше использовать термины "вытесняющая" (preemtive), "невытесняющая" (nonpreemtive) или "реального времени" (real time).
urchin вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с COM портом hoba Общие вопросы Delphi 3 20.11.2008 04:39
Нестандартная работа с COM портом Alex_C Win Api 2 22.07.2008 02:34
Работа с usb портом Spice Общие вопросы .NET 6 16.07.2008 08:32
работа с COM портом ShAzat Общие вопросы Delphi 8 28.05.2008 20:08


17:45.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru