您的位置:首页 > 其它

COM通讯例子(MS-DOS, TC3.0编译)

2007-09-20 19:11 393 查看
学习串口通讯时在网上找到的例子,虽然不是很顺利,但总算在这个程序的基础上实现了发送和接受。
下面的代码可能不是最好,但是根据注释,理解COM口的初始化和通讯步骤是没有问题了。


#include <dos.h>


#include <stdio.h>


#include <conio.h>




#ifdef __cplusplus


#define __CPPARGS ...


#else


#define __CPPARGS


#endif




#define PORT1 0x3F8


#define INTVECT 0x0C




int bufferin = 0;


int bufferout = 0;


char ch;


char buffer[1025];




void interrupt(*oldportlisr)(__CPPARGS);




void interrupt PORTINT(__CPPARGS)




...{


int c;


do




...{


c = inportb(PORT1 + 5);




if (c & 1)




...{


buffer[bufferin] = inportb(PORT1);


bufferin++;




if(bufferin == 1024)




...{


bufferin = 0;


}


}




}while(c & 1);




outportb(0x20,0x20);


}




void main()




...{


int c;


FILE *fp;






/**//*clear Screen*/


clrscr();






/**//*turn off interrupt - Port1*/


outportb(PORT1 + 1,0);






/**//*save old interrupt Vector of later recovery*/


oldportlisr = getvect(INTVECT);






/**//*set interrupt vector entry*/


setvect(INTVECT,PORTINT);






/**//*PORT1 - Communication settings*/




/**//*SET DLAB ON*/


outportb(PORT1 + 3, 0x80);






/**//*Set Baud rate - divisor latch low byte*/




/**//*


0x01 = 115200 bps


0x02 = 57600 bps


0x06 = 19200 bps


0x0c = 9600 bps


0x18 = 4800 bps


0x30 = 2400 bps


*/


outport(PORT1 + 0, 0x01);






/**//*Set Baud rate - divesor latch high byte*/


outportb(PORT1 + 1, 0x00);






/**//*8 bits,no parity ,1 stop bit*/


outportb(PORT1 + 3, 0x03);






/**//*FIFO Control Register*/


outportb(PORT1 + 2,0xC7);






/**//*Turn on DTR,RTS,and OUT2*/


outportb(PORT1 + 4,0x0B);






/**//*Set programmable interrupt controller*/


outportb(0x21,(inportb(0x21) & 0xEF));






/**//*iNTERRUPT WHEN DATA RECEIVED*/


outportb(PORT1 + 1,0x01);




printf(" Sample Program.Press ESC to quit ");




fp = fopen("com.log", "wb");




do




...{


if(bufferin != bufferout)




...{


ch = buffer[bufferout];


bufferout++;


if(bufferout == 1024)




...{


bufferout = 0;


}


printf("%c",ch);


fwrite(&ch, 1,1, fp);


}




if(kbhit())




...{


c = getchar();


outportb(PORT1,c);


}


}while(c != 27);




fclose(fp);






/**//*Turn off interrupts - Port1*/


outportb(PORT1 + 1,0);






/**//*MASK IRQ using PIC*/




/**//*


COM1 (IRQ4) - 0X10


COM2 (IRQ3) - 0X08


COM3 (IRQ4) - 0X10


COM4 (IRQ3) - 0X08


*/


outportb(0x21,(inportb(0x21) | 0x10));






/**//*Restore old interrupt vector*/


setvect(INTVECT,oldportlisr);


}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: