Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

COM порт под DOS. Вроде делаю все правильно, но не работает...

590
07 апреля 2010 года
Gigahard
223 / / 03.04.2006
Пытаюсь запустить COM порт в DOS, но ничего не происходит.

Вот простенький пример кода. В нем опущен процесс получения базового адреса порта.
Код:
unsigned char main()
{
    unsigned char* port=(unsigned char*)0x3F8; /* обращаемся к COM1 */
   
    /* Инициализируем порт */
    port[3]= 0x80;
    port[0]= 0x0C; /* Скорость 9600 */
    port[1]= 0x00;
    port[3]= 0x03; /* 8-бит/четность:нет/ 1 стоп-бит */

    /* В бесконечном цикле шлем символ 0xFF */
    for(;;)
    {
        /* Проверяем готовность к передаче */
        if(port[5] & 0x20)
            port[0]=0xFF;
    }
}
Вот. Запускал откомпилированую прогу на нескольких машинах, под виртуальной машиной с ДОСом, под чистым ДОСом, под виндой... Ни в одном случае на другом конце ничего не было принято. Не пойму, что не так?!
18K
07 апреля 2010 года
logree
102 / / 27.09.2008
так ведь адрес первого порта 0x40:0x3F8 а у вас сегмент не понятно чему равен

Код:
/* как бы Cи код */
#include <dos.h>
void main(void)
{
    unsigned int far * port=MK_FP(0x40,0x3F8);
   
    /* Инициализируем порт */
    port[3]= 0x80;
    port[0]= 0x0C; /* Скорость 9600 */
    port[1]= 0x00;
    port[3]= 0x03; /* 8-бит/четность:нет/ 1 стоп-бит */

    /* В бесконечном цикле шлем символ 0xFF */
    for(;;)
    {
        /* Проверяем готовность к передаче */
        if(port[5] & 0x20)
            port[0]=0xFF;
    }
}

PS. этот код ТЕОРЕТИЧЕСКИ рабочий
590
07 апреля 2010 года
Gigahard
223 / / 03.04.2006
Кажется разобрался... Адреса портов лежат в области ввода/вывода и для обращения к этим адресам нужно использовать не прямые обращения, а к примеру, макрокоманды типа inportb и outportb.
1.6K
11 апреля 2010 года
Vov4ick
476 / / 01.02.2007
Смотрите, например, книгу Ю.С.Лукач, А.Е.Сибиряков "АРХИТЕКТУРА ВВОДА-ВЫВОДА ПЕРСОНАЛЬНЫХ ЭВМ IBM PC". Там есть готовые процедуры. Есть и другие книги, и отдельные файлики. Я тоже кажется выкладывал на этом форуме достаточно полную документацию. Вообще по программированию последовательного порта в сети море документации, в том числе и на русском языке.
590
12 апреля 2010 года
Gigahard
223 / / 03.04.2006
Так, хорошо, с обращением к адресному пространству ввода-вывода через макрофункции типа inport и outport я разобрался. А реально ли на Си/Си++ через работу с адресами и указателями все это замутить?

К примеру вот таблица: http://www.pcguide.com/ref/mbsys/res/ioSummary-c.html

Если "железные адреса" лежат в своем сегменте, то какой адрес этого сегмента? 0x40, это сегмент памяти BIOS. Там можно лишь прочесть базовые адреса тех же COM портов.
А в какой сегмент нужно обратится по этим адресам?
1.8K
12 апреля 2010 года
LM(AL/M)
332 / / 20.12.2005
Цитата: Gigahard
...А реально ли на Си/Си++ через работу с адресами и указателями все это замутить? ...... Если "железные адреса" лежат в своем сегменте, то какой адрес этого сегмента?..


порты ввода вывода -- это не память и никакого сегмента у них нет, обращение к портам делается специальными инструкциями процессора (не mov) поэтому в Си и нужно использовать макрофункции типа inport и outport
теоретически можно было бы замутить отображение портов на адреса памяти -- в защищённом режиме с написанием спец.обраотчика искл-х ситуаций, но ведь речь идёт о чистом досе верно?

590
12 апреля 2010 года
Gigahard
223 / / 03.04.2006
Все понятно. Спасибо. Похоже на asm'е это команды in и out.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог