DOS下串口通信程序来传送文件的源代码
接收程序:
#include <dos.h>
#include <fstream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define RXD 0 //接收
#define TXD 0 //发送
#define LSB 0 //波特率调节低8位
#define MSB 1 //波特率调节高8位
#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
#define SER_BAUD_1200 96
#define SER_BAUD_2400 48
#define SER_BAUD_9600 0x0C
#define SER_BAUD_19200 6
#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*/
int port;
int ComNum;
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;
// printf("bufferin[%d]=%c",buffer[buffin]);
// getch();
}
else
buffin=temp;
};
unsigned char getb()//read a char from the recvbuf

...{
if(buffout!=buffin)

...{
if(++buffout==BUFFLEN)
buffout=0;
//printf("bufferout[%d]=%c",buffout,buffer[buffout]);
return(buffer[buffout]);
}
else
return(0xff);
};

/**//*unsigned char sender( unsigned char ch)
{

outportb(portaddr2+TXD,ch);
printf(" sender outportdata=%c ",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 configuration)

...{
disable();
outportb(portaddr+LCR,0x80);
outportb(portaddr+LSB,baud);
outportb(portaddr+MSB,0x00);
outportb(portaddr+LCR,configuration);
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)

...{
switch (port)

...{
case 0: portaddr=0x3F8; break;
case 1: portaddr=0x2F8; break;
case 2: portaddr=0x3E8; break;
case 3: portaddr=0x2E8; break;
}
portf=(port==0)?4:3;
};

void Int()

...{
unsigned char key,key2;
port=ComNum-1;
if(peek(0x40,port*2)==0)

...{
printf("have no special com . ");
exit(1);
}
else

...{
printf("The used port is :COM%d ",ComNum);
};
Getportaddr(port); // 得到串口地址
SerInit(SER_BAUD_9600,SER_PARITY_EVEN| SER_BITS_8 | SER_STOP_1); //初始化串口,设置波特率等
SerOpen();
do

...{

if(kbhit())

...{
key2=getch();

if(key2==27)...{ break;}

};
key=getb();
if(key!=0xff)

...{
printf("%x ",key);
FILE *fp;
fp=fopen("C:/Receivedata.dat","ab"); //可选择接收数据的存放文件路径和文件名
if(fp==NULL) printf("File open error!");
// fputc(key,fp);
fwrite(&key,sizeof(unsigned char),1,fp);
fclose(fp);

}

}while (key2!=27);
SerClose();


// printf("%d char has been received ",incount);
// printf("%d char has been sended ",outcount);
// printf(" sum=%d ",sum);
}

void main()//com1 receive

...{
printf("Please input the receive COMnum:(1~4) ");
cin>>ComNum;
printf("the current com set is:9600,even, data bits 8, stop 1,");
Int();

printf(" OVER ");
exit(0);
};
#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 COM_3 0x3E8
#define COM_4 0x2E8
#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*/
最后更新:2017-04-03 16:48:39 上一篇:
下一篇:































































































































































































































---------------
发送文件程序
















































