Алгоритм программирования COM-портов



Тема: Программирование COM -портов

Вопрос №1. Теоретические сведения о работе с коммуникационными портами порты контроллера ADAM5510М

Встроенные коммуникационные порты контроллера ADAM5510М

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

Порт СОМ1 поддерживает работу в режиме интерфейса RS232, а порт СОМ2 поддерживает работу в режиме интерфейса RS485.

       СОМ4 – порт с переключаемыми интерфейсами RS232/485.

Порт СОМ3 предназначен для осуществления загрузки в микроконтроллер управляющих программ. Кроме того, он может быть использован и как коммуникационный порт общего назначения с интерфейсом RS232.

 

 

Передача данных методом прерываний

Для обработки событий, происходящих асинхронно (то есть, время, отведенное для передачи данных, заранее не определяется) по отношению к выполнению программы (???именно в таком режиме происходит передача/прием данных через СОМ-порт) лучше всего подходит механизм прерываний. Прерывание можно рассматривать как некоторое особое событие в системе, требующее моментальной реакции.

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

Есть два типа прерываний: аппаратные и программные.

Аппаратные прерывания инициируются устройствами, подсоединенными к компьютеру (внутри или извне), такими как часы, дисковое устройство клавиатура или порты последовательной передачи данных.

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

 

Поскольку очевидно, что возможны самые разнообразные прерывания по самым различным причинам, то с прерыванием связывают уникальное число – так называемый номер (адрес) прерывания, с которым связана определенная подпрограмма. Тогда под прерываниями можно рассматривать процедуры, которые процессор вызывает для выполнения определенной задачи.

Когда вызывается прерывание, процессор приостанавливает выполнение текущей программы ("подвешивает" ее), считывает и загружает адрес программы обработки прерываний (сервисной программы прерываний,ISR) и выполняет прерывание, передавая ей управление.  После окончания ее работы управление передается основной программе, которая была прервана.

 

Для того, чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний. Из нее то при наступлении прерывания процессор и считывает адрес сервисной программы прерываний и выполняет последнюю. Элементы ТВП называются векторами прерываний.

В микроконтроллере ADAM 5510M используется только три типа прерываний, связанных  с работой СОМ –портов, они приведенные в таблице.

Назначение Номер (адрес)
Прерывание от порта СОМ1 0Ch
Прерывание от порта СОМ2 0Eh

Параметры передачи данных

Передача данных через последовательные порты ведется асинхронно. Поэтому на обоих концах линии передачи должен быть установлен ряд согласующих параметров. Эти параметры должны быть проинициализированы до начала процесса передачи данных:

  • скорость передачи данных в бодах ( bit / s ) "последовательного порта" равна числу битов, передаваемых в секунду. Скорость передачи данных в бодах, поддерживаемая операционной системой DOS 6.22 для контроллера ADAM 5510 – от 50 до 11520;
  • "длина слова" представляется числом битов, составляющих символ. Это значение может равняться 7 или 8;
  •  "четность" - это простой механизм обнаружения ошибок в линии передачи. Согласно стандартам, принятым в интерфейсах RS-232 для последовательной передачи данных, значением параметра четности может быть "четно" или " нечетно" (два способа проверки ошибок) или может не существовать проверки на четность;
  • "биты останова". Каждый символ отделяется от других битами, называемыми "битами останова". Можно задавать один или два бита останова.

Коммуникационный драйвер

Коммуникационный драйвер представляет собой ПО, обеспечивающее возможность прикладной программе взаимодействовать с COM-портом через ОС. Другими словами, КД позволяет обращаться к COM-порту не как к физическому, а как к логическому устройству (переменной), имеющему свой адрес.

 

 

 


Алгоритм программирования COM-портов

  1. Выполнить инициализацию регистров прерывания микропроцессора для работы с соответствующим портом и задать вектор прерывания для COM2 и COM3; либо установить коммуникационный драйвер для порта COM1 при работе с ADAM 5510.
  2. Определить для конкретного COM-порта параметры информационной посылки:
    • Количество бит данных;
    • Наличие бита четности;
    • Количество стоповых бит (бит останова).
  3. Установить значение скорости передачи данных (два устройства могут обмениваться данными только работая на одинаковых скоростях передачи данных)
  4. Организовать передачу данных.

Здесь надо иметь в виду следующее. ПО работает с данными, представленными в параллельном коде, а передача информации через СОМ-порт осуществляется в последовательном коде. Поэтому при программировании передачи данных необходимо:

4.1. Записать байт данных, представленных в параллельном коде в буфер (регистр данных) передатчика.

4.2. Организовать передачу информации, находящиеся в буфере передатчика уже в виде последовательного кода. Реально передача данных на контакте TX произойдет тогда, когда будет инициировано прерывание на передачу.

  1. Организовать прием данных.

 

Переданные в последовательном коде данные записываются в буфер приемника и накапливаются там до тех пор, пока не поступит сигнал о приходе последнего бита данных. После чего информация, но уже в виде данных в параллельном коде может использоваться приемником (например, станет значением некоторой переменной). В библиотеке функций Advantech для контроллера ADAM 5510М для программной реализации пп. 5 и 6 есть два типа функций, имеющих в названиях элементы _tx_ (передача данных) и _rx_(прием, чтение данных). Вызов процедур прерывания, отвечающих за извлечение данных из буфера передатчика и передачу их в буфер приемника заложен непосредственно внутри их, в связи с чем программист, пользующийся этими функциями избавлен от необходимости работать с прерываниями.

6. Перед обменом следующего пакета данных буфер приемника и передатчика должны быть очищены.

Вопрос №2 Коммуникационные функции библиотеки ADAM 5510 (COMM*.LIB)

               

       В соответствии с пунктами правила программирования COM-портов, в составе библиотеки функций ADAM 5510 имеются следующие функции.

 

1. Функция установки коммуникационного драйвера.

Com _ install ( )

Синтаксис:

int com_instal l(int portnum)

Параметр portnum – номер СОМ-порта. Для ADAM5510 значение параметра может иметь только значение 1.

Возвращаемое значение status:

0 – успешное завершение установки

1 – драйвер уже установлен

2 – недопустимый номер СОМ-порта

Пример.

void main(void)

{

status = com_install(1); /* Порт COM1 */

if (status == 0) printf("\n Драйвер для COM1 установлен

успешно");

else exit(0);

}

 

 

2. Функции инициализации регистров прерывания микропроцессора порта и задание вектора прерывания для работы RS485 (COM2) и RS232/485(COM4).

Com_485_install ()

Com_232_485_install ()

 

Синтаксис :  int com_485_install(void)

                      int com_232_485_install (void)

 

Возвращаемое значение имеет типinteger.

       Статус установки параметров:

0 – успешное завершение

1 – драйверы уже установлены

Пример:

void main()

{

 int status;

status = com_485_install();

if (status == 0)

printf("\n Установка параметров порта СОМ2 (RS9485)

завершена успешно!");

else

exit (0);

}

 

3. Функции установки формата передаваемых данных (информационной посылки), а именно, устанавливает для портов СОМ1, СОМ2 и СОМ4 соответственно параметры: количество бит данных, наличие бита четности, количество стоповых бит.

com_set_format ( ) для СОМ1

com_485_set_format( )  для СОМ2

com _232_485_ set _ format ( )  для СОМ4

Ниже приводится описание функции com_485_set_format( ), для двух других идентично.

Синтаксис :

void com_485_set_format(int data_length, int parity, int stop_bit)

ПАРАМЕТР    ОПИСАНИЕ
data_length           допустимый диапазон от 5 до 8 бит
parity  0 – отсутствие контроля по четности 1 – контроль на нечетность 2 – контроль на четность
stop_bit               1 – 1 стоповый бит 2 – 2 стоповых бита

 

       

 

Пример:

void main()

{

/* Установка формата данных для порта СОМ1: 8 бит данных, отсутствие контроля по четности, 1 стоповый бит */

com_set_format(8, 0, 1);

 

/* Установка формата данных для порта СОМ2 : 8 бит данных, отсутствие контроля по четности, 1 стоповый бит*/

 

com_485_set_format(8, 0, 1);

}

4. Функции устанавливают значения скорости передачи данных для портов СОМ1, СОМ2 и СОМ4 соответственно.

Com_set _ speed ( )  

Com_485_set_speed ( )

   com _232_485_ set _ speed ( )

Ниже приводится описание функции com_485_set_ speed(), для двух других описание идентично.

 

Синтаксис:

 void com_485_set_speed(unsigned long speed)

Параметр speed – значение скорости передачи

Пример:

void main(void)

{

com_set_speed(9600L);

com_485_set_speed(9600L);

/* Установка для СОМ1 и СОМ2 скорости передачи 9600 бит/с */

}

 

rx – receive ( приемник); tx – transmit ()передатчик

5. Функции получения очередного символа из буфера приема для порта СОМ1(RS-232) и ввод очередного символа из буферного регистра приема для портов СОМ2(RS-485) и  СОМ4.

Com _ rx( )

Com_485_rx ( )

Com _232_485_ _rx ( )

 

Синтаксис для com_485_rx ( ):                 char com_485_rx (void )

Аналогично для двух других.

Возвращаемым значением является код принятого символа. Если это символ NULL ('\0'), то значит буфер пуст.

 

Пример :

void main(void)

{

unsigned char COMdata;

COMdata = com_rx();

char C485data;

C485data = com_485_rx();

}

 

 

6. Функции передачи данных.

Com_ t x ( )

Com_485_tx ( )

 

Com _ tx ( )

Функция передачи одного символа через порт СОМ1. Символ помещается в регистр данных передатчика, если только тот свободен. Реально передача символа произойдет тогда, когда будет инициировано прерывание на передачу, и когда символ станет первым в очереди.

Синтаксис: void com_tx(char c), где с – символ для передачи

Пример.

void main(void)

{

com_tx(0x02); //0000 0010

com_tx(0x03);

}

 

 

6.2   com _485_ tx ( )

Функция передачи по линии Tx порта RS-485 одного символа, ожидание окончания передачи последнего бита символа и затем установка сигнала RTS??? в состояние OFF.

Синтаксис:

void com_485_tx (char c)

Параметр с – это символ для передачи.

Пример:

void main(void)

{

com_485_tx(0x03);

com_485_tx(`$');

}

 

7. Функции передачи последовательности символов.

Com_ t x _string ( )

Com_485_tx _string ( )

Com_485_232_tx _string ( )

Com_ t x _string ( )

Функция выполняет передачу последовательности символов путем повторного вызова функции com_tx().

Синтаксис: void com_tx_string(char *s), где параметр s – последовательность символов для передачи.

Пример.

unsigned char name [ ] = "ADAM5510";

void main(void)

{

com_tx_string(name);

}

 

 

Com _485_ t x _ string ( )

Функция выполняет передачу последовательности символов путем повторного вызова функции com_485_tx().

Пример.

void main()

{

com_485_tx_string("Это тест передачи строки символов.");

}

 

 

8.

Com_rx_empty ( ) ,

Com_tx_empty ( )

 

Com_485_rx_empty ( ) ,

Com_485_tx_empty ( )

Com_232_485_rx_empty ( ) ,

Com_232_485_tx_empty ( )

Функции, возвращающие статус очереди передатчика и очереди приемника портов СОМ1, СОМ2 и СОМ4 соответственно.

Синтаксис (аналогично для двух других):

int com_485_rx_empty (void)

int com_485_tx_empty (void)

Возвращаемым значением является TRUE, если очередь передатчика или приемника пуста (в буфере передатчика или приемника нет данных для передачи или приема).

Пример:

void main()

{

unsigned char data;

if (com_485_rx_empty() == FALSE)

data = com_485_rx();

}

 

Примечание для СОМ2 (RS485):

Для обслуживания передатчика порта СОМ2 (RS485) используется метод опроса, поэтому очередь передатчика всегда пуста

 

9.

Com_flush_rx ( ),

Com_flush_tx ( )

Com_485_flush_rx( ),

Com_485_flush_tx( )

Com_232_485_flush_rx( ),

com_232_485_flush_tx( )

 

Функции очистки буфера приема и буфера передачи СОМ1, СОМ2 и СОМ4 соответственно.

Синтаксис для функции порта СОМ2:

void com_485_flush_rx(void)

void com_485_flush_tx(void)

Пример:

void main()

{

com_485_flush_rx();

com_485_flush_tx();

}

 

Примечание: Для обслуживания передатчика порта СОМ2 (RS485) используется метод опроса. При этом буфер передатчика не используется (отключен).

Аналогично для пар двух других функций.

 


Дата добавления: 2019-02-13; просмотров: 719; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!