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

DOS下文件传送程序开发与调试
因PC/104系统只能装DOS且调试不便,作者利用现有资源整理串口程序,开发了DOS下的文件传送程序。该程序在短距离调试通过,但长距离或干扰大时无法保证传送正确,后续计划添加校验文件和传送整个文件夹的功能。

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

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

接收程序:

#include<dos.h>
#include
<fstream.h>
#include
<conio.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<math.h>
#defineRXD0//接收
#defineTXD0//发送
#defineLSB0//波特率调节低8位
#defineMSB1//波特率调节高8位
#defineIER1//中断起用寄存器
#defineIIR2//中断标识寄存器
#defineLCR3//线路控制寄存器
#defineMCR4//调制解调器控制寄存器
#defineLSR5//线路状态寄存器
#defineMSR6//调制解调器状态寄存器
#defineIERV1
#defineOUT20x08
#defineERTS2
#defineEDTR1
#defineEMPTY0X20
#defineREADY0X30
#defineICREG0X20
#defineIMASKREG0X21
#defineEOI0X20
#defineWAITCOUNT5000
#defineBUFFLEN2048//用于存储字符的数组的界
#defineALTE0X12
#defineALTQ0X10
#defineSER_BAUD_120096
#defineSER_BAUD_240048
#defineSER_BAUD_96000x0C
#defineSER_BAUD_192006
#defineSER_STOP_10/*/1stopbitpercharacter*/
#defineSER_STOP_24/*/2stopbitspercharacter*/
#defineSER_BITS_50/*/send5bitcharacters*/
#defineSER_BITS_61/*/send6bitcharacters*/
#defineSER_BITS_72/*/send7bitcharacters*/
#defineSER_BITS_83/*/send8bitcharacters*/
#defineSER_PARITY_NONE0/*/noparity*/
#defineSER_PARITY_ODD8/*/oddparity*/
#defineSER_PARITY_EVEN24/*/evenparity*/
intport;
intComNum;
unsignedportaddr;
unsignedportf;
unsigned
intbaudtable[]=...{0x180,0xc0,0x60,0x30,0x18,0x0c,0x06};
unsigned
charparitytable[]=...{0x08,0x18,0x00,0x28,0x38};
unsigned
charbuffer[BUFFLEN];//recvbuf
intbuffin=0;
intbuffout=0;
intincount=0;
intoutcount=0;
voidinterrupt(*vect_com)(...);


voidputb(unsignedcharch)//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
chargetb()//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);

};
*/

voidinterruptreceiver(...)
...{
unsigned
charch;
ch
=inportb(portaddr+RXD);
putb(ch);
incount
++;//记录接收了多少个数据。
outportb(ICREG,EOI);
}
;
voidSerInit(intbaud,intconfiguration)
...{
disable();
outportb(portaddr
+LCR,0x80);
outportb(portaddr
+LSB,baud);
outportb(portaddr
+MSB,0x00);
outportb(portaddr
+LCR,configuration);
enable();
}
;
voidSerOpen(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();
}
;
voidSerClose(void)
...{
disable();
outportb(portaddr
+IER,0);
outportb(portaddr
+MCR,0);
outportb(IMASKREG,inportb(IMASKREG)
|(1<<portf));
enable();
setvect(portf
+8,vect_com);
}
;
voidGetportaddr(intport)
...{
switch(port)
...{
case0:portaddr=0x3F8;break;
case1:portaddr=0x2F8;break;
case2:portaddr=0x3E8;break;
case3:portaddr=0x2E8;break;
}

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

voidInt()
...{
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);
}


voidmain()//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
#defineSER_RBF0
#defineSER_THR0
#defineSER_IER1
#defineSER_IIR2
#defineSER_LCR3
#defineSER_MCR4
#defineSER_LSR5
#defineSER_MSR6
#defineSER_DLL0
#defineSER_DLH1

#defineSER_BAUD_120096
#defineSER_BAUD_240048
#defineSER_BAUD_960012
#defineSER_BAUD_192006
#defineSER_GP028
#defineCOM_10x3F8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值