论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > C语言程序设计教程
Tag:新手,函数,指针,数据类型,对象,Turbo,入门,运算符,数组,结构,二级,,tc,游戏,试题,问答,编译,视频教程

TC中的串口编程

文章类别:C语言程序设计 | 发表日期:2008-9-24 14:36:17

/*==========================*/
/*本程序由sunny编写,如有传载*/
/*请注明http://sunny1979.icpcn.com */
/*或者http://tchome.icpcn.com  */
#include <dos.h>
#include <bios.h>
#include <stdio.h>
#include <math.h>
#include <conio.h>
#include <graphics.h>
#ifdef __cplusplus
    #define __CPPARGS ...
#else
    #define __CPPARGS
#endif
#define SER_RBF        0  
#define SER_THR        0  
#define SER_IER        1   
#define SER_IIR        2   
#define SER_LCR        3  
#define SER_MCR        4   
#define SER_LSR        5   
#define SER_MSR        6   
#define SER_DLL        0   
#define SER_DLH        1   

#define SER_BAUD_1200  96  
#define SER_BAUD_2400  48
#define SER_BAUD_9600  12
#define SER_BAUD_19200  6
#define SER_GP02        8    
#define COM_1           0x3F8
#define COM_2           0x2F8 /*/ base port address of port 1*/
#define SER_STOP_1      0     /*/ 1 stop bit per character*/
#define SER_STOP_2      4     /*/ 2 stop bits per character*/
#define SER_BITS_5      0     /*/ send 5 bit characters*/
#define SER_BITS_6      1     /*/ send 6 bit characters*/
#define SER_BITS_7      2     /*/ send 7 bit characters*/
#define SER_BITS_8      3     /*/ send 8 bit characters*/
#define SER_PARITY_NONE 0     /*/ no parity*/
#define SER_PARITY_ODD  8     /*/ odd parity*/
#define SER_PARITY_EVEN 24    /*/ even parity*/
#define SER_DIV_LATCH_ON 128  /*/ used to turn reg 0,1 into divisor latch*/
#define PIC_IMR    0x21   /*/ pic's interrupt mask reg.*/
#define PIC_ICR    0x20   /*/ pic's interupt control reg.*/
#define INT_SER_PORT_0    0x0C  /*/ port 0 interrupt com 1 & 3*/
#define INT_SER_PORT_1    0x0B  /*/ port 0 interrupt com 2 & 4*/
#define SERIAL_BUFF_SIZE 128    /*/ current size of circulating receive buffer*/

void interrupt far (*Old_Isr)(__CPPARGS);  /*/ holds old com port interrupt handler*/

char ser_buffer[SERIAL_BUFF_SIZE];  /*/ the receive buffer*/

int ser_end = -1,ser_start=-1;      /*/ indexes into receive buffer*/
int ser_ch, char_ready=0;           /*/ current character and ready flag*/
int old_int_mask;                   /*/ the old interrupt mask on the PIC*/
int open_port;                      /*/ the currently open port*/
int serial_lock = 0;                /*/ serial ISR semaphore so the buffer*/
        /*/ isn't altered will it is being written*/
                                    /*/ to by the ISR*/


/*-------------写串口-----------------*/  
void interrupt far Serial_Isr(__CPPARGS)
{
serial_lock = 1;
ser_ch = inp(open_port + SER_RBF);
if (++ser_end > SERIAL_BUFF_SIZE-1)
    ser_end = 0;
ser_buffer[ser_end] = ser_ch;

++char_ready;
outp(PIC_ICR,0x20);
serial_lock = 0;

}


int Ready_Serial()
{
return(char_ready);

}

/*--------------读串口--------------*/

int Serial_Read()
{
int ch;
while(serial_lock){}
if (ser_end != ser_start)
   {
   if (++ser_start > SERIAL_BUFF_SIZE-1)
       ser_start = 0;
   ch = ser_buffer[ser_start];
  if (char_ready > 0)
       --char_ready;
   return(ch);

   }
else
   return(0);

}

/*--------------写串口-----------------*/
Serial_Write(char ch)
{
while(!(inp(open_port + SER_LSR) & 0x20)){}
asm cli
outp(open_port + SER_THR, ch);
asm sti
}

/*-----------初始化串口---------------*/
Open_Serial(int port_base, int baud, int configuration)
{
open_port = port_base;
outp(port_base + SER_LCR, SER_DIV_LATCH_ON);
outp(port_base + SER_DLL, baud);
outp(port_base + SER_DLH, 0);
outp(port_base + SER_LCR, configuration);
outp(port_base + SER_MCR, SER_GP02);
outp(port_base + SER_IER, 1);
if (port_base == COM_1)
   {
   Old_Isr = _dos_getvect(INT_SER_PORT_0);
   _dos_setvect(INT_SER_PORT_0, Serial_Isr);
   printf("\nOpening Communications Channel Com Port #1...\n");

   }
else
   {
   Old_Isr = _dos_getvect(INT_SER_PORT_1);
   _dos_setvect(INT_SER_PORT_1, Serial_Isr);
   printf("\nOpening Communications Channel Com Port #2...\n");
   }
old_int_mask = inp(PIC_IMR);
outp(PIC_IMR, (port_base==COM_1) ? (old_int_mask & 0xEF) : (old_int_mask & 0xF7 ));
}
/*-------------关闭串口--------------*/
Close_Serial(int port_base)
{
outp(port_base + SER_MCR, 0);
outp(port_base + SER_IER, 0);
outp(PIC_IMR, old_int_mask );
if (port_base == COM_1)
   {
   _dos_setvect(INT_SER_PORT_0, Old_Isr);
   printf("\nClosing Communications Channel Com Port #1.\n");
   }
else
   {
   _dos_setvect(INT_SER_PORT_1, Old_Isr);
   printf("\nClosing Communications Channel Com Port #2.\n");
   }

}

/*-------------发送应用----------------*/

void main(int argc,char *argv[])
{

char ch,press;
int done=0;
FILE *fp;
argc=2;
argv[1]="test.cpp";
 if(argc<2)
 {
  printf("\nUsage:display filename.wav!!!");
  exit(0);
 }
 if((fp=fopen(argv[1],"r+b"))==NULL)
 {
  printf("cannot open the file\n");
  exit(0);
 }
fseek(fp, 0, SEEK_SET);
Open_Serial(COM_1,SER_BAUD_9600,SER_PARITY_NONE | SER_BITS_8 | SER_STOP_1);
printf("press any key to begin sending");
getch();
Serial_Write(' ');
while(!done&&ch != EOF)
     {
 ch = fgetc(fp);
 if(ch==EOF) Serial_Write(27);
 Serial_Write(ch);
 if (kbhit())
 {
  press=getch();
  if (press==27)
  {
   Serial_Write(27);
   done=1;
  }
 }
     } 
Close_Serial(COM_1);
fclose(fp);
}

上一篇:{技巧}C的数据库编程(2) 人气:4885
下一篇:{技巧}文本方式下菜单 人气:7307
视频教程列表
文章教程搜索
 
C语言程序设计推荐教程
C语言程序设计热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058