一个C串口通信程序

原创 2004年10月24日 17:23:00

#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <string.h>

#define COM232  0x2f8
#define COMINT  0x0b

#define MaxBufLen      500
#define Port8259       0x20
#define EofInt        0x20

static int  comportaddr;
static char intvectnum;
static unsigned char maskb;
static unsigned char Buffer[MaxBufLen];
static int  CharsInBuf,CircIn,CircOut;

static void (interrupt far *OldAsyncInt)();
static void interrupt far AsyncInt(void);

void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud,
       unsigned char Data, unsigned char Stop, unsigned char Parity)
{
 unsigned char High,Low;
 int f;

 comportaddr=ComPortAddr;
 intvectnum=IntVectNum;

 CharsInBuf=0;CircIn=0;CircOut=0;

 /* set baud rate */
 f=(Baud/100);
 f=1152/f; High=f/256;
 Low=f-High*256;
 outp(ComPortAddr+3,0x80);
 outp(ComPortAddr,Low);
 outp(ComPortAddr+1,High);

 /* set data bits,stop bits,and parity */
 Data=(Data-5)|((Stop-1)*4);
 if(Parity==2) Data=Data|0x18;
 else if(Parity==1) Data=Data|0x8;
 outp(ComPortAddr+3,Data);

 /* set MCR(DTR,RTS=0,OUT1,OUT2=1) */
 outp(ComPortAddr+4,0x0a);

 /* set input data ready interrupt mode */
 outp(ComPortAddr+1,0x01);

 /* set 0C interrupt vector */
 disable();
 OldAsyncInt=getvect( IntVectNum );
 setvect( IntVectNum, AsyncInt );
 enable();

 /* open interrupt */
 maskb=inp(Port8259+1);
 if(IntVectNum==0x0c)outp(Port8259+1,maskb&0xef); /*INT4*/
 else outp(Port8259+1,maskb&0xf7);               /*INT3*/
}

static void interrupt far AsyncInt(void)
{
 disable();

 if(CharsInBuf<MaxBufLen)
  Buffer[CircIn]=inp(comportaddr);
 if(CircIn<MaxBufLen-1) CircIn++;
 else CircIn=0;
 if(CircIn==CircOut) CircOut++;
 else CharsInBuf++;
 enable();
 outp(Port8259,EofInt);
}

void Restore(void)
{
 setvect(intvectnum,OldAsyncInt); /* restore old IRQ4 vector */
 outp(Port8259+1,maskb);  /* restore 8259 mask word */
}
int GetCharInBuf(unsigned char *Char)
{
 int Flag;

 Flag=-1;

 if(CharsInBuf>0)
  {
   (*Char)=Buffer[CircOut];
   if(CircOut<MaxBufLen-1)CircOut++;
   else CircOut=0;
   CharsInBuf--;
   Flag=0;
  }
   return Flag;
}

int SendChar(unsigned char Char)
{
 if((inp(comportaddr+5)&0x20)==0) return -1;
 outp(comportaddr,Char);
 return 0;
}

main()
{
 int i,c;
 unsigned char InChar;

 Init_COM(COM232,COMINT,1200,8,1,0);
 while(1)
  {
   if(kbhit())
     {if((InChar=getch())==27)break;
      else while(SendChar(InChar));
     }
   if(GetCharInBuf(&InChar)==0)  /* displaying input char */
      printf("%c",InChar);
 }
Restore();
}

C/C++串口通信原理及读写与操作

转自王柏元的博客:C/C++串口通信原理及读写与操作 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各...
  • u014729825
  • u014729825
  • 2015年12月18日 22:26
  • 21261

使用C语言操作串口

其实这并不是一件很难的事,在自己动手实验之前,我自然是知道现代操作系统都将设备看成文件来处理,这无疑降低了程序员操作硬件的难度,使用标准IO就可以操作硬件。我上网查了一下“windows C语言 串口...
  • codexy
  • codexy
  • 2010年03月17日 20:46
  • 18061

串口通信——接收串口数据并处理(C语言)

串口通信——接收串口数据并处理(C语言)
  • wangqingchuan92
  • wangqingchuan92
  • 2017年06月20日 13:53
  • 7214

用C#一步步写串口通信

用C#一步步写串口通信 标签: c#textboxbuttonobjectstring 2012-08-10 14:57 18916人阅读 评论(38) 收藏 举报  分类:...
  • kasama1953
  • kasama1953
  • 2016年05月17日 10:43
  • 56151

C_C++串口通信典型应用实例编程实践 源代码

  • 2012年11月03日 14:45
  • 11.9MB
  • 下载

树莓派c语言串口通讯程序

在网上搜了很多关于树莓派串口通讯的例子,但是都是用python写的,虽然python很有名,而且最近也在学习这门语言, 但是还是想用c语言实现一下,因为需要用到整套系统里,其他内容都是用c语言写的。...
  • realank
  • realank
  • 2014年12月08日 23:08
  • 4400

Win32 下 C/C++ 串口编程

与串口通信有关的API函数 HAN
  • ZJQLOVELYY
  • ZJQLOVELYY
  • 2014年06月01日 13:32
  • 4902

windows串口通信c(4)

comm port
  • J0KER
  • J0KER
  • 2017年12月07日 17:42
  • 141

实现Windows下异步串口通讯详解(C语言)

  • 2011年08月27日 19:23
  • 36KB
  • 下载

Windows API串口编程参考

 (一)Windows API串口通信编程概述Windows环境下的串口编程与DOS环境下的串口编程有很大不同。Windows环境下的编程的最大特征之一就是设备无关性,它通过设备驱动程序将Window...
  • zhaozidong86
  • zhaozidong86
  • 2010年09月14日 21:03
  • 11896
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个C串口通信程序
举报原因:
原因补充:

(最多只允许输入30个字)