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

Вниз

COM-порт   Найти похожие ветки 

 
Tosha13   (2002-02-15 18:39) [0]

Господа, помогите прочесть
и зарегистрировать импульс (0-1),подаваемый на COM порт.
Интереснеа любая информация.

Заранее благодарен.
Антон. (electret@aaanet.ru)


 
Королев ©   (2002-02-16 11:05) [1]

можно из ассемблера, а можно из апи:
hhfile:=CreateFile("com1",
GENERIC_WRITE or GENERIC_READ,
FILE_SHARE_WRITE or FILE_SHARE_READ,
nil,
CREATE_NEW ,
FILE_ATTRIBUTE_NORMAL,
0);


with bcdc do begin bcdc тип dcb
baudrate:=2400;
bytesize:=8;
parity:=noparity;
stopbits:=onestopbit;
end;
setcommstate(hhfile,bcdc);

readfile(hhfile,bukva[i],1,nmb,0);





инициализация порта:
asm
mov dx,01h dx=>0..3 com1..com4
mov ah,0h
mov al,00000011b скорость 110бит/с
int 14h
end;
чтение:
asm
mov dx,01h
mov ah,03h
mov Result,al
int 14h
end;




 
Королев ©   (2002-02-16 11:55) [2]

еще есть такие функции:
opencomm()
setcomm
readcomm()
тоже отлично работают


 
Ihor Osov'yak   (2002-02-17 22:17) [3]

Королеву с копирайтом: за ответ двойка. Импульс это далеко
не байт, который можно читать с порта ....

Ответ по существу.
Но для начала уточняющий вопрос - На какую ногу импульс? В зависимости от ноги может быть решение через вызов
SetCommMask с соотв. атрибутами, с последующим юзанием WaitCommEvent ....

Более подробно - Serial Communications in Win32 в MSDN ...


 
Королев ©   (2002-02-19 06:55) [4]

To Ihor Osov"yak и Tosha13
ну если действительно нужно читать именно импульс или состояние 0/1 , то лучше всего для этих целей использовать LPT порт. А вот COM порт лучше все-таки для чтения конкретного протокола RS232.

быстрее всего это будет так:
в LPT уходит Bukva - выходы порта примут значения битов Bukvы
asm
mov dx,$378
mov al,Bukva
out dx,al
end
чтение Bukvы
asm
mov dx,$378
in al,dx
mov Bukva,al
end
читает состояние линий данных порта и отсылает в Bukvу.


 
EsKor   (2002-02-20 07:40) [5]

Если действительно приспичило ловить импульс по COM-порту, то это можно сделать используя следующие линии (сигналы):
DSR - сигнал готовности от аппаратуры передачи данных (6/6);
CTS - разрешение передачи данных терминалу (8/5);
DCD - сигнал обнаружения несущей удаленного модема (1/8);
RI - сигнал (индикатор) вызова (звонка) (9/22).
В скобках указаны номера контактов 9-ти/25-и контак-го разъемов.
А далее: открыть порт CreateFile(...); настроить порт GetCommState(...), SetCommState(...), GetCommTimeouts(...), SetCommTimeouts(...); установить маску (на какие события реагировать) SetCommMask(...); ждать соответствующего события WaitCommEvent(...).
Хотя поскольку, на самом деле, никакой информации приниматься не будет, то скорее всего и настраивать порт нет необходимости, как и читать его ReadFile(...).
Подробнее можно почитать (на английском) не только в MSDN, но и в Delphi Help - Windows SDK.
Можно посмотреть некоторые детали в статьях:
http://delphi.mastak.ru/articles.html - тут надо поискать статьи.
Есть статья, из пяти глав, на эту тему (не ловля импульсов), первая на http://www.delphikingdom.com/mastering/ports1.htm. В ней, правда, много ошибок, особенно где приводится перевод с английского. Главы 4 и 5 - практически в чистом виде перевод Help-а (другого автора), ошибок вроде бы нет.


 
pasha676   (2002-02-20 10:39) [6]


Если надо найти именно 0-1 на какой нибудь ноге, то лучше подавать импульс на DSR
В проге надо
1. Создать файл порта CreateFile
2. Заполнить его DCB: GetCommState, заполняем структуру DCB, SetCommState.
3. Задать маску события которое ждем SetCommMask(<нэндл файла компорта>,EV_DSR) - если анализируем DSR.
4. Создаем паралельный поток - CreateThread
5. Функция запускаемая в этом Thread-e должна содержать
WaitCommEvent, потом сравнение какой эвент пришел:if (Mask and EV_DSR)=EV_DSR then - реакцию на событие.
Следует отметить что этот эвент реагирует на смену состояния DSR
для того чтоб узнать состояние вроде есть какая-то апишка, но я почемуто (исторически сложилось :)) пользуюсь функцией
asm
mov DX,NumComm
add DX,6
in AL,DX
mov S,AL
end;
Result:=(S and $20)=0;
S - byte, результат true, false, 20 в хексе это именно маска DSR
Все побробности использования API функций можно узнать в хелпе.



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

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

Наверх




Память: 0.49 MB
Время: 0.009 c
3-49833
olden
2002-04-18 16:00
2002.05.16
динамическое создание параметров SQL-запроса


3-49822
Maloy
2002-04-18 13:06
2002.05.16
Создание вычисляемого поля базы.


1-50024
123456
2002-05-01 15:40
2002.05.16
Графика


1-49974
esprit_bel
2002-04-29 07:41
2002.05.16
Про мемо


1-49902
BJValentine
2002-04-29 22:28
2002.05.16
Конструктор