关闭

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

464人阅读 评论(0) 收藏 举报

学习串口通讯时在网上找到的例子,虽然不是很顺利,但总算在这个程序的基础上实现了发送和接受。
下面的代码可能不是最好,但是根据注释,理解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 
+ 30x80);

    
/*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 
+ 00x01);

    
/*Set Baud rate - divesor latch high byte*/  
    outportb(PORT1 
+ 10x00);  

    
/*8 bits,no parity ,1 stop bit*/  
    outportb(PORT1 
+ 30x03);  

    
/*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);  
}

 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:36928次
    • 积分:595
    • 等级:
    • 排名:千里之外
    • 原创:19篇
    • 转载:4篇
    • 译文:2篇
    • 评论:3条