欢迎来到天天文库
浏览记录
ID:41033201
大小:60.00 KB
页数:5页
时间:2019-08-14
《dos下串口通信编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、中断向量表INT(Hex)IRQCommonUses080SystemTimer091Keyboard0A2Redirected0B3SerialComms.COM2/COM40C4SerialComms.COM1/COM30D5Reserved/SoundCard0E6FloppyDiskController0F7ParallelComms.708RealTimeClock719Reserved7210Reserved7311Reserved7412PS/2Mouse7513MathsCo-Processor7614HardDiskDrive7715Reserved
2、 通过编写COM对应的中断服务程序,我们也可以操作串口,涉及到的相关函数有: (1)设置中断向量表/*dos.h*/void_Cdeclsetvect(intinterruptno,voidinterrupt(*isr)()); 例如,COM3对应的中断号是4,那么对应中断向量表中的地址是0x0C,设置0x0C对应中断程序的函数为:setvect(0x0C,PORT1INT); 其中的中断服务程序PORT1INT为:voidinterruptPORT1INT(){ intc; do { c=inportb(PORT1+5); if(c&1) { buff
3、er[bufferin]=inportb(PORT1); bufferin++; if(bufferin==1024) bufferin=0; } } while(c&1); outportb(0x20,0x20);} 上述中断服务程序检查是否有字符可接收,其后将其通过inportb(PORT1)语句将其从UART中读出并放入输入buffer。持续的检查UART,以便能在一次中断里读取所有可获得的数据。 最后的"outportb(0x20,0x20);"语句告诉可编程中断控制器(ProgrammableInterruptController,PIC
4、)中断已经完成。 (2)读取中断向量表/*dos.h*/voidinterrupt(*_Cdeclgetvect(intinterruptno))(); 例如:oldport1isr=getvect(INTVECT); 其中的oldport1isr定义为:voidinterrupt(*oldport1isr)(); 我们融合setvect()函数、中断服务程序和getvect()函数,给出一个由CraigPeacock编写的完备例程:/*Name:SampleComm'sProgram-1024ByteBuffer-buff1024.c*//*WrittenBy
5、:CraigPeacock*/#include#include#include#definePORT10x3F8/*PortAddressGoesHere*/#defineINTVECT0x0C/*ComPort'sIRQhere(MustalsochangePICsetting)*//*DefinesSerialPortsBaseAddress*//*COM10x3F8*//*COM20x2F8*//*COM30x3E8*//*COM40x2E8*/intbufferin=
6、0;intbufferout=0;charch;charbuffer[1025];voidinterrupt(*oldport1isr)();voidinterruptPORT1INT()/*InterruptServiceRoutine(ISR)forPORT1*/{ intc; do { c=inportb(PORT1+5); if(c&1) { buffer[bufferin]=inportb(PORT1); bufferin++; if(bufferin==1024) { bufferin=0; } } } while(c&1)
7、; outportb(0x20,0x20);}voidmain(void){ intc; outportb(PORT1+1,0);/*Turnoffinterrupts-Port1*/ oldport1isr=getvect(INTVECT);/*SaveoldInterruptVectoroflater recovery*/ setvect(INTVECT,PORT1INT);/*SetInterruptVectorEntry*/ /*COM1-0x0C*/ /*COM2-0x0B*/ /*COM3-0x0C*/ /*COM4-0x0
此文档下载收益归作者所有