DOS下串口通信程序来传送文件的源代码。

我们PC/104系统只能装DOS,并且只有串口。平时调试很不方便,需要将电脑里的程序写到软盘,然后
再通过软盘复制到开发装置。可怜软驱还不争气,到现在已经坏了好多软盘了。而且调试间和办公室离得比较远。到了调试间软盘读不出来,很郁闷。

这些天任务不是很重,就利用现有资源把串口程序整理了一下。做了一个DOS下的文件传送程序。在短距离下调试通过,不过长距离或者现场干扰较大的话,就不能保证传送的正确了。毕竟程序里没有校验文件功能,等以后再加吧。以后还要加一个传送整个文件夹的功能。
抛砖引玉。

接收程序:

#include < dos.h >
#include
< fstream.h >
#include
< conio.h >
#include
< stdio.h >
#include
< stdlib.h >
#include
< math.h >
#define RXD0 // 接收
#define TXD0 // 发送
#define LSB0 // 波特率调节低8位
#define MSB1 // 波特率调节高8位
#define IER1 // 中断起用寄存器
#define IIR2 // 中断标识寄存器
#define LCR3 // 线路控制寄存器
#define MCR4 // 调制解调器控制寄存器
#define LSR5 // 线路状态寄存器
#define MSR6 // 调制解调器状态寄存器
#define IERV1
#define OUT20x08
#define ERTS2
#define EDTR1
#define EMPTY0X20
#define READY0X30
#define ICREG0X20
#define IMASKREG0X21
#define EOI0X20
#define WAITCOUNT5000
#define BUFFLEN2048 // 用于存储字符的数组的界
#define ALTE0X12
#define ALTQ0X10
#define SER_BAUD_120096
#define SER_BAUD_240048
#define SER_BAUD_96000x0C
#define SER_BAUD_192006
#define SER_STOP_10/*/1stopbitpercharacter*/
#define SER_STOP_24/*/2stopbitspercharacter*/
#define SER_BITS_50/*/send5bitcharacters*/
#define SER_BITS_61/*/send6bitcharacters*/
#define SER_BITS_72/*/send7bitcharacters*/
#define SER_BITS_83/*/send8bitcharacters*/
#define SER_PARITY_NONE0/*/noparity*/
#define SER_PARITY_ODD8/*/oddparity*/
#define SER_PARITY_EVEN24/*/evenparity*/
int port;
int ComNum;
unsignedportaddr;
unsignedportf;
unsigned
int baudtable[] = ... {0x180,0xc0,0x60,0x30,0x18,0x0c,0x06} ;
unsigned
char paritytable[] = ... {0x08,0x18,0x00,0x28,0x38} ;
unsigned
char buffer[BUFFLEN]; // recvbuf
int buffin = 0 ;
int buffout = 0 ;
int incount = 0 ;
int outcount = 0 ;
void interrupt( * vect_com)(...);


void putb(unsigned char ch) // writeachartotherecvbuf将中断得到的数据写到缓冲区
... {
inttemp;
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() // readacharfromtherecvbuf
... {
if(buffout!=buffin)
...{
if(++buffout==BUFFLEN)
buffout
=0;
//printf("bufferout[%d]=%c",buffout,buffer[buffout]);
return(buffer[buffout]);
}

else
return(0xff);
}
;
/**/ /*unsignedcharsender(unsignedcharch)
{

outportb(portaddr2+TXD,ch);
printf(" senderoutportdata=%c ",ch);
outcount++;
return(1);

};
*/

void interruptreceiver(...)
... {
unsigned
charch;
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)
...{
case0:portaddr=0x3F8;break;
case1:portaddr=0x2F8;break;
case2:portaddr=0x3E8;break;
case3:portaddr=0x2E8;break;
}

portf
=(port==0)?4:3;
}
;

void Int()
... {
unsigned
charkey,key2;
port
=ComNum-1;
if(peek(0x40,port*2)==0)
...{
printf(
"havenospecialcom. ");
exit(
1);
}

else
...{
printf(
"Theusedportis: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("Fileopenerror!");
//fputc(key,fp);
fwrite(&key,sizeof(unsignedchar),1,fp);
fclose(fp);

}


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


//printf("%dcharhasbeenreceived ",incount);
//printf("%dcharhasbeensended ",outcount);
//printf(" sum=%d ",sum);
}


void main() // com1receive
... {
printf(
"PleaseinputthereceiveCOMnum:(1~4) ");
cin
>>ComNum;
printf(
"thecurrentcomsetis:9600,even,databits8,stop1,");
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_RBF0
#define SER_THR0
#define SER_IER1
#define SER_IIR2
#define SER_LCR3
#define SER_MCR4
#define SER_LSR5
#define SER_MSR6
#define SER_DLL0
#define SER_DLH1

#define SER_BAUD_120096
#define SER_BAUD_240048
#define SER_BAUD_960012
#define SER_BAUD_192006
#define SER_GP028
#define COM_10x3F8
<img al
分享到:
评论

你可能感兴趣的:(C++,c,C#,dos,FP)