Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.03.01;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.005 c
2-1232198187
Динара
2009-01-17 16:16
2009.03.01
Организация цикла между дат


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


15-1230567308
tButton
2008-12-29 19:15
2009.03.01
интересное кино...


15-1230639901
Чудак
2008-12-30 15:25
2009.03.01
Права на доступ к дирректория юникс


2-1232433819
KirIL
2009-01-20 09:43
2009.03.01
Как в TDateTimePicker всегда выбирать 1-е число?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский