我们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;
unsignedintbaudtable[]=...{0x180,0xc0,0x60,0x30,0x18,0x0c,0x06};
unsignedcharparitytable[]=...{0x08,0x18,0x00,0x28,0x38};
unsignedcharbuffer[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;
};
unsignedchargetb()//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(...)
...{
unsignedcharch;
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()
...{
unsignedcharkey,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
DOS下文件传送程序开发与调试
因PC/104系统只能装DOS且调试不便,作者利用现有资源整理串口程序,开发了DOS下的文件传送程序。该程序在短距离调试通过,但长距离或干扰大时无法保证传送正确,后续计划添加校验文件和传送整个文件夹的功能。
3198

被折叠的 条评论
为什么被折叠?



