COM-порт в CPU188 |
Ответить |
Автор | |
Новичок Присоединился: 18 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 30 |
Опубликовано: 31 Июль 2007 14:29 |
Добрый день всем участникам форума. В данный момент разрабатываем одно устройство на базе CPU188, которое должно вести обмен данными с компьютером через COM-порт. Для передачи данных использую функции прерывания 14h. Программа пишется на Паскале. В качестве тестового примера были написаны две маленькие программки. Одна из них (назовем ее клиент), которая выполняется на компьютере, считывает символ с клавиатуры и посылает в порт. Вторая (назовем ее сервер), которая выполняется модулем CPU188, принимает символ и отображает его на экране. КЛИЕНТ program client;
program server; Получается ситуация, что сервер не принимает то, что посылает клиент Параллельно еще один вопрос. При инициализации com-порта (функция 0 или 80h прерывания 14h), который отмечен перемычками ST4 и ST5 как используемый для удаленной консоли, возвращается статус порта, равный FFh. При попытке инициализации порта, не используемого для удаленной консоли, возвращается 60h. Правильно ли я понимаю, что порт удаленной консоли нельзя использовать для программирования? Заранее спасибо |
|
Новичок Присоединился: 18 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 30 |
|
С передачей кажется разобрался, данные пошли. Хочу на всякий случай оставить на уточнение вопрос про консольный порт: При инициализации com-порта (функция 0 или 80h прерывания 14h), который отмечен перемычками ST4 и ST5 как используемый для удаленной консоли, возвращается статус порта, равный FFh. При попытке инициализации порта, не используемого для удаленной консоли, возвращается 60h. Правильно ли я понимаю, что порт удаленной консоли нельзя использовать для программирования? Пояился еще один вопрос. Устройство выполняет некоторые функции и параллельно слушает com-порт на наличие в нем данных. Если такие данные появились, программа должна их прочитать и обработать. А теперь вопрос - как определить момент начала передачи? Пока сделано следующим образом: программа выполняет свои функции, потом проверяет статус порта. Если установлен флаг наличия данных (бит 0 статуса порта), она начинает прием данных и их обработку. Однако первый байт может прийти, когда программа была занята выполнением своих действий (а это дело на 1-7 секунд в зависимости от разных условий). Будет ли пришедший байт ждать в порту или он по прошествии некоторого времени пропадет (мне показалось, что происходит именно так)? Если пропадет, то как можно сделать, чтобы он не пропал? Через обработчик прерывания от порта читать байты в буфер или можно сделать что-либо, не прибегая к обработке прерываний? |
|
Действительный член Присоединился: 08 Март 2006 Категория: Russian Federation Online Status: Offline Публикации: 440 |
|
Полноценная работа COM-порта делается через прерывания - особенно прием. Здесь расписывать - получится много (литературы предостаточно), скажу только основные моменты. Сперва надо внимательно настроить регистры, их 6 штук. Потом, данные из приемного регистра берутся не просто так, а через буфер, лучше всего кольцевой. Иногда требуется и двойная буферизация. Записью в буферы занимается обработчик прерывания. Создаются два указателя - записанных данных, и считанных данных, один бежит за другим, но не перебегает. Еще одно условие - общая средняя скорость чтения данных из буферов должна быть больше скорости записи, а то, понятно дело - переполнятся. Успехов. С уважением, SAN |
|
Новичок Присоединился: 18 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 30 |
|
А нельзя ли обойтись без портов, а только средствами int 14h?
|
|
Действительный член Присоединился: 08 Март 2006 Категория: Russian Federation Online Status: Offline Публикации: 440 |
|
Можно, но медленно. К тому-же, с int 14h все-равно надо заполнять регистры. Так что, лучше работать прямо с регистрами - намного быстрее (с прерываниями BIOS никто и не работает - или-же прямо с регистрами, или более эффективные прерывания DOS). Прерывание int 14h может оказаться нужно, когда в какой-нибудь нестандартной урезанной операционке неизвестны адреса регистров. Другое дело - прерывания COM-порта по приему данных. Все полезное время можно посвятить своей программе, и по мере надобности черпать из буфера пачки байт. Это уже - пиво вам доставляют на дом, ящиками и бесплатно ! Во всех случаях - и с опросом и с прерываниями, нужны буферы - без них не обойтись. Можете читать и по своему - через int 14h. Но не по одному байту, а складывать в буфер достаточного размера (следя за переполнением). Потом брать из буфера пачками. Так гораздо эффективнее. Прикиньте общую скорость прохождения данных, и возможность потери единичных данных - если устраивает, то пойдет и так. Успехов. |
|
Действительный член Присоединился: 11 Октябрь 2003 Категория: Russian Federation Online Status: Offline Публикации: 392 |
|
Согласен с sanwork, а для примера, ну хотя бы вот это :66C27_RS232.rar
|
|
Ответить |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |