Последовательный асинхронный адаптер (com порт)

Работа с COM-портом в асинхронном режиме

Пробую разобраться с работой COM порта. Получилось запустить в синхронном режиме. Стало ясно, что в этом режиме, вызывая функцию чтения данных ReadFile(), я не знаю заранее есть ли данные для чтения. Можно циклически проверять их наличие, но это приводит к дополнительным расходам времени ЦП. Поэтому на практике часто удобней использовать асинхронный режим.
Я нашел вот такую статью http://piclist.ru/S-COM-THREAD-RUS/S-COM-THREAD-RUS.html#22 и решил попробовать написать похожую программу в C++ Builder 6. Код такой:

02.09.2015, 08:40

COM-порт в асинхронном режиме
Настраиваю COM-порт для работы в асинхронном режиме с использованием API. К порту подключаю RS-232.

Не работает Com порт в асинхронном режиме
Крайне необходимо небольшое приложение для Com порта работающее в асинхронном режиме. Принял.

работа с COM портом
здравствуйте всем,я в форумах в первие ,и просил бы не судить очень строго. помогите пожалуйста .

Работа с Com портом
Привет всем! У меня собственно такая ситуация, есть bluetooth и телефон Nokia устанавливаю.

22.10.2015, 11:28227.10.2015, 08:11 [ТС]327.10.2015, 10:34427.10.2015, 10:57 [ТС]527.10.2015, 11:206

Что я могу тут сказать, удачи .

Добавлено через 2 минуты
Ибо так делать (отсутствует синхронизация с VCL) нельзя:

20.01.2016, 14:48 [ТС]722.01.2016, 15:50822.01.2016, 23:38 [ТС]925.01.2016, 13:571026.01.2016, 08:00 [ТС]1127.01.2016, 15:041228.01.2016, 13:37 [ТС]13

Поток чтения данных:

Хотя можно и не так заморочисто. Для меня принципиально было сделать на WinAPI и обязательно используя потоки чтения и записи.

Добавлено через 3 минуты
А классный форум, сам написал вопрос, а теперь сам на него овечаю

28.01.2016, 13:391428.01.2016, 13:52 [ТС]1528.01.2016, 13:581601.02.2016, 10:06 [ТС]17

Сравнение использования класса TThread и средств WINAPI

Одно из отличий заключается в том, что в потоках WINAPI можно использовать обращение к
графическим компонентам и файлам, так как сообщения потоков WINAPI ставятся в очередь сообщений
главного потока процесса. Таким образом избегаются конфликты между потоками при обращении к
разделяемым компонентам или файлам. А вот в TThread для этого используется метод Synchronize(),
который выполняет то же самое – ставит сообщения в очередь главного потока процесса, за счёт чего можно
избежать конфликтов между потоками.

25.04.2016, 08:24 [ТС]18

Возник новый вопрос. Изначально программа работы с COM-портом использовалась для общения с микроконтроллером (далее МК). COM-порт компьютера (далее ПК) соединялся с МК через преобразователь MAX 3232. Все работало на ура.

Одно уточнение: при общении с ПК, микроконтроллер отправлял на ПК различное количество байт, и программа на ПК не знает заранее сколько придет байт от МК. Когда МК делал одну отправку (например 7 байт), программа на ПК один раз исполняла главную функцию потока void __fastcall ReadThread::Execute(), где за один вход в эту функцию считывала все байты (все 7 за раз) и далее за один раз выводила все принятые байты в Memo. Все работало хорошо.

Затем решил подключить МК к ПК другим образом. В МК имеется приемо/передатчик UART, выводы которого я подключаю к преобразователю интерфейса (буферу) RS-485, от преобразователя выходит витая пара, которая подключается к преобразователю MOXA UPort1130, а он, в свою очередь, соединен с ПК. Преобразователи UPort от компании MOXA подключаются к USB-порту компьютера и предназначены для создания в компьютере дополнительных последовательных портов в операционных системах Windows. Короче говоря, соединил МК с ПК не через COM-порт, а через RS-485.

И вот тут возникла странность. Раньше, при отправке с МК нескольких байт (например 7 байт), программа на ПК воспринимала данные как одну посылку из нескольких байт (один раз выполняла функцию void __fastcall ReadThread::Execute() и считывала все 7 байт), теперь же программа ту же посылку воспринимает как несколько отдельных посылок по 1-му байту (функция void __fastcall ReadThread::Execute() выполняется 7 раз для каждого байта). Соответственно и вывод в Memo производится несколько раз (7 раз по одному байту).

С чем это связано? Как это исправить?

Пробовал поиграться с таймаутами: ReadIntervalTimeout; ReadTotalTimeoutMultiplier; ReadTotalTimeoutConstant – не дало результата. Как это исправить?

6. Последовательные устройства

6.1. Аппаратные адаптеры

Драйвер Dev.ser может поддерживать один или более последовательных портов. Аппаратный интерфейс в компьютере состоит из универсального асинхронного интерфейса для каждого последовательного порта. Драйвер поддерживает любой или все из семейств последовательных контроллеров 8250, 16450 или 16550. Каждый универсальный асинхронный интерфейс использует восемь последовательных адресов в массиве адресов ввода/вывода компьютера. Драйвер Dev.ser при запуске получает информацию о массиве адресов ввода/вывода для каждого универсального асинхронного интерфейса из аргументов командной строки.

Таким же важным, как адрес ввода/вывода, будет аппаратное прерывание, генерируемое каждым универсальным асинхронным интерфейсом. Большинство микро-ЭВМ обеспечивают различные аппаратные сигналы прерывания на шине, обозначаемые от IRQ2 до IRQ15 (за исключением прерываний 0, 1, 8, 9 и 13, которые используются непосредственно в собственных платах Системы).

Многопортовые последовательные адаптеры

Вы можете сконфигурировать многопортовые последовательные адаптеры так, чтобы они соответствовали большому диапазону адресов ввода/вывода. Эти адаптеры могут также дать Вам широкую возможность выбора аппаратных прерываний.

Большой выбор адресов ввода/вывода находится в диапазоне от 280 до 3BF. Из-за ограниченного числа возможных аппаратных прерываний, эти платы будут преобразовывать набор линий с сигналами прерывания от индивидуального универсального асинхронного интерфейса посредством логического сложения (OR) в единственное прерывание, выдаваемое в шину. QNX допускает совместное использование одного и того же прерывания для множества последовательных портов, т.к. Dev.ser проверит каждый универсальный асинхронный интерфейс, который использует это прерывание.

ВНИМАНИЕ. В конкретном случае каждый последовательный канал должен иметь уникальный адрес ввода/вывода, и каждая адаптерная плата должна использовать уникальное аппаратное прерывание.

6.2. Выбор конфигурации последовательных портов

Утилита stty позволяет установить четыре основных параметра, которые определяют стык RS-232.

QNX поддерживает четыре размера для символа. Вы выбираете размер символа данных одной из следующих команд stty:

stty bits=8 (значение по умолчанию)

Этот параметр определяет, сколько битов, следующих за стартовым битом, будет использоваться, чтобы сформировать минимальную порцию для приема символа.

Данные можно передать, если за ними следуют один или два бита останова. Два бита останова используются только для замедления всей передачи данных так, чтобы удаленный конец мог поддерживать связь. Используя stty, Вы определяете одну из следующих команд:

stty stopb=1 (значение по умолчанию)

Для того, чтобы заблокировать передачу битов четности и исключить проверку (в аппаратных средствах) принимаемых битов на четность, Вы задаете:

stty par=none (значение по умолчанию)

Если четность используется, Вы должны выдать одну из следующих команд:

Скорость передачи в бодах

Вы можете определить скорость передачи в бодах опцией baud=number утилиты stty:

QNX определяет по умолчанию скорость передачи, равную 9600 бод.

Терминалы работают с управлением потоком данных или без управления и с фиксированной скоростью передачи. В отличие от принтеров терминалы могут работать синхронно с главным компьютером на поддерживаемой скорости передачи. Таким образом, достаточно трехпроводного кабеля, хотя Вы можете также использовать девятипроводной кабель. Подобно главному компьютеру, терминалы включены в конфигурацию, как Терминальное Оборудование Пользователя, так что обычно требуется кабель нуль-модема.

6.4. Выбор конфигурации последовательных линий для терминалов и пользователей

QNX может использоваться в качестве системы разделения времени с полным набором функциональных возможностей. Многие пользователи могут быть подключены к нескольким компьютерам в сети QNX через устройства типа терминала или через модемные линии к терминалам на удаленных вычислительных центрах. Предположим, что терминал/модем правильно включен в конфигурацию, Вам нужно обеспечить в системе механизм, позволяющий пользователям «входить в систему».

Рассмотрим терминал, правильно включенный в конфигурацию через последовательный порт /dev/ser1. Самый простой способ разрешить пользователю этого терминала войти в систему — использовать команду:

ontty /dev/ser1 login

Пользователь сможет войти в систему и выполнять команды. Однако после выхода из системы (то есть, как только пользователь завершит этот сеанс работы), он не сможет снова зарегистрироваться.

Для того, чтобы автоматизировать процесс входа, Вы можете использовать утилиту tinit. Эта утилита проследит за определенным устройством, ожидая нажатия любой клавиши на этом терминале. Затем login выполнится автоматически. Когда пользователь вошел в систему и затем вышел снова, tinit будет ждать нажатия другой клавиши. Для запуска login от нажатия клавиш данных на двух последовательных устройствах, названных /dev/ser1 и /dev/ser2, Вы можете использовать следующую команду:

tinit -T /dev/ser1 /dev/ser2 &

Допустим, взамен Вы захотели, чтобы login автоматически выполнялись без ожидания нажатия клавиши пользователем. Вам следует использовать опцию -t:

tinit -t /dev/ser1 /dev/ser2 &

6.5. Проблемы тестирования последовательных устройств

Следующая таблица предлагает Вам выполнить действия, если Вы встретите некоторые общие проблемы при подключении последовательных устройств.

Проблема Возможная причина Средство

Не распознаются символы данных Неправильно установлены скорость передачи или признак четности Используйте утилиту stty для установки правильной скорости передачи и/или признака четности

Некоторые символы отображаются хорошо, некоторые нет Неправильно установлен признак четности Попробуйте изменить признак четности, используя утилиту stty

Нельзя ни передать, ни принять данные Неисправен кабель Проверьте кабель

Неисправны порты Проверьте аппаратные установки и параметры Dev.ser ввода/вывода
Конфликт прерываний Измените прерывание или адаптерную плату

Данные принимаются и передаются, только когда используется другой последовательный порт Конфликт прерываний Проверьте аппаратные прерывания и параметры запуска Dev.ser. Убедитесь, что два последовательных адаптера не используют одно и то же IRQ

Случайные потери данных Поддерживается управлением потоком, но оно отключено Определите тип управления потоком, поддерживаемого устройством и включите его утилитой stty (ihflow, ohflow, isflow и osflow)

Читайте также:  Блок питания 0...12 вольт

Управление потоком не поддерживается Уменьшите скорость передачи и/или увеличьте количество стоп-битов; если теряются только принимаемые данные, увеличьте входной буфер для Dev.ser (опция -I)

Проблемы с кабелем Убедитесь, что кабель хорошо заземлен и не слишком длинный. Также убедитесь, что все провода стыка RS-232 подключены.

Устранение ошибок в портах

Передача данных от центрального процессора к любому периферийному устройству и наоборот контролируется заданием запроса на прерывание IRQ.

Прерывания и адреса

Передача данных от центрального процессора к любому периферийному устройству и наоборот контролируется заданием запроса на прерывание (IRQ) и адреса ввода-вывода (I/O address). Для внешнего периферийного устройства запрос на прерывание и адрес ввода-вывода приписываются тому порту, через который оно подсоединяется.

Сами слова “запрос на прерывание” сообщают, что прерывается работа ЦП и ему предписывается заняться данными, поступающими с какого-либо устройства. Всего существует 16 прерываний – от 0 до 15. Все последовательные и параллельные порты, как правило, требуют своего собственного запроса прерывания, за исключением того, что порты СОМ1 и COM3, а также COM2 и COM4 зачастую имеют общий запрос прерывания.

Для каждого порта нужно указывать уникальный адрес ввода-вывода, который подобен почтовому ящику для приходящей на адрес ЦП корреспонденции, в котором она хранится до обработки. Если какой-либо запрос на прерывание или адрес ввода-вывода используются одновременно более чем одним устройством, то ни одно из них не будет работать надлежащим образом и может даже “зависнуть” ПК.

При проблемах с портом проверьте, какие запросы на прерывание и адрес ввода-вывода ему приписаны.

Панель управления – Система – Устройства – Порты СОМ и LPT

Если вы увидите перед какой-либо строчкой желтый кружок с восклицательным знаком внутри, то, возможно, найдете причину “помехи”. Выделив строчку, нажмите “Свойства – Ресурсы”. В поле “Список конфликтующих устройств” найдите, что вызывает конфликт. Если окажется, что это какая-нибудь старая плата, не поддерживающая Plug & Play, то она будет указана в списке как “Неизвестное устройство”.

Чтобы разрешить проблему, измените для одного из устройств-нарушителей запрос на прерывание или адрес ввода-вывода. Если порт находится на системной плате, то используйте для этого программу начальной установки системы System Setup (BIOS).

Для вхождения в System Setup во время запуска ПК нажмите клавишу “Delete”, “F1” или иную – узнайте в документации на систему. Во многих программах начальной установки можно назначать запрос на прерывание и адрес ввода-вывода (установить ресурсы) для каждого конкретного порта, отменив старые.

Найдите неиспользуемый запрос на прерывание или адрес ввода-вывода.

Панель управления – Система – Устройства – Компьютер

Вы увидите полный список применяемых ресурсов. Если неиспользуемых запросов на прерывание нет, то попробуйте отключить с помощью System Setup неиспользуемый порт.

Система – Устройства – Конфликтующее устройство – Ресурсы

Выключите функцию “Автоматическая настройка”. В окне “Перечень ресурсов” выберите тип ресурса, нажмите кнопку “Изменить” и в поле “Значение” задайте новое (неиспользуемое) значение запроса на прерывание или адрес ввода-вывода.

Установка параметров паралельных портов

Параллельные порты обозначаются аббревиатурой LPT. Компьютер автоматически приписывает каждому обнаруженному параллельному порту адреса от LPT1 до LPT3.

Если вы устанавливаете второй параллельный порт, убедитесь, что он не использует уже имеющийся запрос на прерывание. В некоторых компьютерах LPT1 и LPT2 по умолчанию применяют IRQ7. С помощью Диспетчера устройств установите IRQ5 для LPT2. Если это невозможно, то используйте программу Setup CMOS вашей системы.

Стандартные установки ресурсов параллельных портов

LPT-портЗапрос на прерыванияАдрес ввода-вывода
LPT1IRQ7ЗВС
LPT2IRQ7378
LPT3IRQ5278

Установка параметров последовательных портов

Каждый последовательный порт идентифицируется с помощью одного из восьми возможных СОМ-адресов – СОМ1, COM2 и т. д., каждому из которых соответствуют свой уникальный адрес ввода-вывода и запрос на прерывание.

Будьте внимательны при установке в ПК устройства, требующего СОМ-порта. Порты СОМ1 и COM2 имеют стандартные адреса ввода-вывода и запросы на прерывание, которые нигде не должны изменяться (обычно могут быть изменены только в программе Setup CMOS вашего ПК). Если для нового устройства требуется назначить порт СОМ1 или COM2, то при загрузке ПК войдите в программу Setup и либо отключите последовательный порт, приписанный к СОМ1 или COM2, либо, если нужно освободить соответствующие установки для добавляемого устройства, измените идентифицирующие его запрос на прерывание и адрес ввода-вывода.

Заметьте, что все стандартные адреса ввода-вывода используют только третье и четвертое прерывания. Поскольку два устройства не должны использовать один и тот же запрос на прерывание, то постарайтесь для новых внешних устройств приписать портьте COM3 по COM3, вручную устанавливая запросы на прерывание и адреса ввода-вывода с помощью Диспетчера устройств (диалоговое окно “Свойства: Система”).

Стандартные установки ресурсов последовательных портов

СОМ-портЗапрос на прерываниеАдрес ввода-вывода
СОМ1IRQ43F8
COM2IRQ32F8
COM3IRQ4ЗЕ8
COM4IRQ3*2Е8
СОМ5IRQ4*ЗЕО
СОМ6IRQ3*2ЕО
СОМ7IRQ4*338
СОМ8IRQ3*238

* Могут быть установлены с помощью Диспетчера устройств Windows 9x (Свойства: Система)

Оптимизация последовательных портов

Компьютер имеет один либо два встроенных последовательных порта в виде 9-штырькового разъема, обычно расположенных на задней панели компьютера. С помощью такого порта за единицу времени можно передать лишь 1 бит данных, в то время как посредством параллельного – 8 бит. Скорость работы последовательного порта зависит от универсального асинхронного приемо-передатчика (UART), преобразующего проходящий через шину ПК параллельный поток данных в однобитовый.

Как правило, современные ПК поставляются с UART модели 16550. В этом случае максимальная пропускная способность составляет 115 кбит/с, что обеспечивает достаточную полосу пропускания для большинства последовательных устройств. Более старые UART моделей 16450 и 8250 с этой задачей уже не справляются. Но иногда производительности UART 16550 может оказаться недостаточно, ведь некоторые аналоговые модемы обрабатывают сжатые данные со скоростью 230 кбит/с, а адаптеры ISDN – до 1 Мбит/с. Так что, если вам требуется большая скорость передачи данных, покупайте плату расширения с UART модели 16750, способной работать со скоростью 921 кбит/с.

Работа с параллельными портами

Параллельные порты обычно используются для принтеров, хотя через них могут подключаться к ПК и другие устройства, например сканеры. С их помощью можно передавать данные со скоростью от 40 Кбайт/с до 1 Мбайт/с, а иногда даже с большей.

В основном все ПК поставляются с одним параллельным портом в виде 25-штырькового разъема на задней панели. Чтобы добавить второй порт, необходимо купить контроллер ввода-вывода и установить его в разъем расширения на системной плате. Параллельный порт бывает четырех типов – однонаправленный, двунаправленный, с улучшенными возможностями (ЕРР-порт) и с расширенными возможностями (ЕСР-порт). Для каждого из них характерны различные скорость и возможности. Порты большинства новых ПК поддерживают все четыре режима, и чтобы узнать, какой из них обеспечивает параллельный порт, посмотрите в программе Setup (CMOS Setup utility) вашего ПК раздел периферийных устройств (Integrated peripherals).

Однонаправленный порт иногда называется также SPP-портом. Эта базовая конфигурация пропускает данные со скоростью 40-50 Кбайт/с лишь в одном направлении – к принтеру или другому внешнему устройству.

Двунаправленный порт. Обеспечивает двусторонний обмен данными со скоростью передачи от 100 до 300 Кбайт/с между ПК и внешним устройством. При этом информация о состоянии последнего поступает в компьютер.

Порт с улучшенными возможностями (ЕРР). Разработан для внешних дисководов и сетевых адаптеров, требующих высокой производительности. Обеспечивает скорость передачи данных от 400 Кбайт/с до 1 Мбайт/с и более.

При установке в программе System Setup опции ЕРР предлагаются версии 1.7 и 1.9. Практически для всех периферийных устройств, купленных в последние годы, нужно выбирать 1.9.

Порт с расширенными возможностями (ЕСР). Повышает скорость и расширяет возможности обмена данными между внешним устройством и компьютером. Если принтер и иное периферийное устройство поддерживают ЕСР, то они непосредственно выдают сообщения о состоянии устройств и ошибках.

Если в программе. System Setup задать опцию ЕСР, то появится строчка для выбора DMA-канала (канал непосредственного доступа к памяти, direct memory access). Необходимо задать его так же, как и при запросе на прерывание. Чтобы предотвратить возникновение конфликтов DMA-каналов, просмотрите свободные из них в окне “Свойства: Компьютер”, как описано выше. Если конфликта не избежать, то вернитесь к двунаправленному режиму порта.

Лучший порт для урагана данных.

В новых системах и периферийных устройствах параллельные и последовательные порты стали заменять универсальной последовательной шиной (Universal Serial Bus, USB). С ее помощью можно достичь скорости передачи данных до 12 Мбит/с, а также подключать при наличии всего одного порта клавиатуры, мониторы, мыши и многие другие (до 127) устройства, которые, как и с решающим сходные задачи SCSI-интерфейсом, могут быть соединены “цепочкой”. При этом используется всего один запрос прерывания. USB-шину можно устанавливать и на более старые компьютеры, купив соответствующую плату расширения.

Последовательный асинхронный адаптер (com порт)

Интерфейс RS-232 был разработан в 1969 году рядом крупных промышленных корпораций и опубликован Ассоциацией электронной промышленности США (Electronic Industries Association — EIA). (http://ru.wikipedia.org/wiki/RS-232).

HyperTerminal

Программа HyperTerminal позволяет просматривать, что приходит на ком-порт.
Пуск-Программы-Стандартные-Связь-HyperTerminal

Программа Portmon для Windows

Автор: Марк Руссинович (Mark Russinovich)
Программа Portmon предназначена для отслеживания и отображения всей активности последовательных и параллельных портов в системе.
http://www.microsoft.com/rus/technet/sysinternals/utilities/Portmon.mspx

Приобретение правильного сканера

Меня очень часто спрашивают: почему не работает сканер штрихкодов в 1С.

Штрихкодовые сканеры различаются интерфейсом подключения. В частности, сканеры USB могут имитировать клавиатуру (это проявляется тем, что штрихкод считывается в блокноте), имитировать интерфейс RS-232 или работать по USB без имитации чего-либо. Все три варианта часто различаются шнуром, который реализует тот или иной интерфейс.

Для 1С наименее всего подходят клавиатурные сканеры: считанный штрихкод не попадет в процедуру ОбработкаВнешнегоСобытия. Поэтому, если есть такая возможность, лучше заменить такой сканер на RS-232 или USB (имитация RS-232). См. также раздел “Поддержка сканеров с клавиатурным интерфейсом” в конце этой статьи. О подключения сканера штрих-кода через COM-порт – см. статью Книга знаний: Подключение сканера штрих-кодов к 1С через COM-порт.

Существуют и более старые (не USB) варианты сканеров, которые подключаются “в разрыв клавиатуры”.
Напишу еще раз: приобретения клавиатурных или имитирующих клавиатуру сканеров для работы в 1С следует избегать .

Эмуляция COM-порта при наличии USB-соединения

Имеется возможность представить порт USB “под именем” свободного COM-порта, например, при помощи драйвера (FTDI, сайт http://www.ftdichip.com), и работать с ним как с новым COM-портом.

Стандартные установки последовательного порта

При экспериментах я устанавливал следующие (стандартные) настройки порта: скорость 9600 бит/с, 1 стоповый бит, нет контроля четности, 8 бит/байт). Для своих опытов я использовал кабель для соединения портов COM1 и COM2. Вы можете спаять такой кабель по схеме http://subscribe.ru/archive/tech.electronics/200104/21033223.html), или приобрести его на рынке примерно за 70 рублей.

Чувствительность к “горячему” подключению

Следует отметить, что COM и LPT-порты чувствительны к “горячему” подключению – соединяя включенные устройства, вы можете спалить порты (или что-то еще). Поэтому перед подключением устройства я рекомендую отключать их от сети питания, и только потом их выполнять их электрическое соединение.
USB этим недостатком не страдает, и дозволяет “горячее” подключение устройств.

Посылка тестовых данных в COM-порт

Имея тестовый кабель, вы уже можете экспериментировать с внешними компонентами для 1С:Предприятие.
Посылку тестовых данных в порт я производил из пакетного (.BAT) файла MS-DOS. Содержимое моего файла test.bat:

В файле c:test.txt введите несколько символов (например, 1234567890) и завершите – обязательно! – их символом перевода строки (нажатием Enter).

Программа, подключенная к другому концу кабеля, может быть тестовой программой TestComPort.exe (скачайте комплект, приведенный в конце статьи; в программе надо выбрать порт – в данном случае COM1, нажать Открыть, и уже можно посылать в нее символы при помощи BAT-файла, в большом окне вы увидите принятые текстовые строки), конфигурацией для 1С:Предприятие, приложенной в этом же архиве, или стандартной конфигурацией наподобие “1С:Торговля и Склад”, где активизирована работа со сканером, подключенным в последовательный порт (внешняя компонента scanopos.dll).

Получение внешнего события в 1С:Предприятие

Внешнее событие, например, со сканера, с другого внешнего оборудования, или просто сгенерированное программно, приходит в 1С (как 7.7, так и 8.0) в предопределенную процедуру
ОбработкаВнешнегоСобытия().

Эта процедура может располагаться в глобальном модуле или модуле формы 1С:Предприятие 7.7 или 8.0. Процедура принимает три входящих параметра: Источник, Событие и Данные. Это три текстовые строки, которые могут принимать произвольные значения – в качестве Источника можно установить имя внешней компоненты, в качестве события – строку-идентификатор события, например, “BarCodeValue”, а в качестве данных – данные от устройства, например, считанный штрихкод.

Инициализация внешней компоненты

Код процедуры ПриНачалеРаботыСистемы() в тестовой конфигурации выглядит следующим образом:

Первый запуск конфигурации необходимо производить под правами администратора или привилегированного пользователя Windows. Это необходимо для любых внешних компонент или OLE-объектов, чтобы компонента (DLL) могла “прописать” себя в системный реестр Windows.

Пример работы с COM-портом

Рассмотренные ниже примеры работы с последовательным (COM-) портом будут использовать средства Windows API (системные функции CreateFile и т.д.). Для компиляции примеров потребуется Delphi версии 6 (впрочем, вы легко сможете переделать примеры под любой язык программирования, который поддерживает вызовы Windows API).

В конце статьи приведена ссылка, по которой вы можете скачать работающие примеры кода внешней компоненты (vk_rs232.dll) и упрощенного тестового примера (TestComPort.exe, который содержит 120 строк тестового кода). Рассмотренная в качестве примера внешняя компонента для 1С:Предприятие
умеет читать текстовые строки из последовательного порта, и представлять их как событие считывания штрихкода “BarCodeValue”. Поэтому компоненту можно без изменений использовать, например, в конфигурации “Торговля и Склад” в качестве замены для штатной компоненты для считывания штрихкодов. Также компонента умеет записывать “встречные” данные в последовательный порт, если это необходимо для работы с устройствами (для сканеров штрих-кодов это не нужно).

Пример расчитан на передачу в устройство или из устройства текстовых строк, разделенных символами 13,10, что характерно, например, для сканеров штрихкодов. Я использую фиксированные настройки (скорость – 9600, один стоп-бит, без бита четности, 8 бит в одном байте), а также фиксированные настройки таймаута (чтение “отваливается” через относительно короткий промежуток времени, чтобы избежать зависания). Вы можете переделать эти умолчания под ваше оборудование и требования к программному обеспечению.

Настройка сканера

Вы можете настроить сканер на те или иные завершающие коды (#13#10 и другие), а также изменить его настройки при помощи установочных штрихкодов, которые обычно поставляются в комплекте устройства.

Общая идеология работы с RS-232 в системе Windows

В MS-DOS (и ранних версиях Windows, включая 95 и 98), работа с последовательными портами часто производилась напрямую через порты ввода-вывода командами Ассемблера IN и OUT. Этот способ не поддерживают современные операционные системы, начиная с Windows NT. В них остается (надо сказать, довольно древняя) возможность работы с этими портами как с файлами.

Например, достаточно открыть файл с именем “COM1”, чтобы можно было писать в него данные для внешнего устройства, и читать из него данные от этого устройства (входной и выходной поток данных не пересекаются).

Настройки параметров и таймаутов COM-порта производятся при помощи функций SetCommState и SetCommTimeOuts соответственно. Ссылка на работающий пример кода, который показывает эту идею более развернуто, приведена в конце статьи.

Конечно, есть возможность работать с COM-портом и “более простыми средствами” – вплоть до открытия файла с именем “COM2”, записи строк в этот файл и чтения встречных данных от устройства из этого же файла.

Внешняя компонента, по сравнению с этим “простым” решением, добавляет возможность генерировать события считывания данных (например, штрихкодов со сканера) в асинхронном режиме, когда 1С не “замирает” до очередного считывания штрихкода, и не “крутится” в бесконечном цикле чтения, а получает внешние события, и реагирует на них в предопределенной процедуре ОбработкаВнешнегоСобытия(). Это удобно для пользователя, и не заставляет его нажимать на клавиатуре лишние клавиши перед считыванием штрихкода.

В качестве официальной справки по различным функциям Windows используйте MSDN, который можно приобрести на DVD или на 3-х CD. В качестве “источника и составной части” он входит в комплект средств разработки от Microsoft, или приобретается отдельно. Кроме того, MSDN выложен в интернете, и как правило, находится в первых строках запросов в поисковике Google по контрастному запросу наподобие “SetCommState”.

Поддержка двух или более сканеров (08.03.2006)

Компонента теперь использует потоки (объект TThread) вместо таймера. Компонента содержит тестовый пример для работы с двумя объектами (например, двумя сканерами).

Настройка конца строки (12.07.2006)

Компонента понимает свойство КонецСтроки (в англоязычном написании – EOL).
По умолчанию – Симв(13)+Симв(10) в качестве последовательности, которая отделяет один штрихкод от другого.

Поддержка сканеров с клавиатурным интерфейсом (20.09.2006)

Компонента поддерживает перехват событий клавиатуры.

Это позволяет использовать сканеры с клавиатурным интерфейсом. Однако, нажатия на клавиши не подавляются. Строка очищается при каждой паузе между нажатиями на клавиши длительностью более 1 секунды. Событие генерируется по нажатию на клавишу Enter.
(есть другой способ подключения сканера штрих-кода в разрыв клавиатуры – см. статью Книга знаний: v8: Сканер ШК в разрыв клавиатуры в стандартных конфигурациях (ТиС, УТ))

Глубина буфера событий

Компонента позволяет выставить глубину буфера событий (свойство ГлубинаБуфераСобытий).
Это значит, что если компьютер занят рассчетами, а в это время приходят новые события, то они будут накапливаться только в пределах этого буфера (последующие события будут потеряны).

Заключение

Мы рассмотрели работу с последовательным портом RS-232 из 1С:Предприятие. Различие между версиями 1С:Предприятие 7.7 и 8.0 в данном случае несущественно – внешние компоненты совместимы и могут использоваться в обеих версиях системы. Вы можете посылать данные в порт или считывать их из порта, чтобы управлять внешним устройством или принимать данные от него по протоколу RS-232. При помощи тестового кабеля, который соединяет два COM-порта, вы можете имитировать работу с оборудованием, даже не имея самого устройства в наличии.

Порты асинхронного адаптера

Лабораторная работа №5

Тема: «Асинхронный последовательный адаптер»

Цель работы:Ознакомление с работой функций MS-DOS работы с асинхронным последовательным адаптером.

Теоретические сведения:

Последовательная передача данных предполагает, что данные передаются с использованием единственной линии. При этом биты байта данных передается по очереди с использованием одного провода.

Для синхронизации группе битов обычно предшествует специальный стартовый бит. После группы битов данных следует бит проверки на четность и один или два стоповых бита. Иногда бит проверки на четность может отсуствовать.

Исходное состояние линии последовательной передачи данных – уровень логической 1. Стартовый бит START сигнализирует о начале передачи данных. Далее передаются биты данных, вначале младшие, затем старшие. Если используется бит четности P, то передается и он. Бит четности имеет такое значение, чтобы в пакете битов общее количество единиц (или нулей) было четно или нечетно.

В самом конце передаются один или два стоповых бита STOP, завершающих передачу байта. Затем уровень линии передачи снова устанавливается в 1 до прихода следующего стартового бита.

Использование четности, стартовых и стоповых битов определяют протокол передачи данных. Очевидно, что передатчик и приемник данных должны использовать один и тот же протокол, иначе связь будет невозможной.

Другая важная характеристика – скорость передачи данных. Она также должна быть одинаковой для передатчика и приемника.

Скорость передачи данных обычно измеряется в бодах. Боды – это количество передаваемых бит в секунду. При этом учитываются и старт/стопные биты, а также бит четности.

В технической литературе и в различной документации документации вы можете встретить и другой термин – биты в секунду (bps). Здесь имеется в виду эффективная скорость передачи данных без учета временных затрат на передачу служебных битов.

Аппаратная реализация

Компьютер может быть оснащен одним или двумя асинхронными последовательными адаптерами. Эти адаптеры расположены либо на системной плате, либо (в старых компьютерах) на отдельной плате, вставляемой в разъемы расширения системной платы.

Бывают также платы расширения, содержащие 4, 8 или большее количество асинхронных последовательных адаптеров. Их часто используют для подключения нескольких модемов к одному компьютеру.

Микросхема UART

В основе последовательного порта передачи данных лежит микросхема Intel 8250 или более современные микросхемы, такие как 16450, 16550, 16550A. Это универсальный асинхронный приемо-передатчик (UART – Universal Asynchronous Receiver Transmitter). Микросхема содержит несколько внутренних регистров, доступных через команды ввода/вывода.

В микросхеме 8250 есть регистры передатчика и приемника данных. При передаче выходной байт записывается в буферный регистр передатчика, откуда затем переписывается в сдвиговый регистр передатчика. После этого байт выдвигается из сдвигового регистра по битам.

Аналогично работают сдвиговый и буферный регистры приемника.

Программа имеет доступ только к буферным регистрам, копирование информации в сдвиговые регистры и процесс сдвига выполняется микросхемой UART автоматически.

Порты асинхронного адаптера

На этапе инициализации системы BIOS тестирует имеющиеся асинхронные последовательные адаптеры и инициализирует первые два. Их базовые адреса располагаются в области данных BIOS начиная с адреса 0000:0400h.

Первый адаптер COM1 имеет базовый адрес 3F8h и занимает диапазон адресов от 3F8h до 3FFh, второй адаптер COM2 имеет базовый адрес 2F8h и занимает адреса 2F8h. 2FFh.

Асинхронные адаптеры могут вырабатывать прерывания:

· COM1 – IRQ4 (соответствует INT 0Ch);

· COM2 – IRQ3 (соответствует INT 0Bh)

Порт 3F8h

Порт 3F8h соответствует регистру данных. Для передачи необходимо записать в этот порт передаваемый байт данных. После приема данных от внешнего устройства они могут быть прочитаны порта 3F8h.

В зависимости от состояния старшего бита управляющего слова, записываемого в управляющий регистр с адресом 3FBh, назначение порта 3F8h может изменяться. Если этот бит сброшен, порт используется для записи передаваемых данных. Если же бит установлен, порт используется для вывода значения младшего байта делителя частоты тактового генератора.

Изменяя содержимое делителя, можно изменять скорость передачи данных. Старший байт делителя записывается в порт 3F9h.

Зависимость скорости передачи данных от значения делителя частоты представлена ниже:

ДелительСкорость передачи в бодах

Порт 3F9h

Порт 3F9h используется либо как регистр управления прерываниями от асинхронного адаптера либо (после вывода в порт 3F9h байта с установленным старшим битом) для вывода значения старшего байта делителя частоты тактового генератора.

В режиме регистра управления прерываниями порт имеет следующий формат:

ПолеОписание
Разрешение прерывания при готовности принимаемых данных
Разрешение прерывания после передачи байта, когда выходной буфер передачи пуст
Разрешение прерывания по обнаружению состояния BREAK или при возникновении ошибке
Разрешение прерывания по изменению состояния входных линий на разъеме RS232-C (CTS, DSR, RI, DCD)
4-7Не используются, должны быть равны 0

Порт 3FAh

Порт 3FAh представляет собой регистр идентификации прерывания. Считывая его содержимое, программа может определить причину прерывания.

ПолеОписание
1 – Нет прерываний, ожидающих обслуживания
1-200 – Прерывание по линии состояния приемника, возникает при переполнении приемника, ошибках четности или формата данных или при состоянии “BREAK”. Сбрасывается после чтения состояния линии из порта 3FDh; 01 – Данные приняты и доступны для чтения. Сбрасывается после чтения данных из порта 3F8h; 10 – Буфер передатчика пуст. Сбрасывается при записи новых данных в регистр данных передатчика, порт 3F8h; 11 – Состояние модема. Устанавливается при изменении состояния входных линий CTS, RI, DCD, DSR. Сбрасывается после чтения состояния модема из порта 3FEh
3-7Должно быть равно 0

Порт 3FBh

Порт 3FBh – это управляющий регистр, доступен по записи и чтению.

ПолеОписание
0-1Длина слова в битах: 00 – 5 бит; 01 – 6 бит; 10 – 7 бит; 11 – 8 бит
Количество стоповых бит: 0 – 1 бит; 1 – 2 бита
3-4Четность: X0 – контроль на четность не используется; 01 – контроль на нечетность; 11 – контроль на четность
Фиксация четности. При установке этого бита бит четности всегда принимает значение 0 (если биты 3-4 равны 11) или 1 (если биты 3-4 равны 01)
Установка перерыва. Вызывает вывод строки нулей в качестве сигнала BREAK для подключенного устройства
1 – порты 3F8h и 3F9h используются для для загрузки делителя частоты тактового генератора; 0 – порты используются как обычно

Порт 3FCh

Порт 3FCh – это регистр управления модемом. Управляет состоянием выходных линий DTR, RTS, линий, специфических для модемов OUT1 и OUT2, для запуска диагностики.

ПолеОписание
Линия DTR
Линия RTS
Линия OUT1 (запасная)
Линия OUT2 (запасная)
Запуск диагностики при входе асинхронного адаптера, замкнутом на его выход
5-7Должно быть равно 0

Порт 3FDh

Порт 3FDh представляет собой регистр состояния линии.

ПолеОписание
Данные получены и готовы для чтения. Сбрасывается при чтении данных
Ошибка переполнения. Был принят новый байт данных, а предыдущий еще не был считан программой. Предыдущий байт потерян
Ошибка четности. Сбрасывается после чтения состояния линии
Ошибка синхронизации
Обнаружен запрос на прерывание передачи BREAK: длинная строка нулей
Регистр хранения передатчика пуст, в него можно записывать новый байт для передачи
Регистр сдвига передатчика пуст. Этот регистр получает данные из регистра хранения и преобразует их в последовательный вид для передачи
Истекло время ожидания

Порт 3FEh

Порт 3FEh представляет собой регистр состояния модема.

ПолеОписание
Линия CTS изменила состояние
Линия DSR изменила состояние
Линия RI изменила состояние
Линия DCD изменила состояние
Состояние линии CTS
Состояние линии DSR
Состояние линии RI
Состояние линии DCD

Функции BIOS для работы с последовательным асинхронным адаптером

В этом разделе мы расскажем о функцях BIOS, облегчающих обслуживание двух асинхронных адаптеров, COM1 и COM2. Эти функции доступны через прерывание INT 14h.

Порты COM и USB

Порты COM и USB

Порты – устройства, через которые компьютер может обмениваться информацией с внешним оборудованием. Строго говоря, сами порты – это микросхемы, находящиеся внутри компьютера, а на заднюю стенку системного блока выведены подключенные к ним разъемы (рис. 1.3).

Рис. 1.3. Разъемы портов.

Сначала в компьютерах появился последовательный (serial) порт. Иначе он называется COM-порт или RS-232. К COM-порту подключают кабель, состоящий из нескольких проводов, оканчивающийся 9-штырьковым разъемом. Информация через этот порт передается в виде последовательности электрических импульсов. По одному проводу (Tx) компьютер передает информацию внешнему устройству, а по другому (Rx) – принимает.

Стандарт RS-232 остается неизменным уже более десяти лет. На материнской плате компьютера предусмотрено два последовательных порта – COM1 и COM2. На задней стенке любого системного блока присутствует хотя бы один разъем последовательного порта (COM1). Второй порт (COM2) в современных компьютерах обычно просто не выведен на заднюю стенку, хотя на материнской плате соединительная колодка для него сделана.

Подключать устройства к последовательному порту рекомендуется, пока компьютер выключен. На практике это требование обычно игнорируют, что иногда приводит к выходу из строя или подключаемого устройства, или самого порта.

Параметры COM-портов можно настроить следующим образом.

1. Запустите Диспетчер устройств. Для этого нажмите кнопку Пуск и выберите пункт Панель управления. Дважды щелкните кнопкой мыши на значке Система. На вкладке Оборудование нажмите кнопку Диспетчер устройств.

2. Дважды щелкните на пункте Порты COM и LPT.

3. Выберите порт, параметры которого нужно изменить, и выполните команду Свойства. Откроется окно Свойства: Последовательный порт (СОМ2) (рис. 1.4).

Рис. 1.4. Параметры порта.

На вкладке Параметры порта окна Свойства: Последовательный порт (СОМ2) доступно несколько параметров. Из них нам может понадобиться первый параметр Скорость (бит/с), определяющий, с какой скоростью порт способен передавать и принимать данные. По умолчанию задано значение 9600 бит/с. Предполагается, что с такой скоростью способно работать любое устройство, подключаемое к порту. Однако многие современные устройства, в том числе модемы и data-кабели для сотовых телефонов, могут обмениваться данными с компьютером с гораздо большей скоростью. Поэтому, если при низкой скорости передачи подключенное устройство работает устойчиво, можно попробовать увеличить значение до 57 600 или 115 200 бит/с – данные будут передаваться гораздо быстрее.

4. Выберите из списка нужное значение скорости порта и нажмите кнопку OK.

Остальные настройки последовательных портов обычно изменять не нужно. Вернуть все настройки порта к первоначальным значениям можно, нажав кнопку Восстановить умолчания.

Порты шины USB (universal serial bus – универсальная последовательная шина) обязательно присутствуют в любом современном компьютере (см. рис. 1.2). Этот стандарт подключения внешних устройств постепенно пришел на смену последовательному порту. Данные здесь, как и через COM-порт, передаются по двум проводам. По третьему проводу на подключаемые устройства подается напряжение питания +5 В.

Максимальная скорость обмена данными через порт USB почти в 1000 раз выше, чем через последовательный порт. Правда, при подключении телефона, который является большим «тугодумом», это несущественно. Важнее то, что стандартом гарантирована возможность «горячего», во время работы компьютера, подключения устройств к портам USB. Кроме того, USB-порты не требуют настройки. В Диспетчере устройств отображаются сведения о токе, который потребляет каждое устройство, подключенное к USB-портам.

Существует три типа разъемов USB, различающиеся только формой и размером (рис. 1.5).

«Обычный», плоский разъем типа A служит для подключения кабеля к компьютеру. Таким же разъемом оснащены миниатюрные адаптеры, которые вставляются непосредственно в порт USB на системном блоке. Особенно удобно подключать такой адаптер, когда дополнительные порты выведены на переднюю панель системного блока. Если на передней панели разъемов USB нет, а подбираться к задней стенке компьютера каждый раз затруднительно, поможет кабель-удлинитель с разъемами типа А на обоих концах.

Рис. 1.5. Разъемы USB.

Разъем типа B используют для соединения кабеля с периферийными устройствами: принтерами и модемами.

Для подключения к портативным устройствам (телефонам, камерам) применяют разъем мини-USB или мини-B.

Данный текст является ознакомительным фрагментом.

Рейтинг
( Пока оценок нет )
Загрузка ...
Adblock
detector