Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сборка Часть1 / avmis_labs / неразобрано / 503 / Лаб_СОМ / Голубович / COM
.CPP#include <stdio.h>
#include <conio.h>
#include <mem.h>
#include <string.h>
#include <dos.h>
typedef struct UART_MODE //UART_MODE mode - структура, описывающая
// протокол и режим работы порта
{
union
{
struct
{
unsigned lenght : 2;//длина символа
unsigned STOP : 1;//число стоп-битов
unsigned parityControl : 2;//контроль четности
unsigned parityStuck : 1;//фиксация четности
unsigned enableBreak : 1;//установка перерыва
unsigned portUse : 1;//загрузка регистра делителя
}statebyte;
unsigned char state;
}stateunion;
unsigned long speed;//скорость передачи данных
}UARTMODE;
//Эта функция считывает текущий режим асинхронного порта и
//записывает егов структуру с типом UART_MODE.
//UARTMODE *mode - указатель на структуру,описывающую протокол
//и режим работы порта;
//int port - номер асинхронного адаптера: 0 - COM1, 1 - COM2
void UARTGetState( UARTMODE *mode, int port )
{
unsigned long speed;
// Запоминаем режим адаптера
mode -> stateunion.state = ( char )inp( 0x3FB - 0x100 * port );
mode -> stateunion.statebyte.lenght = 2;
// Устанавливаем старший бит режима
// для считывания текушей скорости передачи
outp( 0x3FB - 0x100 * port, mode -> stateunion.state | 0x80 );
// Считываем значение регистра делителя
speed = inp( 0x3F9 - 0x100 * port );
speed = speed << 8;
speed += inp( 0x3F8 - 0x100 * port );
// Преобразуем его в боды//
mode -> speed = 115200 / speed;
// Восстанавливаем состояние адаптера
mode -> stateunion.statebyte.lenght = 2;
outp( 0x3FB - 0x100 * port, mode -> stateunion.state & 0x7F );
}
//Прочитав состояние адаптера, вы можете изменить нужные вам поля
//в структуре UART_MODE и вызвать функцию UARTinit()
//для изменения параметров адаптера:
//Эта функция инициализирует асинхронные адаптеры, задавая протокол
//обмена данными и скорость обмена данными.
//UARTMODE *mode - указатель на структуру,описывающую протокол
//и режим работы порта;
//int port - номер асинхронного адаптера: 0 - COM1, 1 - COM2
//int imask - значение для регистра маски прерываний
int UARTInit( UARTMODE *mode, int port, int mask )
{
unsigned div = 115200 / ( mode -> speed );
unsigned char state;
// Записываем значение делителя частоты
state = ( char )inp( 0x3FB - 0x100 * port );
outp( 0x3FB - 0x100 * port, state | 0x80 );
outp( 0x3F9 - 0x100 * port, ( div >> 8 ) & 0x00FF );//старший байт
outp( 0x3F8 - 0x100 * port, div & 0x00FF );// младший байт
// Записываем новое управляющее слово
mode -> stateunion.statebyte.lenght = 2;
outp( 0x3FB - 0x100 * port, mode -> stateunion.state & 0x7F );
// Устанавливаем регистр управления прерыванием
outp( 0x3F9 - 0x100 * port, mask );
return 0;
}
//Эта функция дожидается готовности приемника и вводит
//символ из асинхронного адаптера.
//int port - номер асинхронного адаптера: 0 - COM1, 1 - COM2
char UARTInPut( int port )
{
unsigned statusRegister, inpRegister;
statusRegister = 0x3FD - 0x100 * port;
inpRegister = statusRegister - 5;
while( ( inp( statusRegister ) & 1 ) == 0 );
return( inp( inpRegister ) );
}
//Эта функция дожидается готовности передатчика и посылает символ.
//char chr - посылаемый символ;
//int port - номер асинхронного адаптера: 0 - COM1, 1 - COM2
void UARTOutPut( char chr, int port )
{
unsigned statusRegister, outRegister;
statusRegister = 0x3FD - 0x100 * port;
outRegister = statusRegister - 5;
while( ( inp( statusRegister ) & 0x20 ) == 0 );
outp( outRegister, chr );
}
int main()
{
clrscr();
char buffer[ 256 ];
char chr;
int numRead;
int flagExit = 0;
int i;
int j;
int in,out,l=0;
UARTMODE mode;
memset( &mode, 0, sizeof( mode ) );
UARTGetState( &mode, 0 );
UARTInit( &mode, 0, 0x0F );
do
{
clrscr();
printf( "com in and out" );
fflush(stdin);
in=getch()-49;
out=getch()-49;
clrscr();
if((in!=1&&in!=0)||(out!=1&&out!=0))
{
printf( "error" );
getch();
}
}
while((in!=1&&in!=0)||(out!=1&&out!=0));
clrscr();
cprintf( "INPUT:\n " );
gotoxy( 1, 4 );
cprintf( "OUTPUT:" );
while( 1 )
{
gotoxy( 6, 2 );
if( flagExit == 1 )
break;
fflush( stdin );
gets( buffer );
gotoxy( 1, 5);
cprintf( "%80c", ' ' );
numRead = strlen( buffer );
if( !strcmp( buffer, "exit" ) && numRead == 4 )
flagExit = 1;
for( i = 0; i <=numRead; i++ )
{
UARTOutPut( buffer[ i ], in );////Write to COM1
gotoxy( i+5, 5 );
chr = UARTInPut( out ); // Read from COM2
printf( "%c", chr );
}
j=0;
gotoxy( j+5, 2 );
for(int j=0;j<=numRead;j++)
cprintf(" ");
}
return 0;
}