Скачиваний:
35
Добавлен:
15.09.2014
Размер:
4.81 Кб
Скачать
#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;
}