谁能用C语言编一个串口通信的程序,急!

dfsh 2001-11-20 11:09:49
谁能用C语言编一个串口通信的程序,急!重谢!
...全文
200 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ranata 2001-11-21
  • 打赏
  • 举报
回复
帮你上升!
zhaoweidf 2001-11-21
  • 打赏
  • 举报
回复
去中国工控网找找那上有
gigix 2001-11-21
  • 打赏
  • 举报
回复
找SCUM
jerry921 2001-11-21
  • 打赏
  • 举报
回复
dos下用bc3.1编译,慢慢看吧。
jerry921 2001-11-21
  • 打赏
  • 举报
回复
#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);
};


69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧