Форум: "Начинающим";
Текущий архив: 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