- Буфер com порта windows
- Форум сайта mypractic.ru
- Размеры буфера приема и буфера передачи класса Serial.
- Размеры буфера приема и буфера передачи класса Serial.
- Задать размер буфера com-порта
- Role of FIFO Buffer for COM Port in windows
- 1 Answer 1
- Программирование COM порта
- §1.Описание COM портов персонального компьютера IBM XT.
- 1.1 Основные свойства COM портов.
- 1.2 Технические характеристики COM портов
- 1.3 Назначение сигналов СОМ порта по стандарту RS-232C.
- 1.4 Уровни сигналов UART
- 1.5 Передача данных через UART
- 1.6 Соединительные кабели
- 1.7 Организация обмена данных при аппаратном режиме синхронизации.
- 1.8 Организация обмена данных при программном режиме синхронизации.
- 1.9 Описание контрольных битов (Parity Control Bit):
- 1.10 ASCII кодовая таблица.
- 1.11 Аппаратная реализация СОМ портов.
- 1.12 Программная реализация UART.
- 1.13 Диагностический режим работы UART.
- §2 Программирование COM-порта.
- 2.1. Программирование в MS-DOS.
- 2.1.1. Программирование СОМ-порта прямым кодом микропроцессора.
- 1.1.2. Программирование СОМ-порта с помощью функций BIOS.
- 2.1.3. Программирование СОМ-порта с помощью средств MS-DOS.
- 2.2. Программирование в Windows.
- 2.2.1. Программирование СОМ-порта с помощью API функций Windows.
- 2.2.2. Программирование СОМ-порта с помощью внешних компонент ActiveX.
- Приложение 1
- Примеры программирования COM-порта в Win32 с помощью API функций.
Буфер com порта windows
Приветствую! Скажите, как можно обнулить буфер com-порта? Т.е. сбросить все, что там уже есть и начать писать в него заново? Заранее спасибо!
← →
Anatoly Podgoretsky ( 2002-03-10 14:42 ) [1]
Думаю надо перезагрузить компьютер
← →
Aric ( 2002-03-10 14:53 ) [2]
Мне программно надо. Идея такая — идет чтение с ком-порта какой-то информации, юзер жмет на паузу — ничего не читается, но данные-то в буфере остались — их и надо сбросить. отжал паузу — читаем дальше.
← →
Anatoly Podgoretsky ( 2002-03-10 14:59 ) [3]
Я серьезно, но у тебя был вопрос про запись, а с чтением просто, прочитай все и буфер будет чист
← →
Aric ( 2002-03-10 15:05 ) [4]
Читать в никуда? А как узнать, что в буфер уже пуст? а если там много? Вопросы, конечно, несколько тупские, но я в этом профан, а шеф требует(
есть такая команда в апи, точно есть clear*** что-то. посмотри в группе команд для ком порта.
← →
EsKor ( 2002-03-11 10:17 ) [6]
Используй API-функцию (описана в справке SDK)
PurgeComm(
HANDLE hFile, // дескриптор порта
DWORD dwFlags // флаг действия
);
dwFlags
Этот параметр м.б. комбинацией следующих значений:
PURGE_TXABORT — Прерывает операцию записи в порт даже если она не завершена;
PURGE_RXABORT — То же для операции чтения;
PURGE_TXCLEAR — Очищает выходной буфер (запись), т.е. компьютер можно не перезагружать ;
PURGE_RXCLEAR — Очищает входной буфер (чтение).
Хотя действительно можно организовать цикл чтения порта до тех пор пока не будут возвращаться пустые значения — это и означает, что буфер порта пуст.
← →
Coalycat ( 2002-03-11 10:25 ) [7]
Можно наткнуться на прблему: внешнее устройство еще передает данные. По-этому перед записью можно добавить таймаут на время выполнения команды, либо читать посылку до тех пор, пока не найдешь символ начала посылки.
← →
Leo_ ( 2002-03-12 15:07 ) [8]
Вот как читать инфу из модема(с com порта)
После предварительной настройки переменных, COM порт открывается как обычный файл. Так же пример показывает, как очищать буфер COM порта и читать из него.
Var
PortSpec : array[0..255] of char;
PortNo : Word;
success : Boolean;
error:integer;
begin
FillChar(PortSpec,Sizeof(PortSpec),#0);
StrPCopy(PortSpec,»Com1:19200,n,8,1″);
PortSpec[3]:=Char(Ord(PortSpec[3])+Ord(PortNo));
if not BuildCommDCB(PortSpec,Mode) Then
Begin
//какая-то ошибка.
Exit;
End;
Com := CreateFile(PortSpec,GENERIC_READ or GENERIC_WRITE,
0, //* comm устройство открывается с эксклюзивным доступом*/
Nil, //* нет security битов */
OPEN_EXISTING, //* comm устройства должны использовать OPEN_EXISTING*/
0, //* not overlapped I/O */
0 //* hTemplate должен быть NULL для comm устройств */
);
if Com = INVALID_HANDLE_VALUE then Error := GetLastError;
Success := GetCommState(Com,Mode);
if not Success then // Обработчик ошибки.
begin
Mode.BaudRate := 19200;
Mode.ByteSize := 8;
Mode.Parity := NOPARITY;
Mode.StopBits := ONESTOPBIT;//нужен был для перезаписи в NT
Success := SetCommState(Com, Mode);
if not Success then // Обработчик ошибки.
begin
end;
end;
Переменная «com» типа dword.
Вы так же можете очистить буффер COM порта — PurgeComm(Com,PURGE_RXCLEAR or PURGE_TXCLEAR);
И прочитать из него
Function ReadCh(Var Ch:Byte):dword;
var
n : dword;
Begin
Readfile(Com,ch,1,result,nil);
End;
← →
Aric ( 2002-03-12 15:17 ) [9]
Всем спасибо! Тема закрыта, т.к. первоначально задуманный вариант был не оч. удачным.
Форум сайта mypractic.ru
Обсуждение и вопросы по темам сайта.
Размеры буфера приема и буфера передачи класса Serial.
Размеры буфера приема и буфера передачи класса Serial.
Сообщение Эдуард » 13 ноя 2016, 19:02
Для работы с аппаратными контроллерами последовательного порта в Ардуино есть встроенный класс Serial.
Если работа порта разрешена функцией Serial.begin(), то данные поступающие на вход контроллера Rx в последовательном коде преобразуются в байты и записываются в программный буфер. Этот процесс происходит незаметно для основной программы, по прерыванию контроллера порта.
Программисту нет необходимости беспокоиться о том, что данные могут быть потеряны или пропущены. В любой момент данные последовательного порта могут быть считаны функцией Serial.read(), даже если они были получены час назад.
Передача данных последовательного порта также происходит через программный буфер. Например, при скорости 9600 передача одного байта занимает 1 мс. Если необходимо передать 10 байтов, то потребуется 10 мс. Это не значит, что основная программа должна в течение 10 мс передавать в контроллер последовательного порта данные и контролировать их передачу. Достаточно, к примеру, функцией Serial.write() загрузить данные в программный буфер класса Serial и выполнять другие задачи. Передача данных в аппаратный контроллер последовательного порта будет происходить параллельным процессом по прерыванию контроллера порта.
Часто возникают вопросы:
- Какие размеры имеют буфер приема и буфер передачи класса Serial?
Сколько данных можно принять через последовательный порт, не считывая их программой?
Сколько байтов для передачи можно загрузить в класс Serial одновременно?
Размеры приемного и передающего буферов последовательного порта Ардуино (класс Serial) задаются в файле:
Определение констант размеров буферов выглядит так:
#if !defined(SERIAL_TX_BUFFER_SIZE)
#if ((RAMEND — RAMSTART)
По умолчанию и для приемного и передающего буферов заданы размеры:
- 16 байтов для микроконтроллеров с памятью до 1023 байта;
64 байта для микроконтроллеров с памятью свыше 1023 байта.
Для Arduino UNO R3 буферы передачи и приема имеют размер 64.
В принципе эти константы можно изменит в файле HardwareSerial.h. Можно исправить константы в строчках:
#define SERIAL_TX_BUFFER_SIZE 16
#define SERIAL_TX_BUFFER_SIZE 64
#define SERIAL_RX_BUFFER_SIZE 16
#define SERIAL_RX_BUFFER_SIZE 64
Можно дописать перед блоком:
#define SERIAL_TX_BUFFER_SIZE 100
#define SERIAL_RX_BUFFER_SIZE 100
Значения констант должны быть кратными 2.
Увеличение размеров буферов позволит принимать или передавать больше данных, уменьшение – увеличит размер оперативной памяти, доступной программе. Надо только помнить, что изменения затронут все компилируемые скетчи.
Задать размер буфера com-порта
Уважаемые знатоки Delphi. Такой вопрос.
Снимаю сигнал с потенциометра, оцифровываю АЦП в микроконтроллере и передаю через COM порт в компьютер.
Т.е. в компьютер, через com порт периодично отправляется один байт со значением с датчика. Пытаюсь написать программу, считывающую это значение в реальном времени. Проблема в том, что буфер com порта быстро наполняется данными, а при считывании считывается самое старое значение. Если после каждого считывания очищать буфер командой PurgeComm, возникают случаи считывания нулевых значений (так как данные еще не успели поступить).
Думаю в моем случае было бы удобно иметь маленький размер буфера COM порта (2 байта), тогда в нем всегда бы присутствовало актуальное значение для считывания.
Пробовал задавать размер буфера командой SetupComm(hPort, 2, 2), но никакого результата (т.е., чтобы добраться до последнего значения с датчика необходимо считать весь буфер, или очистить порт командой PurgeComm и ждать новых значений).
Подкиньте идейку, что можно сделать, или как задать размер буфера COM порта.
инициализацию и считывание делаю так:
Функции для очистки буфера COM порта?
Существют ли функции для очистки буфера COM порта? Столкнулся с проблемой: только что открытый.
SerialPort: не получается прочитать байты из буфера com-порта
помогите пожалуйста..не получается прочитать байты из буфера com-порта(com2 или com3)..код по-ходу.
Организовать приём байтов из буфера последовательного порта SerialPort
Всем здравствуйте. Подскажите, пожалуйста, кто работал с последовательным портом, как правильно.
Как обрабатывать результат буфера ком-порта(запись, чтение)?
Такой вопрос. Пишу программу, которая работает с гипертерминалом на другом компе. На прием, пишу.
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
размер буфера
принимаю с imap сервера ответ, в массив byte; и ответ добивает пустыми символами массив. свойство.
Передать размер буфера
strcpy_s(Name, sizeof Name, newName); // либо же strcpy_s(Name, Name, newName); Собственно.
WinInet и размер буфера
Начал недавно изучать WinInet (да и С++ в целом конечно). И назрел такой вот вопрос. Что делать в.
Размер буфера у wsprintf
Здравствуйте ув. форумчане! Есть такой код: invoke wsprintfA, buf, «0x%p», 0xAABBCCDD .
Role of FIFO Buffer for COM Port in windows
can anyone here please explain the role of FiFo Buffer check (at advanced COM Port settings from device manager) in windows?
How checking/unchecking the FIFO Buffer affects reading data from COM Port?
Many Thanks in advance for helpful replies!
1 Answer 1
The original UART chip used in IBM-PC designs was the 8250. It could store just one received byte while the receiver was busy receiving the next byte. That puts a high demand on the responsiveness of the operating system’s serial port driver, responding to the «data received» interrupt. It must be quick enough to read that byte before the receiver overwrites it. Not being quick enough causes an overrun error and irretrievable data loss. High interrupt rates are also detrimental.
That design was improved upon by the 16550 UART chip. It got a larger buffer, the FIFO, giving the OS more time to empty the buffer before an overrun could occur. The serial port driver can program it to generate an interrupt at a particular fill level, thus reducing the interrupt rate as well.
But chips designs have the same kind of problem that software has, the original 16550 had a bug in the FIFO implementation. Fixed in the 16550A, version 1.1 in software speak.
Problem was, the driver could not tell whether the machine had the buggy version of the 16550 or a good one. Simple chips like that don’t have a GetVersion() equivalent. So it provided a property page that lets the user turn the FIFO support off, thus bypassing the bug.
The odds that today you’ll have the buggy version are zero. Turning the FIFO off is no longer necessary.
Программирование COM порта
Автор: Electron18
www.softelectro.ru    
2009              
electron18@softelectro.ru
§1.Описание COM портов персонального компьютера IBM XT.
1.1 Основные свойства COM портов.
Работа коммуникационных портов реализована на универсальных асинхронных приемопередатчиках UART.
UART- это микросхемы, которые работают по стандарту RS-232C. Для СОМ порта компьютера используется 9-ти штырьковый разъем DE9p согласно стандарта TIA-574. В этом разъеме используется шесть сервисных сигналов и два канала обмена последовательными данными.
Основные свойства СОМ портов: 1.Полнодуплексный обмен данными. Означает, что можно одновременно передавать и принимать поток данных. Существуют два аппаратно и программно независимых канала передачи данных. Один канал для передачи данных, другой канал для приема данных. Причем COM-портам безразлично, чем занят процессор в это время, у них присутствуют собственные буферы приема и передачи данных. В этих буферах данные выстраиваться в очередь на передачу и очередь на прочтение данных процессором. Любая программа может обратиться к СОМ-порту и получить данные из его буфера, тем самым очистив его. Естественно буферы не безграничны, их размер задается при конфигурировании портов. Интерфейсы RS-485, Modbus, USB и др. (за исключением сетевых протоколов) являются полудуплексными и физически не способны вести обмен данными в обоих направлениях одновременно. 2.Набор сервисных сигналов Сервисные сигналы, предусмотренные стандартом RS-232c, позволяют организовать обмен данными между двумя устройствами одновременно в обоих направлениях. Сервисные сигналы представлены отдельными цифровыми входами и выходами с памятью. Например, кода по телефону на модем поступал звонок со станции, модем по 9-му контакту (RI) сообщал РС, что ему позвонили, и начиналась процедура обмена данных. Причем с помощью сервисных сигналов РС и модем могли приостановить обмен данных или заставить повторить их. Вариантов использования сервисных сигналов большое множество. Разработчик может использовать их по своему усмотрению. Например, с помощью этих сигналов удобно опрашивать контакты концевых выключателей или фотодатчиков, а также можно включать/выключать различные устройства или запитывать слаботочное устройство. 3.Программная независимость UART полностью реализован аппаратно и не зависит от программного обеспечения и ОС. 4. Асинхронная передача данных по каналу связи Означает то, что РС может послать данные на конечное устройство, не заботясь о синхронности их поступления. Конечное устройство само подстраивается под полученные данные. В синхронных протоколах для этого служит специальный сигнал, передающийся по отдельному проводу. В коммуникационных портах синхросигнал встроен в каждый передаваемый символ, в виде стартового и стопового бита. Метод, которым синхронизируются данные по стандарту RS-232С, стал общеупотребительным для всех асинхронных протоколов обмена данными.
1.2 Технические характеристики COM портов
Рис.1 Вид разъёмов СОМ1 и СОМ2 на материнской плате.
- Тип разъема:DE9p(DB9P) или DB25P male (папа), ответная часть DE9s(DB9s) или DB25s femini (мама)
- Аппаратная реализация: микросхемы UART intel8250/16450/16550
- Уровень сигнала для TxD, RxD: 1 = -3. -12 в; 0=+3. +12 в (сигналы инвертированы)
- Уровень сигналов RTS, DTR, CTS, DSR, DCD, RI: 1 (True)=+3. +12в ; 0 (False)= -3. -12в
- Зона нечувствительности: -3. +3 в
- Количество портов IBM XT: четыре COM1, COM2, COM3, COM4
- Адреса в пространстве ввода/вывода: COM1=3F8h, COM2=2F8h, COM3=3E8h, COM4=2E8h
- Аппаратные прерывания: COM1,COM3= IRQ4(IQ11) COM2,COM4= IRQ3(IQ10)
- Функции BIOS: 14h (инициализация, запись, чтение, опрос состояния, настройка)
- Стандартная скорость, бит/сек: 50,75,110,150,300,600,1200,1800,2000,2400,3600,4800,7200,9600,14400,19200,28800,38400,57600,115200
- Максимальная скорость, бит/сек: 1 500 000
- Количество бит данных в переданном символе: 5,6,7,8
- Длина стопового бита: 1, 1.5, 2
- Режимы контрольного бита(Parity): N(None), E(Even), M(Mark), O(Odd), S(Space)
- Режимы синхронизации обмена (Handshaking): 0-None, 1-XOnXoff, 2-RTS, 3-RTSXOnXoff
- Канал передачи данных (инверсный) : TxD (3)-GND(5)
- Канал приёма данных (инверсный): RxD(2)-GND(5)
- Выходные сервисные сигналы: RTS(7)-CND(5); DTR(6)-GND(5)
- Входные сервисные сигналы: CTS(8)-GND(5); DSR(6)-GND(5); DCD(1)-GND(5); RI(9)-GND(5)
- Расстояния связи: стандартное — 25ft( 7.62м), максимальное (определено многими факторами)
1.3 Назначение сигналов СОМ порта по стандарту RS-232C.
- GND- Ground, (общий) второй провод для всех сигналов.(Сигналы передаются всегда по двум проводам!)
- TxD- Transmited Data, асинхронный канал для передачи данных.
- RxD- Received Data, асинхронный канал для приема данных.
- RTS- Request To Send (запрос на передачу), Выход который говорит о том, что у компьютера есть данные для передачи по каналу TxD для конечного устройства.
- DTR- Data Terminal Ready(готовность терминала данных), Выход который говорит о том, что компьютер(терминал) готов к обмену данными с конечным устройством
- CTS- Clear To Send (очищен для передачи) Вход, который говорит о том, что конечное устройство готово принимать данные от терминала по каналу TxD. Обычно этот сигнал выставляет конечное устройство после того, как оно получит от компьютера сигнал RTS=True(запрос на передачу) и будет готово принять данные от компьютера. Если конечное устройство не выставит сигнал CTS=True, то передача по каналу TxD не начнется. Данный сигнал используется для аппаратного управления потоками данных
- DSR- Data Set Ready(установка данных готова), Вход который говорит о том, что конечное устройство выполнило все установки и готово начать передавать и принимать данные от компьютера. Если конечное устройство модем, то установка DSR=True воспринимается компьютером(терминалом) так, что модем уже установил связь с другим модемом и готов начать процедуру обмена между двумя компьютерами оснащенных модемами
- DCD- Data Carrier Detected(обнаружен носитель информации), Вход который информирует компьютер(терминал) об обнаружении другого терминала, то есть конечное устройство , например модем, обнаружил другой модем, который хочет инициализировать обмен данных между терминалами. Модем выставляет сигнал DCD=True, который обнаруживается на входе компьютера(терминала). Если терминал готов к обмену данными, то он на сигнал DCD=True должен выставить сигнал готовности терминала к обмену данными DTR=True, после чего начинается обмен данными между двумя терминалами.
- RI- Ring Indicator(индикатор звонка), Вход который говорит компьютеру(терминалу) что на конечное устройство поступает сигнал вызова. Например, на модем поступил сигнал вызова с телефонной станции, совсем не обязательно, что этот вызов закончится обменом данных.
- PG — Protective Ground. Защитное заземление.
Рис.2 Нумерация контактов для разъёмов COM-порта
1.4 Уровни сигналов UART
UART использует уровни сигналов -12в. +12в . Зона нечувствительности, то есть отсутствие сигналов считается напряжение -3в. +3в. При этом обратите внимания, что принимаемые/передаваемые данные инвертированы.
Рис.3 Уровни сигналов UART по стандарту RS-232c
- порт не инициализирован — на всех линиях напряжения находятся в диапазоне -3в. +3в
- режим ожидания — на всех линиях напряжение находится в диапазоне -3в. -12в
Исходные состояния
1.5 Передача данных через UART
При передаче данных символы передаются из буфера передатчика последовательно (первым пришел- первым вышел). Специально назвал символами , а не байтами, так как символы могут иметь размер от 5 до 8 бит. Каждый переданный символ снабжается стартовым и стоповым битами, предназначенным для синхронизации на приемной стороне. После стартового бита следуют биты данных, начиная с младшего бита и заканчивая старшим. За последним битом данных символа может следовать бит паритета, служащий для обнаружения ошибки передачи битов данных. Последним передается стоповый бит, который необходим для временного разделения переданных символов
Рис.4 Показана передача символов «0» «0» без паритета, с одним стоповым битом
На рисунке 4 хорошо видно, что стоповый бит разделяет два переданных символа. При необходимости можно увеличить этот интервал до 2 стоповых битов, если конечное устройство не успевает разделять символы.
Рис.5 Показана передача символов «0» «0» с проверкой на четность (EVEN), с одним стоповым битом
1.6 Соединительные кабели
Нуль-модемное соединение двух COM портов.
При таком соединении компьютеры(терминалы) соединяются между собой непосредственно через СОМ-порты, без использования модемов. Так как компьютеры обладают большой скоростью обработки данных, то синхронизировать их работу не нужно. Поэтому предполагается, что режим синхронизации обмена (Handshaking): 0-None, то есть сервисные сигналы не влияют на процедуры обмена данными. Для этого используется нуль-модемный кабель.
Рис.6 Нуль-модемный кабель для Handshaking = 0 (None)
Так как режим синхронизации обмена на СОМ портах может быть включен, то часто сервисные сигналы СОМ портов замыкают самих на себя, тем самым исключая их влияния на процедуру обмена.
Рис.7 Нуль-модемный кабель для любых режимов Handshaking
Если необходимо можно использовать полный кабель, но при этом СОМ-порты должны быть настроены на аппаратную синхронизацию обмена.
Данный режим используют когда устройство не успевает перерабатывать информацию полученную по СОМ-порту (меделенное устройство или PC). Этот режим позволяет останавливать обмен данных на время обработки полученной информации.
Рис. 8 Нуль-модемный кабель для аппаратного режима синхронизации Handshaking=2
Модемное соединение подразумевает соединение двух компьютеров(DTE) через модемы(DCE). Модемы (модуляторы-демодуляторы) — специальные устройства, позволяющие вести обмен данными практически на неограниченное расстояния, используя для этого модуляцию и демодуляцию информационных сигналов. Поэтому модемное соединение подразумевает подключение СОМ-порта компьютера(DTE) к конечному устройству модему (DCE). Обычно в таком соединении используют аппаратный режим синхронизации Handshaking =2 (модемы — это медленные устройства). Этот режим позволяет модемам управлять процессом передачи данных.
Рис. 9 Типичный модемный кабель.
1.7 Организация обмена данных при аппаратном режиме синхронизации.
Аппаратный режим синхронизации обмена данными RTS/CTS (hardware flow control) Handshaking =2, использует сервисные сигналы RS-232C для управления потоком данных.
Рис.10 Организация обмена при аппаратной синхронизации.
- DTR=True компьютер указывает на желание использовать модем
- В ответ модем сигнализирует о установлении соединения с другим модемом и своей готовности выставив DSR=True.
- Сигналом RTS=True компьютер запрашивает разрешение на передачу и заявляет о своей готовности принимать данные от модема.
- Сигналом CTS=True модем уведомляет о своей готовности к приему данных от компьютера и передаче их в линию. По этому сигналу начинается обмен данными между терминалами через модемы.
- Установкой CTS=False модем сигнализирует о невозможности дальнейшего приема, компьютер должен приостановить передачу данных.
- Установкой CTS=True, модем сообщает, что он может продолжать обмен данными.
- Установкой RTS=False компьютер сообщает модему о временной приостановке обмена.
- Модем получив сигнал остановки обмена RTS=False, сообщает о приостановки обмена сигналом CTS=False
- Компьютер вновь готов принимать данные и он выставляет сигнал RTS=True
- Модем получив сигнал от компьютера о готовности к обмену выставляет свою готовность CTS=True. После чего возобновляется обмен данных.
- Компьютер указывает на завершение обмена выставив RTS=False
- Модем подтверждает завершение обмена сигналом CTS=False
- Компьютер снимает сигнал DTR, что является сообщением для модема разорвать соединение и повесить трубку.
- Модем подтверждает разрыв соединения установкой сигнала DSR=False
Порядок выставления сервисных сигналов при обмене через модем:
Как видно из рис.10 модем использует сигнал CTS, который позволяет остановить передачу данных, если приемник не готов к их приему. Передатчик «выпускает» очередной байт только при включенной линии CTS. Байт, который уже начал передаваться, задержать сигналом CTS невозможно (это гарантирует целостность посылки). Аппаратный протокол обеспечивает самую быструю реакцию передатчика на состояние приемника.
1.8 Организация обмена данных при программном режиме синхронизации.
Программный протокол управления потоком XON/XOFF( Handshaking =1). Работает протокол следующим образом: если устройство, принимающее данные, обнаруживает причины, по которым оно не может их дальше принимать, оно по обратному последовательному каналу посылает байт-символ XOFF (13hex). Противоположное устройство, приняв этот символ, приостанавливает передачу. Когда принимающее устройство снова становится готовым к приему данных, оно посылает символ XON (11hex), приняв который противоположное устройство возобновляет передачу. Время реакции передатчика на изменение состояния приемника по сравнению с аппаратным протоколом увеличивается, по крайней мере, на время передачи символа (XON или XOFF) плюс время реакции программы передатчика на прием символа. Преимущество программного протокола заключается в отсутствии необходимости передачи управляющих сигналов интерфейса — минимальный кабель для двустороннего обмена может иметь только 3 провода. Недостатком данного метода является большее время реагирования и исключения из передаваемого потока двух символов (13hex, 11hex).
Существует смешанный метод синхронизации обмена данными RTS/XOn/Xoff (Handshaking =3), который представляет собой объединение двух предыдущих методов.
1.9 Описание контрольных битов (Parity Control Bit):
- N(None) — проверка на паритет не используется и бит не выставляется;
- E(EVEN) — проверка на четность, дополняет передаваемый символ так, чтобы количество единиц в передаваемом символе было четным;
- O(Odd)— проверка на нечетность, дополняет передаваемый символ так, чтобы количество единиц в передаваемом символе было нечетным;
- M(MARK) — бит паритета всегда равен единице;
- S(SPACE)— бит паритета всегда равен нулю.
Режимы контрольного бита (Parity Control Bit)
1.10 ASCII кодовая таблица.
Для кодирования символов передаваемых по RS-232С используется таблица, кодирующая использованные символы и управляющие знаки.
Рис.11 Стандартная кодовая таблица ASCII
Первые 32 символа этой кодовой страницы представляют собой управляющие символы, которые предназначены для управления модемом. Например, использование символов 17(11hex) и 19(13hex) были изложены выше, в программном способе управления обменом. Эти символы были разработаны в основном для управления печатающими устройствами и модемами
00(00hex) — NUL пустой символ | 08(08hex)- BS возврат на одну позицию | 16(10hex)- DLE переключение кода | 24(18hex)- CAN отмена |
01(01hex)- SOH начало заголовка | 09(09hex)- HT горизонтальная табуляция | 17(11hex)- DC1 управление первым устройством (XON) | 25(19hex)- EM конец носителя |
02(02hex)- STX начало текста | 10(0Ahex)- LF перевод строки | 18(12hex)- DC2 управление вторым устройством | 26(1Ahex)- SUB замена |
03(03hex)- ETX конец текста | 11(0Bhex)- VT вертикальная табуляция | 19(13hex)- DC3 управление третьим устройством (XOFF) | 27(1Bhex)- ESC переход |
04(04hex)- EOT конец передачи | 12(0Chex)- FF подача бланка (новый лист) | 20(14hex)- DC4 управление четвертым устройством | 28(1Chex)- FS разделитель файла |
05(05hex)- ENQ запрос | 13(0Dhex)- CR возврат каретки | 21(15hex)- NAK переспрос | 29(1Dhex)- GS разделитель группы |
06(06hex)- ACK подтверждение | 14(0Ehex)- SO переход на верхний регистр | 22(16hex)- SYN режим синхронного ожидания | 30(1Ehex)- RS разделитель записи |
07(07hex)- BEL звонок | 15(0Fhex)- SI переход на нижний регистр | 23(17hex)- ETB конец передачи блока | 31(1Fhex)- US разделитель блока |
1.11 Аппаратная реализация СОМ портов.
Для аппаратной реализации СОМ портов по стандарту RS-232 используется специализированная микросхема UART. UART (Universal Asynchronous Receiver-Transmitter )- универсальный асинхронный приёмо-передатчик. Микросхема i8250 установленная в IBM XT послужила началом целой серии микросхем UART, которые устанавливались на материнские платы PC.
- Микросхемы UART:
- 8250 — буфер 1 байт
- 16450 — буфер 8 байт
- 16550 — буфер 16 байт
- 16650 — буфер 32 байт
- 16750 — буфер 64 байт
- 16850 — буфер 128 байт
- 16950 — буфер 512 байт
- Hayes ESP — буфер 1024 байт
Микросхемы выпускались разными фирмами производителями: Intel, National Semiconductor, Maxim и др.
Микросхема представляет собой управляемую логическую схему с буферными регистрами для приёма и передачи последовательных данных. Буферные регистры позволяют вести передачу и приём данных без участия CPU. Соответственно чем больше ёмкость буферных регистров, тем реже микросхема прерывает работу CPU. Буферные регистры устроены по принципу «очереди» (FIFO) — первым пришел, первым вышел. Получив порцию данных в передающий буферный регистр, UART начинает передавать её в сеть RS-232, одновременно он может принимать данные из сети RS-232 в приёмный буферный регистр. Программное обеспечение в любой момент может обратиться к приёмному буферу UART, тем самым освободив его для приёма следующих данных. При заполнении приёмного буфера UART может прервать работу CPU, сообщив ему о заполнении буфера. Заполнение приёмного буфера вызовет остановку приёма данных из сети RS-232, до тех пор пока он не будет прочитан.
Рассмотрим работу UART на примере микросхемы PC16550D
Рис.12 Стандартная схема включения UART PC16550D с микропроцессором Intel 8088
Обращение к микросхеме осуществляется через адресное пространство портов ввода-вывода CPU. Микросхема подключается к системной шине при активизации сигнала CS0, который вырабатывается при обращении CPU к заданному диапазону адресов порта. Адреса портов ввода-вывода заданы в BIOS. Обычно они имеют значения: COM1=3F8h, COM2=2F8h, COM3=3E8h, COM4=2E8h . На входы UART A0,A1,A2 подаются три младших разряда адресной шины CPU. Адрес заданный в BIOS является начальным адресом диапазона адресов (A2A1A0=000). Следовательно полный диапазон адресов для каждого порта равен 8 адресам (от A2A1A0=000 до A2A1A0=111). Например, для СОМ4 2E8h,2E9h,2EAh,2EBh,2ECh,2EDh,2EEh,2EFh.
Расстояние между начальными адресами портов равно 16, что допускает в дальнейшем использования микросхем с четырьмя начальными адресными линиями. Обращение к микросхеме по определённому адресу открывает доступ к группе регистров управления или буферных регистров приёма и передачи. CPU может записать данные в регистры UART выставив сигнал WR=0, или прочитать данные, выставив сигнал RD=0.
1.12 Программная реализация UART.
UART состоит из 12 регистров, к которым можно обратиться по восьми адресам портов ввода-вывода.
Так как индивидуального адреса для каждого регистра не хватает, то используют расщепление адресного пространства с помощью следующих методов:
    1.Разделение одного адресного пространства на два регистра по записи/чтению.
        По сигналу чтения RD=0 читается один регистр, по сигналу записи WR=0 записывается второй регистр.
        То есть данные по одинаковому адресу записываются или читаются с разных регистров.
        Таких регистров четыре:
                THR, RBR — по адресу UART 00h(A2A1A0=000)
                IIR, FOR — по адресу UART 02h(A2A1A0=010)
        Эти регистры односторонние, то есть в одни можно только записывать, в другие только читать данные.
    2.Использование дополнительного адресного бита
        Используют 7-ой бит регистра LCR-находящегося по адресу UART 03h(A2A1A0=011).
        Этот бит называют DLAB, если DLAB=0, то для чтения/записи используется один регистр,
        если DLAB=1, то для чтения/записи используется второй регистр.
        Таких регистров пять:
                (THR & RBR),DLL — по адресу UART 00h(A2A1A0=000)
                DIM, IER — по адресу UART 01h(A2A1A0=001)
адрес | DLAB | чтение/запись | Название регистра |
00h | 0 | WR | THR(Transmit Holding Register)-регистр данных ожидающих передачи |
00h | 0 | RD | RBR(Receiver Buffer Register)- буферный регистр приемника |
00h | 1 | RD/WR | DLL(Divisor Latch LSB)-младший байт делителя частоты |
01h | 1 | RD/WR | DIM(Divisor Latch MSB)-старший байт делителя частоты |
01h | 0 | RD/WR | IER(Interrupt Enable Register)-регистр разрешения прерывания |
02h | х | RD | IIR(Interrupt Identification Register)-регистр идентифицирующий прерывания |
02h | х | WR | FCR(FIFO Control Register)-регистр управления режимом FIFO |
03h | x | RD/WR | LCR(Line Control Register)-регистр управления линией связи |
04h | x | RD/WR | MCR(Modem Control Register)-регистр управления модемом |
05h | x | RD/WR | LSR(Line Status Register)-регистр состояния линии связи |
06h | x | RD/WR | MSR(Modem Status Register)-регистр состояния модема |
07h | x | RD/WR | SCR(Scratch Pad Register)-регистр временного хранения |
Рис.13 Функциональная схема UART PC16550.
THR-регистр данных ожидающих передачи(только для записи)
(Transmit Holding Register)
Рис.14 Регистр THR (Адрес=00h, DLAB=0, WR)
        В этот регистр записывают байт данных, определённый как символ (от 5 до 8 бит) который будет передан в линию связи. Символ, принятый в THR передаётся далее в сдвигающий регистр младшем битом вперед (см. рис.5). В начало символа добавляется стартовый бит, в конец символа добавляется стоповый бит. Перед стоповым битом может находиться бит паритета. Если символ короче 8 бит, то старшие биты регистра THR игнорируются (не используются, хотя записываются в этот регистр). Регистр THR может принять всего один байт данных и передать его в регистр последовательного сдвига. В большинстве UART имеется режим FIFO, в котором данные загружаются не в THR, а в регистр FIFO. Например, UART PC16550 имеет регистр FIFO, который может принять 16 байт данных. Кроме этого у некоторых UART существует режим DMA, в этом режиме сдвигающий регистр заполняется байтами данных непосредственно из оперативной памяти без участия микропроцессора.
Для указания того, что регистр THR пуст и в него можно загрузить очередной байт данных используют бит 5 регистра LSR. Этот бит называется THRE(Transmitter Holding Register Empty) -«регистр данных ожидающих передачи пуст». Если THRE=1, то в регистр THR можно посылать очередной байт данных, в режиме FIFO этот бит говорит о том, что регистр FIFO пуст и можно посылать следующий пакет байтов данных. Бит THRE может быть источником прерывания CPU.
RBR- буферный регистр приемника(только для чтения)
(Receiver Buffer Register)
Рис.15 Регистр RBR (Адрес=00h, DLAB=0, RD)
        В этот регистр байты(символы) принимаются из приемного сдвигающегося регистра. Регистр RBR может принять только один байт из сдвигающего приемного регистра. Аналогично передающей части UART здесь есть регистр FIFO, который может принимать больше одного байта данных минуя регистр RBR. К моменту заполнения сдвигающего приёмного регистра регистр RBR должен быть освобожден для приема очередного байта, иначе произойдет ошибка переполнения. Освобождение регистра RBR происходит, когда данные из него читаются микропроцессором. О том, что символ потерян в результате переполнения сообщает бит 1 регистра LSR. Этот бит называется ОЕ (Overrun Error)-«ошибка переполнения», OE=1 означает что один из переданных символов потерян.
О том, что байт готов к прочтению микропроцессором (т.е. полностью выгрузился из приемного сдвигающегося регистра или FIFO) сообщает бит 0 регистра LSR. Этот бит называется DR (Receiver Data Ready) -«Данные приёмника готовы». DR=1 говорит о том, что регистр RBR(или FIFO) содержит принятый байт и его необходимо прочитать, DR сбрасывается в ноль после прочтения регистра RBR микропроцессором. Это бит также может инициировать прерывание микропроцессора.
DLL-младший байт делителя частоты :16 (чтение/запись)
(Divisor Latch LSB)
Рис.16 Регистр RBR (Адрес=00h, DLAB=1, RD/WR)
        В это регистре находится младший байт делителя частоты деленного на 16.
DIM-старший байт делителя частоты :16 (чтение/запись)
(Divisor Latch MSB)
Рис.17 Регистр RBR (Адрес=01h, DLAB=1, RD/WR)
        В этом регистре находится старший байт делителя частоты деленного на 16.
В микросхеме UART частота задающего кварца делится на делитель частоты(Decimal Divisor),который получается из двухбайтового числа (DIM,DLL) умноженного на 16. Таким образом делитель частоты задает скорость обмена данных через UART.
Записью в регистры DIM и DLL старшего и младшего байта этого двухбайтового числа вы зададите скорость обмена СОМ-порта в бит/сек.
Для кварца UART частотой f=1,8432 МГц, делитель частоты:16 считается по формуле:
D=115200/V, где V-скорость в бит/сек, D=делитель частоты:16
Для кварца UART частотой f=24 МГц, делитель частоты:16 считается по формуле:
D=1 500 000/V, где V-скорость в бит/сек, D=делитель частоты:16
1,8432 МГц | 24 МГц | |||||
---|---|---|---|---|---|---|
Скорость, бит/сек | делитель:16 | DIM | DLL | делитель:16 | DIM | DLL |
50 | 2304 | 09h | 00h | 30000 | 75h | 30h |
75 | 1536 | 06h | 00h | 20000 | 4Eh | 20h |
110 | 1047 | 41h | 07h | 13636 | 35h | 44h |
150 | 768 | 03h | 00h | 10000 | 27h | 10h |
300 | 384 | 01h | 80h | 5000 | 13h | 88h |
600 | 192 | 00h | C0h | 2500 | 09h | C4h |
1 200 | 96 | 00h | 60h | 1250 | 04h | E2h |
1 800 | 64 | 00h | 40h | 833 | 03h | 41h |
2 000 | 58 | 00h | 3Ah | 750 | 02h | EEh |
2 400 | 48 | 00h | 30h | 625 | 02h | 71h |
3 600 | 32 | 00h | 20h | 417 | 0h | A1h |
4 800 | 24 | 00h | 18h | 312 | 01h | 38h |
7 200 | 16 | 00h | 10h | 208 | 00h | D0h |
9 600 | 12 | 00h | 0Ch | 156 | 00h | 9Ch |
14 400 | 8 | 00h | 08h | 104 | 00h | 68h |
19 200 | 6 | 00h | 06h | 78 | 00h | 4Eh |
28 800 | 4 | 00h | 04h | 52 | 00h | 34h |
38 400 | 3 | 00h | 03h | 39 | 00h | 27h |
57 600 | 2 | 00h | 02h | 26 | 00h | 1Ah |
115 200 | 1 | 00h | 01h | 13 | 00h | 0Dh |
250 000 | x | x | x | 6 | 00h | 06h |
300 000 | x | x | x | 5 | 00h | 05h |
375 000 | x | x | x | 4 | 00h | 04h |
500 000 | x | x | x | 3 | 00h | 03h |
750 000 | x | x | x | 2 | 00h | 02h |
1 500 000 | x | x | x | 1 | 00h | 01h |
Как видно из таблицы 4, СОМ порт ПК (с UART 16550 и выше) может работать на скорости до 1,5Mb/s.
IER-регистр разрешения прерывания(чтение/запись)
(Interrupt Enable Register)
Рис.18 Регистр IER (Адрес=01h, DLAB=0, RD/WR)
        Регистр разрешения прерываний дает разрешения определённым событиям вызывать прерывание микропроцессора.
Бит 0. RxD_IЕ — если RxD_IЕ=1,то разрешено прерывание для приема данных,это прерывание возникает когда необходимо принять символ из регистра RBR (в режиме FIFO — прерывание по тайм-ауту).
Бит 1. TxD_IE — если TxD_IEЕ=1,то разрешено прерывание для передачи данных, это прерывание возникает когда передающий буфер пуст и необходимо загрузить байт в регистр THR.
Бит 2. RxL_IЕ — если RxL_IЕ=1,то разрешено прерывание при обрыве линии связи или ошибке в приёме данных, это прерывание возникает когда в регистре состояния линии связи LSR будут выставлены биты этих ошибок.
Бит 3. Mod_IЕ — если Mod_IЕ =1,то разрешено прерывание при изменении состояния любого из входных сигналов RST,CTS,DCD,RI, это прерывание возникает когда состояние входных сигналов COM-порта изменились.
Бит 4..7. Не используются и всегда равны 0.
IIR-регистр идентифицирующий прерывания (чтение)
(Interrupt Identification Register)
Рис.19 Регистр IIR (Адрес=02h, RD)
        Чтобы минимизировать программное обеспечение, UART располагает по приоритетам прерывания в четыре уровня и делает запись этих прерываний в IIR. Четыре уровня прерывания располагаются в порядке приоритета условий прерывания заданных регистрами — RLS; RDR; THR; и MSR. Когда CPU обращается к IIR, UART замораживает все прерывания и указывает самое высокое приоритетное отложенное прерывание для CPU. Во время обработки прерывания, UART делает запись новых прерываний, но не изменяет их текущий признак, до полной обработки.
Бит 0. IP(Interrupt Pending)— если IP=1, то все прерывания обработаны. Если IP=0,то есть необработанные прерывания.
Бит 1. I_ID0(Interrupt ID Bit0)- нулевой бит идентификатора прерываний
Бит 2. I_ID1(Interrupt ID Bit1)- первый бит идентификатора прерываний
Бит 3. I_ID2(Interrupt ID Bit2)- второй бит идентификатора прерываний
I_ID2 | I_ID1 | I_ID0 | Приоритет | идентификация |
x | 0 | 0 | Четвертый | Изменилось состояние модема, сбрасывается прочтением регистра MSR. |
x | 0 | 1 | Третий | Регистр THR пуск, ожидается байт от CPU. Сбрасывается записью байта в THR. |
x | 1 | 0 | Второй | Принят байт данных в регистр RBR, сбрасывается чтением регистра RBR. |
x | 1 | 1 | Наивысший | Обрыв линии или ошибка на линии, сбрасывается прочтением регистра LSR. |
I_ID2 | I_ID1 | I_ID0 | Прирритет | идентификация | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | Четвертый | Изменилось состояние модема, сбрасывается прочтением регистра MSR | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 1 | Третий | Буферный регистр передачи FIFO пуск, ожидается данные от CPU. Сбрасывается записью в передающий буфер FIFO | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 1 | 0 | Второй | Приемный буфер FIFO заполнился, сбрасывается чтением приемного буфера FIFO. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 1 | 1 | Наивысший | Обрыв линии или ошибка на линии, сбрасывается прочтением регистра LSR | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 0 | Второй | индикатор тайм-аута (за 4-кратный интервал времени символа не передано и не принято ни одного символа, хотя в буфере FIFO имеется, по крайней мере, один символ). Сброс выполняется чтением приемного буфера FIFO. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | 1 | 1 | Бит 4..5.Зарезервированны Бит 6. FE_ID0(FIFOs Enabled ID Bit0)- нулевой бит идентификатора режима FIFO
FCR-регистр управления режимом FIFO (запись) Рис.20 Регистр FCR (Адрес=02h, WR)         Это регистр используется только для записи, его данные расположены как в регистре IIR. Этот регистр используется, чтобы разрешить режимы FIFO, очистить буферы FIFO, задать уровень заполнения буферов FIFO, и выбрать тип DMA(прямого обращения к памяти). Бит 0. TRFIFOE(Transmit And Receive FIFO Enable)— Запись 1 в этот бит допускает оба режима FIFO передатчика(XMIT) и приемника(RCVR). Сброс бита в 0 очистит все байты в обоих буферов FIFO. При изменении режима FIFO к 16450 и наоборот, буферы FIFO автоматически очищаются. Этот бит должен быть в 1, когда производится запись других битов регистра FCR, иначе они не будут запрограммированы. Бит 1. RESETRF(Reset Receiver FIFO)-Запись 1 в этот бит очищает все байты в приемном буфере FIFO и сбрасывает его счетчик в 0. Сдвиговый регистр при этом не очищается. После этого 1 в этом бите сбрасывается в 0. Бит 2. RESETTF(Reset Transmitter FIFO)- Запись 1 в этот бит очищает все байты в передающем буфере FIFO и сбрасывает его счетчик в 0. Сдвиговый регистр при этом не очищается. После этого 1 в этом бите сбрасывается в 0. Бит 3. DMAE(DMA Enabled)- Запись 1 в этот бит приводит к изменению сигналов UART RxRDY и TxRDY с 0 к 1,при условии что FCR(bit0)=1. Эти аппаратные сигналы используются для организации правильной работы режима DMA в микропроцессорной системе. Бит 6. ITL_ID0 (Interrupt Trigger Level ID bit0) — нулевой бит идентификатора триггера уровня прерывания.
LCR-регистр управления линией связи(запись/чтение) Рис.21 Регистр LCR (Адрес=03h, RD/WR)         Данный регистр служит для определения(задания) формата асинхронного обмена передачи данных. Также в этом режиме устанавливается бит DLAB, который позволяет программисту записывать и читать данные из нужных регистров.. Программист может не только записывать, но и читать содержимое регистра LCR. Способность чтения упрощает системное программирование и устраняет потребность в отдельной области в системной памяти для хранения характеристик линии. Бит 0. SDB_ID0(Serial Data Bits ID0)- нулевой бит идентификатора количества бит в передаваемом символе.
Бит 2. STOP_B(Stop Bits)- Этот бит определяет число стоповых битов, переданных или полученных в каждом последовательном символе. Если бит STOP_B=0, то передается один стоповый бит. Если бит STOP_B=1, то стоповый бит равен двум для 6,7,8 битовых символов и полтора стоповых бита для 5-ти битовых символов. Приемник проверяет только первый стоповый бит, независимо от выставленных стоповых битов. Бит 3. PAREN(Parity Enable) -Если PAREN=1, то разрешено использование бита паритета и данный бит вставляется между последним битом данных и стоповым битом. Если PAREN=0, то бит паритета не выставляется и не входит в состав передаваемого символа. Бит 4. EVENPAR(Even Parity Select) — Бит выбора типа контроля паритета. Если EVENPAR=1, то происходит проверка на четность. Если EVENPAR=0, то происходит проверка на нечетность. Бит 5. STICPAR (Sticky Parity)- Если STICPAR=0, то бит паритета бит генерируется в соответствии с паритетом выводимого символа. Если STICPAR=1, то постоянное значение контрольного бита: при EVENPAR=1 — нулевое, при EVENPAR=0 — единичное. Бит 6. BRCON(Break Control)- Управляющий бит обрыва связи. Если BRCON=1, то вслучае возникновения перерыва в приеме данных, передатчик UART начнёт передавать в линию нули. Бит 7. DLAB(Divisor Latch Access Bit)- Этот бит доступа к делителю частоты. Если DLAB=1, то можно обратиться к регистрам DIM, DLL в которых хранятся младший и старший байт делителя частоты :16.Если DLAB=0, то можно обратиться к регистрам THR,RBR,IER. MCR-регистр управления модемом (запись/чтение) Рис.22 Регистр MCR (Адрес=04h, RD/WR)         Этот регистр управляет интерфейсом модема или периферийным устройством. Бит 0. DTR(Serial Data Bits ID0)(Data Terminal Ready)- Этот бит управляет выходным сигналом DTR (Готовность терминала данных). Бит 1. RTS(Request To Send )- Этот бит управляет выходным сигналом RTS (Запрос на передачу). Бит 2. OUT1(OUT1 Bit Control) — Управление вспомогательным выходом OUT1. Бит 3. OUT2(OUT2 Bit Control) — Управление вспомогательным выходом OUT2. Бит 4. LOOP(Loopback Mode Enable)-Бит режима диагностики. Если LOOP=0, то UART работает в обычном режиме. Если LOOP=1, то URAT работет в режиме диагностики с обратной связью, в этом режиме используются вспомогательные сигналы OUT1 и OUT2. Бит 5..7. Зарезервированы. LSR -регистр состояния линии связи (запись/чтение) Рис.23 Регистр LSR (Адрес=05h, RD/WR)         Данный регистр показывает состояние приемопередатчика. Бит 0. DR(Receiver Data Ready) — Готовность данных приемника.DR=1 информирует о том, что данные приняты и загружены в регистр RBR или приемный буфер FIFO. Бит сбрасывается в ноль, когда все данные будут прочитаны CPU из регистра RBR или буфера FIFO. Бит 1. OE(Overrun Error) — Бит ошибки переполнения. Бит указывает, что данные в регистре RBR не были прочитаны CPU прежде, чем следующий символ был передан в RBR, что привело к потере предыдущего символа. Бит устанавливается в OE=1 после обнаружения ошибки переполнения и сбрасывать всякий раз, когда SPU читает содержание регистра LSR. Бит 2. PE(Parity Error) —Бит ошибки контрольного бита паритета.PE=1 если символ принят с ошибкой паритета. Бит 3. FE(Framing Error) — ошибка кадра (неверный стопбит). Бит 4. BD(Break Detected) — индикатор обрыва линии (вход приемника находится в состоянии 0 не менее чем время посылки символа). Бит 5. THRE(Transmitter Holding Register Empty) — регистр передатчика готов принять байт для передачи. В режиме FIFO указывает на отсутствие символов в FIFO-буфере передачи. Может являться источником прерывания. Бит 6. TEMPT(Transmitter Empty Status) — регистр передатчика пуст (нет данных для передачи ни в сдвиговом регистре, ни в буферных регистрах THR или FIFO). Бит 7. FIFOE(FIFO Error Status) —ошибка принятых данных в режиме FIFO (буфер содержит хотя бы один символ, принятый с ошибкой формата, паритета или обрывом). В не FIFO-режиме всегда 0. MSR-регистр состояния модема Рис.24 Регистр MSR (Адрес=06h, RD/WR)         Этот регистр позволяет CPU контролировать текущее состояние линий управления модема или периферийного устройства. В дополнение к этому , четыре бита (0..3) регистра MSR контролируют изменения сигналов на входах CTS,RTS,RI,DCD микросхемы и вырабатывают прерывание микропроцессора. Бит 0. DCTS(Delta Clear To Send) — Изменение состояния сигнала CTS(очищен для передачи).Бит устанавливается в DCTS=1 при изменении сигнала CTS на входе микросхемы и сбрасывается при прочтении регистра MSR микропроцессором. При установке бита в 1 генерируется прерывание микропроцессора. Бит 1. DDSR(Delta Data Set Ready) — Изменение состояния сигнала DSR(установка данных готова).Бит устанавливается в DDSR=1 при изменении сигнала DSR на входе микросхемы и сбрасывается при прочтении регистра MSR микропроцессором. При установке бита в 1 генерируется прерывание микропроцессора. Бит 2. ТЕRI(Trailing Edge Of Ring Indicator) — Детектор заднего фронта сигнала RI(индикатор звонка). Бит устанавливается в TERI=1, когда сигнал на выводе микросхемы RI изменяет свой уровень с низкого на высокий. Бит сбрасывается в TERI=0 при прочтении регистра MSR микропроцессором. При установке бита в 1 генерируется прерывание микропроцессора. Бит 3. DDCD(Delta Data Carrier Detect) — Изменение состояния сигнала DCD(обнаружен носитель информации).Бит устанавливается в DDCD=1 при изменении сигнала DCD на входе микросхемы и сбрасывается при прочтении регистра MSR микропроцессором. При установке бита в 1 генерируется прерывание микропроцессора. Бит 4. CTS(Clear To Send) — Состояние линии CTS. Если CTS=1, то на вход CTS СОМ-порта подано напряжение +12в(сигнал CTS активен).Если CTS=0, то вход СОМ-порта подано напряжение -12В(сигнал CTS пассивен). В режиме диагностики этот бит эквивалентен биту RTS регистра MCR. Бит 5. DSR(Data Set Ready) — Состояние линии DSR. Если DSR=1, то на вход DSR СОМ-порта подано напряжение +12в(сигнал DSR активен).Если DSR=0, то вход СОМ-порта подано напряжение -12В(сигнал DSR пассивен). В режиме диагностики этот бит эквивалентен биту DTR регистра MCR. Бит 6. RI(Ring Indicator) — Состояние линии RI. Если RI=1, то на вход DSR СОМ-порта подано напряжение +12в(сигнал RI активен).Если RI=0, то вход СОМ-порта подано напряжение -12В(сигнал RI пассивен). В режиме диагностики этот бит эквивалентен биту OUT1 регистра MCR. Бит 7. DCD(Data Carrier Detect) — Состояние линии DCD. Если DCD=1, то на вход DCD СОМ-порта подано напряжение +12в(сигнал DCD активен).Если DCD=0, то вход СОМ-порта подано напряжение -12В(сигнал DCD пассивен). В режиме диагностики этот бит эквивалентен биту OUT2 регистра MCR. SCR-регистр временного хранения (чтение/запись) Рис.25 Регистр SCR (Адрес=07h, RD/WR)         Регистр временного хранения, на работу UART не влияет, предназначен для временного хранения данных (в UART i8250 отсутствует). 1.13 Диагностический режим работы UART.Режим диагностики UART позволяет проверить работоспособность СОМ-портов без подключения к ним периферийных устройств. Режим диагностики включается битом LOOP=1 регистра MCR.
Аппаратная «заглушка» позволяет передавать и сразу принимать данные СОМ-порта, без каких либо подключений к нему. В результате этого возможно проверить работу сдвигающего регистра, отработку системы прерываний и т.д.         §2 Программирование COM-порта.
2.1. Программирование в MS-DOS.    В MS-DOS программировать СОМ порты можно всем спектром программных средств: прямым кодом микропроцессора(assembler), функциями BIOS, средствами операционной системы, языками программирования высокого уровня. 2.1.1. Программирование СОМ-порта прямым кодом микропроцессора.    Перед записью байта данных в регистр передатчика необходимо убедиться в том, что регистр хранения передатчика свободен, то есть убедиться в том, что передача предыдущего символа завершена. Признаком того, что регистр передатчика свободен, является установленный бит 5(THRE=1) регистра состояния линии LSR. 1.1.2. Программирование СОМ-порта с помощью функций BIOS.    В BIOS имеются функции которые могут выполняться по команде программного прерывания микропроцессора INT 00h. INT 1Fh. Так как код этих функций находится в BIOS, то их выполнение возможно даже при отсутствии ОС на ПК. Рассмотрим функции BIOS которые применяются для работы с СОМ портом: Функции по прерыванию INT 14h     Программа обработчик этого прерывания, как мы уже говорили, находится в BIOS по вектору 14h. INT 14h AH=00h -инициализация СОМ порта.
DX: 0000h-COM1, 0001h-COM2, 0002h-COM3, 0003h-COM4
Пример вызова функции: После выполнения функция возвращает выходные параметры :
|