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

Вниз

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

Наверх




Память: 0.47 MB
Время: 0.006 c
4-50168
Dikma
2002-03-12 15:39
2002.05.16
CHM файл


1-49940
Miwa
2002-05-03 18:42
2002.05.16
TListBox.OnDrawItem


4-50166
ATLANTIDO
2002-03-14 23:38
2002.05.16
Запуск приложения


14-50115
XOY
2002-04-06 11:46
2002.05.16
Спасите винчик!!!


3-49887
_Alex_
2002-04-19 19:00
2002.05.16
Access





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский