Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11634
Последний выпуск: 19.06.2015

Работа с аппаратурой под Windows (COM порт)

Win API стандартизирует работу с оборудованием. Для получения доступа к аппаратуре используется следующая последовательность шагов:

  1. Получить Handler устройства вызовом CreateFile с именем устройства. Более подробно см Windows SDK Help.
  2. Для управления устройством вызывать функции API для данного устройства, либо посылать IOCTL(input - otput control) последнее через DeviceIOCtl(подробно см Windows SDK Help).
  3. Закрыть устройство CloseHandle(Handler);

Последовательный порт под Win

Открытие порта:

Var 
FHandle: Thandle;

FHandle := CreateFile(
PChar(ComString),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
0);
  • Параметр 1: Имя порта - 'COM1', итд
  • Параметр 2: режим открытия GENERIC_READ - чтение, GENERIC_WRITE - запись
  • Параметр 3: режим разделения ресуртса. Примечание: 0 - неразделяемый (именно так описано открытие последовательного порта в WIN SDK, другие режимы не проверял).
  • Параметр 4: Режим безопасности. Имеет смысл в Windows NT, Windows 9x игнорирует его.
  • Параметр 5: Способ открытия. Для порта - OPEN_EXISTING - открыть, когда устройство реально существует.
  • Параметр 6: режим наложения операций - FILE_FLAG_OVERLAPPED - разрешение таких операций. При этом операции чтения - записи, требующие значительного времени, выполняются фоново по отношению к основному потоку программы.
  • Параметр 7: шаблон файла, для последовательного порта - всегда 0.

В случае нормального открытия порта FHandle - дескриптор порта, при неудаче содержит значение INVALID_HANDLE_VALUE.

Закрытие порта:

Закрытие порта выполняется вызовом CloseHandle(FHandle).

Настройка параметров передачи (скорость, кол-во бит, стоп биты)

Структура данных о настройках порта (device control block) DCB содержит информацию о настройках порта. Поля структуры:

DWORD DCBlength; // sizeof(DCB)
DWORD BaudRate // Скорость передачи (baud rate). Есть стандартный набор
// скоростей: все константы скоростей выглядят как CBR_.
// Пример CBR_9600, CBR_115200.

Flags
DWORD fBinary: // режим проверки символа Eof - включение данного режима Windows
// не поддерживает ( по крайней мере сейчас). Маска $01
DWORD fParity: //Контроль четности Маска $02 - включение контроля четности
DWORD fOutxCtsFlow: // Маска $04 - Включение контроля сигнала CTS при выводе байтов.
DWORD fOutxDsrFlow: // Маска $08 - Включение контроля сигнала DSR при выводе байтов.
DWORD fDtrControl: // Маска $30 - Тип контроля сигнала DTR: значения
DTR_CONTROL_DISABLE деактивация сигнала.
DTR_CONTROL_ENABLE конкретное значение сигнала можно задавать через 
вызов EscapeCommFunction.
DTR_CONTROL_HANDSHAKE Автоматическое управление сигналом.
DWORD fDsrSensitivity: // Маска $40 - Включение контроля сигнала DSR.
DWORD fTXContinueOnXoff:1; // XOFF continues Tx
DWORD fOutX: // Маска $100. Включение режима работы по XON XOFF при передаче
DWORD fInX: // Маска $200 -//- при приеме
DWORD fErrorChar: // Маска $400. Разрешение замещения при ошибочном приеме
// (несовпадение четности) принятого байта на член структуры ErrorChar.
DWORD fNull: // Маска $800 enable null stripping - пропускать при приеме символы NULL
DWORD fRtsControl: // Маска $3000. Тип контроля:
RTS_CONTROL_DISABLE
RTS_CONTROL_ENABLE
RTS_CONTROL_HANDSHAKE Аналогично сигналу DTR
RTS_CONTROL_TOGGLE - Высокий уровень пока, есть данные для передачи.

DWORD fAbortOnError // Маска $4000. Прекращение операций
// чтения - записи при возникновении ошибок
DWORD fDummy2:17; // Не используются

Другие данные структуры

WORD wReserved; // Не используется
WORD XonLim; // минимальное число байт в приемном буфере до отправки символа XON
WORD XoffLim; // максимальное число байт в приемном буфере до отправки символа XOFF
BYTE ByteSize; // количество бит в байте от 4 до 8
BYTE Parity; // 0-4=no,odd,even,mark,space бит паритета,
BYTE StopBits; // 0,1,2 = 1, 1.5, 2 - стоп биты, 
// 1,5 используются только при 5 битах в посылке для мелкосхемы 8250.

ONESTOPBIT 1 stop bit
ONE5STOPBITS 1.5 stop bits
TWOSTOPBITS 2 stop bits

char XonChar; // Tx and Rx XON символ
char XoffChar; // Tx and Rx XOFF символ
char ErrorChar; // Символ, которым заменяется ошибочно принятый байт

char EofChar; // end of input character
char EvtChar; // received event character
WORD wReserved1; // Не используется

Delphi имеет оболочку для DCB - TDCB.

Получить текущую конфигурацию порта можно функцией GetCommState(Fhandle:Handle; fDCB:TDCB).

Установить соответственно SetCommDCB.

После установки параметров порта. Читать и писать можно через ReadFile и WriteFile.

Заключение

В данной заметке приведена лишь небольшая часть сведений о работе с последовательным портом. Если хоть кому-нибудь это интересно и нужно напишите мне на mgoblin@mail.ru, я попробую вдохновиться на дальнейший труд. Любые замечания и исправления приветствуются по e-mail: mgoblin@mail.ru

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
68K
07 февраля 2011 года
Dmitry90
0 / / 07.02.2011
Мне нравитсяМне не нравится
7 февраля 2011, 10:25:38
Работать с com портом можно при помощи boost. Тогда код будет работать под любой платформой.(Windows, Linux, QNX). Как это делать прочитать можно здесь: robot-develop.org/archives/450
2.
55K
03 декабря 2009 года
hb_
0 / / 03.12.2009
Мне нравитсяМне не нравится
3 декабря 2009, 11:26:25
Чтобы открыть таким образом порт больше COM9 надо к имени порта вначале приписать '\\\\.\\' т.е.

ComString := '\\\\.\\COM11';
3.
55K
03 декабря 2009 года
hb_
0 / / 03.12.2009
Мне нравитсяМне не нравится
3 декабря 2009, 11:25:27
Чтобы открыть таким образом порт больше COM9 надо к имени порта вначале приписать '\\.\' т.е.

ComString := '\\.\COM11';
4.
40K
29 мая 2008 года
BirevAndrew
0 / / 29.05.2008
Мне нравитсяМне не нравится
29 мая 2008, 12:47:30
У меня с эти примером одна проблема. В системе есть порты COM1, COM3, COM4, ... , COM12.
Программа видит порты только до COM9.

Хотелось бы увидеть более подробный материал.
5.
Аноним
+1 / -0
Мне нравитсяМне не нравится
30 апреля 2006, 02:30:39
Под Win XP и под Win 98 разные библиотеки для работы к COM портом нужны.
При компиляции подключается та библиотека, под какую операционку компилируется.
Итого, скомпилив под ХР не запустится под 98 и наоборот
6.
Аноним
Мне нравитсяМне не нравится
25 января 2006, 23:36:07
Этим способом сделали програмку, под ХР, скомпелировали - работает, запустили exe на машине с win98 - порт не открывается. Может подскажите в чем дело?
7.
Аноним
Мне нравитсяМне не нравится
25 ноября 2005, 11:54:10
А как насчет доступа к COM-порту под Xp? Ругается она и не дает доступ!
8.
Аноним
Мне нравитсяМне не нравится
21 сентября 2005, 03:43:31
Всё понятно только для того кто с этим уже сталкивался...
9.
Аноним
Мне нравитсяМне не нравится
7 августа 2005, 18:52:58
Пример не повредил бы. Особенно по чтению данных из СОМ-порта
10.
Аноним
Мне нравитсяМне не нравится
1 августа 2005, 13:33:54
С большим интересом прочитал Вашу заметку.Весьма просто и познавательно. У меня имеется конкретный вопрос: имеется ли открытое (т.е. бесплатное)матобеспечение для приемника GPS под Windows XP и Linux? Буду признателен (в рамках разумного) за любую инфорацию.
С уважением С.Попов.
11.
Аноним
Мне нравитсяМне не нравится
28 июля 2005, 20:37:39
подробнее надо а не атмашку какуюто печатать!
12.
Аноним
Мне нравитсяМне не нравится
7 марта 2005, 21:22:53
Очень интересно.
Хотелось бы только живой пример увидеть - для Чайника (с большой буквы) это важно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог