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;
}
}
COM порт под DOS. Вроде делаю все правильно, но не работает...
Вот простенький пример кода. В нем опущен процесс получения базового адреса порта.
Код:
Код:
/* как бы 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;
}
}
#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. этот код ТЕОРЕТИЧЕСКИ рабочий
Кажется разобрался... Адреса портов лежат в области ввода/вывода и для обращения к этим адресам нужно использовать не прямые обращения, а к примеру, макрокоманды типа inportb и outportb.
Смотрите, например, книгу Ю.С.Лукач, А.Е.Сибиряков "АРХИТЕКТУРА ВВОДА-ВЫВОДА ПЕРСОНАЛЬНЫХ ЭВМ IBM PC". Там есть готовые процедуры. Есть и другие книги, и отдельные файлики. Я тоже кажется выкладывал на этом форуме достаточно полную документацию. Вообще по программированию последовательного порта в сети море документации, в том числе и на русском языке.
К примеру вот таблица: http://www.pcguide.com/ref/mbsys/res/ioSummary-c.html
Если "железные адреса" лежат в своем сегменте, то какой адрес этого сегмента? 0x40, это сегмент памяти BIOS. Там можно лишь прочесть базовые адреса тех же COM портов.
А в какой сегмент нужно обратится по этим адресам?
Цитата: Gigahard
...А реально ли на Си/Си++ через работу с адресами и указателями все это замутить? ...... Если "железные адреса" лежат в своем сегменте, то какой адрес этого сегмента?..
порты ввода вывода -- это не память и никакого сегмента у них нет, обращение к портам делается специальными инструкциями процессора (не mov) поэтому в Си и нужно использовать макрофункции типа inport и outport
теоретически можно было бы замутить отображение портов на адреса памяти -- в защищённом режиме с написанием спец.обраотчика искл-х ситуаций, но ведь речь идёт о чистом досе верно?
Все понятно. Спасибо. Похоже на asm'е это команды in и out.