CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

串口通讯

楼主hugf2000(★★★★★)2002-05-22 13:32:16 在 C/C++ / C语言 提问

请教如何用pc104实现波特率为115200,端口为com2程序,要求用tc3。0,实施同步数据接受、显示和保存为文件。急!谢谢  
  油箱为:hugf@chinaren.com 问题点数:80、回复次数:4Top

1 楼jerry921(jerry)回复于 2002-05-22 14:16:38 得分 80

我用bc3.1试过的。  
  #include   <dos.h>  
  #include   <iostream.h>  
  #include   <conio.h>  
  #include   <stdio.h>  
  #include   <stdlib.h>  
  #define   RXD   0  
  #define   TXD   0  
  #define   LSB   0  
  #define   MSB   1  
  #define   IER   1  
  #define   IIR   2  
  #define   LCR   3  
  #define   MCR   4  
  #define   LSR   5  
  #define   MSR   6  
  #define   IERV   1  
  #define   OUT2   0x08  
  #define   ERTS   2  
  #define   EDTR   1  
  #define   EMPTY   0X20  
  #define   READY   0X30  
  #define   ICREG   0X20  
  #define   IMASKREG   0X21  
  #define   EOI   0X20  
  #define   WAITCOUNT   5000  
  #define   BUFFLEN   2048  
  #define   ALTE   0X12  
  #define   ALTQ   0X10  
  int   port;  
  unsigned   portaddr;  
  unsigned   portf;  
  unsigned   int   baudtable[]={0x180,0xc0,0x60,0x30,0x18,0x0c,0x06};  
  unsigned   char   paritytable[]={0x08,0x18,0x00,0x28,0x38};  
  unsigned   char   buffer[BUFFLEN];//recv   buf  
  int   buffin=0;  
  int   buffout=0;  
  int   incount=0;  
  int   outcount=0;  
  void   interrupt(*vect_com)(...);  
  void   putb(unsigned   char   ch)//write   a   char   to   the   recvbuf  
  {  
  int   temp;  
  temp=buffin;  
  if(++buffin==BUFFLEN)  
  buffin=0;  
  if(buffin!=buffout)  
  buffer[buffin]=ch;  
  else  
  buffin=temp;  
  };  
  unsigned   char   getb()//read   a   char   from   the   recvbuf  
  {  
  if(buffout!=buffin)  
  {  
  if(++buffout==BUFFLEN)  
  buffout=0;  
  return(buffer[buffout]);  
  }  
  else  
  return(0xff);  
  };  
  unsigned   char   sender(unsigned   char   ch)  
  {  
  /*  
  int   wait=0;  
  //get   the   line   ready   signal  
  for(wait=0;wait<WAITCOUNT;wait++)  
  if((inportb(portaddr+MSR)&READY)==READY)  
  break;  
  if(wait==WAITCOUNT)  
  return(0);  
  */  
  while(!(inportb(portaddr+LSR)&EMPTY));//get   the   place   ready   signal  
  outportb(portaddr+TXD,ch);  
  outcount++;  
  return(1);  
  };  
  void   interrupt   receiver(...)  
  {  
  unsigned   char   ch;  
  ch=inportb(portaddr+RXD);  
  putb(ch);  
  incount++;  
  outportb(ICREG,EOI);  
  };  
  void   SerInit(int   baud,int   datab,int   stopb,int   parity)  
  {  
  unsigned   char   lcr;  
  disable();  
  outportb(portaddr+LCR,0x80);  
  outportb(portaddr+LSB,baudtable[--baud]&0xFF);  
  outportb(portaddr+MSB,baudtable[baud]>>8);  
  lcr=paritytable[--parity];  
  lcr|=datab-5;  
  lcr|=(stopb-1)<<1;  
  outportb(portaddr+LCR,lcr);  
  enable();  
  };  
  void   SerOpen(void)  
  {  
  vect_com=getvect(portf+8);  
  disable();  
  inportb(portaddr+RXD);  
  inportb(portaddr+MSR);  
  inportb(portaddr+LSR);  
  inportb(portaddr+IIR);  
  outportb(portaddr+IER,IERV);  
  outportb(portaddr+MCR,OUT2|ERTS|EDTR);  
  outportb(IMASKREG,inportb(IMASKREG)&(~(1<<portf)));  
  setvect(portf+8,receiver);  
  enable();  
  };  
  void   SerClose(void)  
  {  
  disable();  
  outportb(portaddr+IER,0);  
  outportb(portaddr+MCR,0);  
  outportb(IMASKREG,inportb(IMASKREG)|(1<<portf));  
  enable();  
  setvect(portf+8,vect_com);  
  };  
  void   Getportaddr(int   port)  
  {  
  portaddr=peek(0X40,port*2);  
  portf=(port==0)?4:3;  
  };  
  void   CmdLineHelp()  
  {  
  printf("usage:   TERMINAL   com   baud   datab   stopb   parity\n");  
  printf("com:   1=COM1,2=COM2\n");  
  printf("baud:   1=300bps,2=600bps,3=1200bps,4=2400bps,5=4800bps,6=9600bps,7=19Kbps\n");  
  printf("datab(data   bits):5,6,7,8\n");  
  printf("stopb(stop   bits):1,2\n");  
  printf("parity:1=odd,2=even,3=none,4=mark,5=space\n\n");  
  };  
  int   CheckArgv(int   port,int   baud,int   datab,int   stopb,int     parity)  
  {  
  if(port<1||port>2)  
  return(1);  
  if(baud<1||baud>7)  
  return(1);  
  if(datab<5||datab>8)  
  return(1);  
  if(stopb<1||stopb>2)  
  return(1);  
  if(parity<1||parity>5)  
  return(1);  
  return(0);  
  };  
  void   main(int     argc,char   *argv[])  
  {  
  unsigned   char   key;  
  char   echoflag=0;  
  if(argc<6)  
  {  
  printf("指定的参数个数不正确.\n");  
  CmdLineHelp();  
  exit(1);  
  };  
  if(CheckArgv(atoi(argv[1]),atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5])))  
  {  
  printf("命令行参数不正确.\n");  
  CmdLineHelp();  
  exit(1);  
  };  
  port=atoi(argv[1])-1;  
  if(peek(0x40,port*2)==0)  
  {  
  printf("无指定的串行口.\n");  
  CmdLineHelp();  
  exit(1);  
  };  
  Getportaddr(port);  
  SerInit(atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5]));  
  SerOpen();  
  printf("ALT+E   显示开/关   ALT+Q   结束\n");  
  printf("OK\n");  
  while(1)  
  {  
  if(kbhit())  
  {  
  key=getch();  
  if(!key)  
  {  
  key=getch();  
  if(key==ALTE)  
  echoflag=~echoflag;  
  if(key==ALTQ)  
  break;  
  }  
  else  
  {  
  if(echoflag)  
  putch(key);  
  if(!sender(key))  
  printf("(Time   out!)");  
  };  
  };  
  key=getb();  
  if(key!=0xff)  
  putch(key);  
  if(key=='!'&&argc>=7)  
  {  
  FILE   *thandle;  
  printf("\nbegin   to   send     file   %s\n",argv[6]);  
  if((thandle=fopen(argv[6],"rb"))!=NULL)  
  {  
  int   mychar;  
  fseek(thandle,0,SEEK_SET);  
  while((mychar=fgetc(thandle))!=EOF)  
  {  
                                                                                  delay(1);  
  if(echoflag)  
  putch(mychar);  
  if(!sender(mychar))  
  printf("(Time   out!)");  
  }  
  }  
  fclose(thandle);  
  }  
  };  
  SerClose();  
  printf("%d   char   has   been   received\n",incount);  
  printf("%d   char   has   been   sended\n",outcount);  
  printf("\n\nOVER\n");  
  exit(0);  
  };  
  Top

2 楼javaxbenz(任逍遥)回复于 2002-05-22 14:45:40 得分 0

写的好啊Top

3 楼hugf2000(★★★★★)回复于 2002-05-22 21:27:13 得分 0

太好了,主会保佑你的,马上加分。我这就试试。我也用TC3编了一个,中断处理的,就是老出现中断和显示冲突,就一会死机了。而且用where(!kbhit())在中断等待时,程序执行一会就程序结束,我没有按任何键啊,痛苦!Top

4 楼junhong(奔狼)回复于 2002-05-22 21:31:20 得分 0

那里有关于c语言的通讯编程的资料?现谢谢了!Top

相关问题

  • 串口通讯!!!
  • 串口通讯
  • 串口通讯
  • 串口通讯?[Delphi]
  • spcomm串口通讯
  • PB串口通讯?
  • c# 串口通讯
  • vb.net串口通讯
  • Dos下串口通讯
  • unix下的串口通讯

关键词

  • buffin
  • buffout
  • bufflen
  • define
  • lcr
  • unsigned
  • wait
  • ch
  • buffer
  • temp

得分解答快速导航

  • 帖主:hugf2000
  • jerry921

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo