Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.03.01;
Скачать: CL | DM;

Вниз

escapecommfunction и работа com портом   Найти похожие ветки 

 
Evgengold   (2009-01-15 00:22) [0]

Привет СПЕЦАМ. Нужна ваша подсказка.
На 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 кГЦ при этом она не менялась даже при изменении сорости передачи порта!! Где ошибка?

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


 
Anatoly Podgoretsky ©   (2009-01-15 00:38) [1]

1. Ошибка простая, скорость не имеет отношения к управляющим сигналам.
Для передачи 0/1 с такой скоростью просто непрерывно посылай код $AA в порт данных (TX).

2. Можно - это синхронный режим работы порта.


 
Германн ©   (2009-01-15 00:54) [2]

Вот только частота при этом будет весьма нестабильной.


 
tesseract ©   (2009-01-15 13:12) [3]


> Вот только частота при этом будет весьма нестабильной.


Да по ней можно генератор случайных чисел писать - Windows  не рассчитана на подобные трюки и даже таймер там не Real Time.   Проще кварц спаять + какой нибудь К155ТМ2   который его запускать будет.


 
Evgengold   (2009-01-15 15:40) [4]

тогда как работают программы под управлением com порта , напремер генератор ик сигналов для пультов ДУ


 
Evgengold   (2009-01-15 17:36) [5]

Прошу прошения. Не могли бы вы скинуть тот кусок программы который позволяет изменять скорость передачи импульсов (или задавть определенную длительность) на DTR.


 
Evgengold   (2009-01-16 15:44) [6]

Anatoly Podgoretsky подскажите пожалуйста если я в порт TX буду отправлять код $AA, то и на управляющих сигналах будет таже скорость передачи чтои в порт ТХ.


 
Германн ©   (2009-01-16 17:51) [7]


> Evgengold   (16.01.09 15:44) [6]
>
> если я в порт
> TX буду отправлять код $AA, то и на управляющих сигналах
> будет таже скорость передачи чтои в порт ТХ.
>

"Управляющие" сигналы, например DTR, меняются только в результате выполнения функции EscapeCommFunction.


 
evgengold   (2009-01-16 23:06) [8]

А как с помощью этой функции сделать нужные задержки или длительность clrdtr и setdtr что бы получить нужную частоту передачи управляющего сигнала? мне нужно с иммитировать работу Ик пульта у которого скорость передачи 36-40 КГЦ, или длительность setdtr и clrdtr около 26 мксес


 
Германн ©   (2009-01-17 00:03) [9]


> evgengold   (16.01.09 23:06) [8]
>
> А как с помощью этой функции сделать нужные задержки или
> длительность clrdtr и setdtr что бы получить нужную частоту
>

Никак. И тебе это уже дважды сказали.
Ответ

> Anatoly Podgoretsky ©   (15.01.09 00:38) [1]

единственный способ получить такую частоту, какая тебе нужна. Но она будет весьма нестабильна.


 
evgengold   (2009-01-17 00:11) [10]

Но тогда как работают программы типа SlyControl?

и я еще совсем новичек в этом деле. не могли бы вы для наглядности написать код той части про которую говорил Anatoly. Plis!


 
Германн ©   (2009-01-17 00:17) [11]

http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1126


 
evgengold   (2009-01-17 02:26) [12]

Спасибо за ссылку?
По этой ссылке нашел часть кода и пытался переделал ее вот так

var
Ovr : TOverlapped;
buff:byte;
count:integer;
....
begin
buff:=$AA;
Count:=8;
 FillChar(Ovr,SizeOf(TOverlapped),0);
 Ovr.hEvent := CreateEvent(nil,TRUE,FALSE,#0);
  WriteFile(hComm,buff,Count,Result,@Ovr);
 CloseHandle(Ovr.hEvent);
end;

Почему то программе не нравится строчка @Ovr пишет
[Error] IR.pas(102): Types of actual and formal var parameters must be identical
Что не так?
Виринципе я передаю данные только в одном направлении поэтому Ovr вро де бы не нужен вместо него пытался поставиь nil новсе равно пишет эту же ошибку


 
Германн ©   (2009-01-17 02:43) [13]


> Виринципе я передаю данные только в одном направлении поэтому
> Ovr вро де бы не нужен вместо него пытался поставиь nil
> новсе равно пишет эту же ошибку
>

Ты всё-таки почитай статью. Если этого будет мало вышлю на почту книгу П.Агурова.


 
evgengold   (2009-01-17 14:30) [14]

Вот еще одна полезная ссылка кстати там и пример попроще, что не мало важно.
http://www.delphimaster.ru/articles/comport2/index.html

ВОт кусок программы которая отсылает 0/1  в com порт:

var
DCB   : TDCB;
hPort : THandle;
i, a : integer;
buff:byte;
KolByte:DWord;
begin
 a:=StrtoInt(edit1.text);
// 1. Открываем файл
 hPort := CreateFile(PChar("COM"+IntToStr(1)), GENERIC_WRITE, 0, nil,
                     OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
// 2. Контроль ошибок
if hPort = INVALID_HANDLE_VALUE then  exit;
 // Скорость обмена
 DCB.BaudRate := a;
 // Число бит на символ
 DCB.ByteSize := 8;
 // Стоп-биты
 DCB.StopBits := 1;
 // Четность
 DCB.Parity   := 0;
 //Устанавливаем настройки
 SetCommState(hPort,DCB);
 KolByte:=1;
 buff:=$AA;  
   WriteFile(hPort,Buff,KolByte,KolByte,nil);    
//    EscapeCommFunction(hPort, setDTR);
//    EscapeCommFunction(hPort, clrDTR);
CloseHandle(hPort);
end;

Как увязать тепь частоту передачу данных на Тх с частотой на DTR о чем говорил Anatoly Podgoretsky.


 
Германн ©   (2009-01-17 21:39) [15]


> Как увязать тепь частоту передачу данных на Тх с частотой
> на DTR о чем говорил Anatoly Podgoretsky.

Анатолий про DTR ничего не говорил и не собирался даже. И тебе давно пора забыть про DTR. Нужный тебе сигнал будет как раз на Tx.


 
evgengold   (2009-01-17 22:38) [16]

Герман во первых спасибо большое за активное участие!!!
Но есть схема передатчика на который данные отправляются через DTR вот она (в самом низу страницы)
http://slydiman.narod.ru/scr/plugins/dcd.htm#trans
и на нее сигнал подают с DTR.

Если можете подсказать схему имитации Ик пультов через com порт в котрой данные отправлябтся через TX буду только благодарен


 
evgengold   (2009-01-17 23:04) [17]

Удалено модератором


 
Германн ©   (2009-01-18 00:47) [18]


> Если можете подсказать схему имитации Ик пультов через com
> порт в котрой данные отправлябтся через TX буду только благодарен

У тебя уже есть источник информации. Вот от него и пляши. Я тут не в теме, а самому копать некогда. (Мне нужно голубой зуб освоить :).


 
evgengold   (2009-01-18 17:35) [19]

Герман скиньте пожалуйста на почту книжку Агурова.
evgengold@mail.ru
Спасибо!


 
Германн ©   (2009-01-19 02:10) [20]


> evgengold   (18.01.09 17:35) [19]

Скинул. Если не получил, скажи.


 
Evgengold   (2009-01-19 08:49) [21]

Получил спасибо БОЛЬШОЕ!!!


 
Evgengold   (2009-01-19 11:21) [22]

Вот кусок программы позволяющей выводить последовательность 1и0 через DTR. Естественно чатота ограничена и не стабильна.(проверено на осцилографе)

 y:=(1/t)(1/Fmax-1/Fn);//..вычиление необходимого количества пустых циклов для
                       // обеспечения нужной задержки
                       // Fmax - максимальная частота передачи сигналов setdtr
                       // и clrDTR
                       //Fn- та частота которую необходимо пулучить,
                       //t-время задержки привыполнении 1 пустого цикла
                       // Естественно Д.б. Fmax>Fn
 for i:=1 to 20000    do
 begin

   for i1:=1 to y do begin end;
   EscapeCommFunction(hPort, clrDTR);

   for i1:=1 to y do begin end;
   EscapeCommFunction(hPort, setDTR);

  end;

Здесь просто для передачи 1 или щ используется задержка пустыми циклами.
ее можно выститить по формуле выше. или подобрать экспериментально. Скорее всего для каждого компа это будут свои значения.
Такие параметры как Fmax, t смотрятся экспериментально на осцилографе.

Было бы не плохо если эти параметры м.б. вызвать как нибудь через внутренние функции Delphi. Если кто знает как подскажите



Страницы: 1 вся ветка

Текущий архив: 2009.03.01;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.012 c
2-1231853760
9899100
2009-01-13 16:36
2009.03.01
Пользователь с обрезанными правами


6-1199709224
maxistent
2008-01-07 15:33
2009.03.01
Принудительное "обновление" TServerSocket...


3-1215617383
Morrison
2008-07-09 19:29
2009.03.01
Как восстановить индексы в Paradox?


2-1232099268
buzb
2009-01-16 12:47
2009.03.01
изменение размера компонентов.


15-1230625782
tesseract
2008-12-30 11:29
2009.03.01
Сегодня день образования СССР.