Я пытаюсь написать собственный драйвер для RS232. В ходе поиска я выяснил что микроконтроллером COM порта можно управлять инструкциями OUT и IN. Адреса портов я узнал в дисптчере задачь. COM1 3F8-3FE; COM2 2F8-2FE; но прежде чем пересылать или принимать данные надо сконфигурировать порт. Может кто знает какие байты надо пересылать для конфигурации порта?
как и всеми остальными девайсами компа. ну еще используется аппаратное проецирование памяти. ВОобще, если честно, то гугл рулит. НО ладно, так и быть: Код (Text): USHORT ComPorts[2] = { PORT_COM1_BASE, PORT_COM2_BASE }; BOOLEAN CheckComPortConnected( IN UCHAR ComPortNumber ) { UCHAR Read; for( int i=0; i<8; i++ ) { Read = KiInPort ( ComPorts[ComPortNumber] ); if( Read != 0xFF ) return TRUE; } return FALSE; } BOOLEAN InitializeComPort( IN UCHAR Port, IN ULONG Frequency ) { if( !CheckComPortConnected( Port ) ) { // // Port is not connected. // return FALSE; } USHORT Multiplier = (USHORT)(COMPORT_BASEFREQ / (16 * Frequency)); UCHAR Lcr = (1<<7); WRITE_COM(Port, 3, Lcr); WRITE_COM(Port, 0, Multiplier & 0xFF); WRITE_COM(Port, 0, Multiplier >> 8); // READY BR FixParity ParityCheck Stop Size Lcr = 7; // 0 0 0 00 1 11 WRITE_COM(Port, 3, Lcr); WRITE_COM(Port, 1, 0); return TRUE; } BOOLEAN ComPortGetByte( UCHAR ComPortPreferred, UCHAR* Byte ) { UCHAR t; if (GET_COMPORT_STATE(ComPortPreferred) & COMPORT_DATAREADY) { t = READ_COM (ComPortPreferred, 0); if (ARGUMENT_PRESENT(Byte)) { *Byte = t; } return 1; } if (GET_COMPORT_STATE(ComPortPreferred) & COMPORT_READER_ERROR) { return 0; } return 0; } VOID ComPortPutByte( UCHAR ComPortPreferred, UCHAR Byte ) { while( !(GET_COMPORT_STATE(ComPortPreferred) & COMPORT_READY_TO_WRITE) ) { Pause( 20 ); } WRITE_COM( ComPortPreferred, 0, Byte ); } Константы очевидны: Код (Text): #define PORT_COM1_BASE 0x3F8 #define PORT_COM2_BASE 0x2F8 // Reader states #define COMPORT_DATAREADY 0x01 #define COMPORT_OVERFLOW_READERR 0x02 #define COMPORT_PARITY_READERR 0x04 #define COMPORT_SYNCH_READERR 0x08 #define COMPORT_READER_ERROR \ (COMPORT_OVERFLOW_READERR | COMPORT_PARITY_READERR | COMPORT_SYNCH_READERR) #define COMPORT_READER (COMPORT_DATAREADY | COMPORT_READER_ERROR) // Writer states #define COMPORT_READY_TO_WRITE 0x20 #define COMPORT_WRITE_COMPLETED 0x40 #define COMPORT_WRITER (COMPORT_READY_TO_WRITE | COMPORT_WRITE_COMPLETED) #define READ_COM(N,OFS) KiInPort( ComPorts[N] + (OFS) ) #define WRITE_COM(N,OFS,V) KiOutPort( ComPorts[N] + (OFS), V ) #define GET_COMPORT_STATE(N) READ_COM( N, 5 ) #define COMPORT_BASEFREQ 1843200 Ну и как вызывать думаю ясно. InitializeComPort(0, 117500) например
Great Спасибо за пример. Ты не вкурсе где можно скачать документацию по системе команд других устройств? (Например контроллеру USB порта, команды на звуковую плату)
Google -> <название устройства> specification Полную доку по послед. порту, на русском языке я выкладывал на этом форуме, либо на коденете. Поиск по форуму рулит.