Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Программное обеспечение
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

COM-порт в CPU188

 Ответить Ответить
Автор
Сообщение
Phenix Смотреть выпадающим
Новичок
Новичок


Присоединился: 18 Апрель 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 30
Свойства публикации Свойства публикации   Ответить, цитируя автора - Phenix Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: COM-порт в CPU188
    Опубликовано: 31 Июль 2007 14:29

Добрый день всем участникам форума.

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

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

КЛИЕНТ

program client;
uses crt;
var
 sym:char;
begin
 {инициализация порта}
 asm
  push ax
  push dx
  mov dx,0
  mov ah,0
  mov al,$e3
  int $14
  pop dx
  pop ax
 end;
 {передача}
 while 1=1 do
  begin
   sym:=readkey;
   write(sym);
   {посылка байта}
   asm
    push ax
    push dx
    mov dx,0
    mov ah,1
    mov al,sym
    int $14
    pop dx
    pop ax
   end;
   {}
   if sym=#27 then break;
  end;
end.


СЕРВЕР

program server;
uses crt;
var
 sym:char;
begin
 DirectVideo:=false;
 {инициализация порта}
 asm
  push ax
  push dx
  mov dx,0
  mov ah,0
  mov al,$e3
  int $14
  pop dx
  pop ax
 end;
 {прием}
 while 1=1 do
  begin
   {прием байта}
   asm
    push ax
    push dx
    mov dx,0
    mov ah,2
    int $14
    mov sym,al
    pop dx
    pop ax
   end;
   {}
   if (sym<>#0) and (sym<>#255) then write(sym);
   if sym=#27 then break;
  end;
end.

Получается  ситуация,  что сервер не принимает то, что посылает клиент
ни  через  com1,  ни  через  com2.  Если  поменять их местами (сделать
клиентом CPU, а сервером компьютер) происходит то же самое. Подскажите пожалуйста, быть может я что-то делаю неправильно?

Параллельно  еще  один  вопрос. При инициализации com-порта (функция 0 или 80h прерывания   14h),   который   отмечен   перемычками  ST4  и  ST5  как используемый  для удаленной консоли, возвращается статус порта, равный FFh.  При  попытке инициализации порта, не используемого для удаленной консоли,  возвращается 60h. Правильно ли я понимаю, что порт удаленной консоли нельзя использовать для программирования?

Заранее спасибо

Наверх
Phenix Смотреть выпадающим
Новичок
Новичок


Присоединился: 18 Апрель 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 30
Свойства публикации Свойства публикации   Ответить, цитируя автора - Phenix Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 02 Август 2007 13:38

С передачей кажется разобрался, данные пошли. Хочу на всякий случай оставить на уточнение вопрос про консольный порт:

При инициализации com-порта (функция 0 или 80h прерывания 14h),   который отмечен перемычками ST4 и ST5 как используемый для удаленной консоли, возвращается статус порта, равный FFh. При попытке инициализации порта, не используемого для удаленной консоли, возвращается 60h. Правильно ли я понимаю, что порт удаленной консоли нельзя использовать для программирования?

Пояился еще один вопрос.

Устройство выполняет некоторые функции и параллельно слушает com-порт на наличие в нем данных. Если такие данные появились, программа должна их прочитать и обработать. А теперь вопрос - как определить момент начала передачи? Пока сделано следующим образом: программа выполняет свои функции, потом проверяет статус порта. Если установлен флаг наличия данных (бит 0 статуса порта), она начинает прием данных и их обработку. Однако первый байт может прийти, когда программа была занята выполнением своих действий (а это дело на 1-7 секунд в зависимости от разных условий). Будет ли пришедший байт ждать в порту или он по прошествии некоторого времени пропадет (мне показалось, что происходит именно так)? Если пропадет, то как можно сделать, чтобы он не пропал? Через обработчик прерывания от порта читать байты в буфер или можно сделать что-либо, не прибегая к обработке прерываний?

Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 02 Август 2007 20:39

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

Успехов.

С уважением, SAN

Наверх
Phenix Смотреть выпадающим
Новичок
Новичок


Присоединился: 18 Апрель 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 30
Свойства публикации Свойства публикации   Ответить, цитируя автора - Phenix Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 03 Август 2007 17:10
А нельзя ли обойтись без портов, а только средствами int 14h?
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 04 Август 2007 10:34

Можно, но медленно. К тому-же, с  int 14h  все-равно надо заполнять регистры. Так что, лучше работать прямо с регистрами - намного быстрее (с прерываниями BIOS никто и не работает - или-же прямо с регистрами, или более эффективные прерывания DOS). Прерывание int 14h может оказаться нужно, когда в какой-нибудь нестандартной урезанной операционке неизвестны адреса регистров.
Перед каждой записью и чтением надо читать состояние флагов, и не начинать пока флаги не встанут в нужное состояние - иначе заткнется.
И вообще, читать по опросу - очень тяжко. Это все-равно, что бегать в магазин за каждой отдельной каплей пива !  Процессор только тем и занят, что опрашивает регистры, на полезное дело времени не остается.

Другое дело - прерывания COM-порта по приему данных. Все полезное время можно посвятить своей программе, и по мере надобности черпать из буфера пачки байт. Это уже - пиво вам доставляют на дом, ящиками и бесплатно !
Конечно, чтобы достичь этого комфорта придется немного попотеть, разобраться с битами регистров, написать обработчик аппаратного прерывания и прочее. Сперва может и не получаться, но все преодолимо !  Все настоящие программы так и работают. К сведению, работа через сетевые протоколы - на порядок сложнее, и ничо - все кругом успешно действует.

Во всех случаях - и с опросом и с прерываниями, нужны буферы - без них не обойтись. Можете читать и по своему - через int 14h. Но не по одному байту, а складывать в буфер достаточного размера (следя за переполнением). Потом брать из буфера пачками. Так гораздо эффективнее. Прикиньте общую скорость прохождения данных, и возможность потери единичных данных - если устраивает, то пойдет и так.

Успехов.
С уважением, SAN

Наверх
AlexM Смотреть выпадающим
Действительный член
Действительный член
Аватар

Присоединился: 11 Октябрь 2003
Категория: Russian Federation
Online Status: Offline
Публикации: 392
Свойства публикации Свойства публикации   Ответить, цитируя автора - AlexM Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 06 Август 2007 06:40
Согласен с sanwork, а для примера, ну хотя бы вот это :66C27_RS232.rar
Наверх
 Ответить Ответить

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz