📄 rs 232.txt
字号:
#include "dos.h"
#include "stdlib.h"
#include "stdio.h"
#define PORT 0
void SendFile(char *fname); /* 发送文件*/
void Send(int s); /*发送一个字节*/
void SendFileName(char *fname); /*发送文件名*/
void ReceiveFile(); /*接收文件*/
void GetFileName(char *f); /*接收文件名*/
void InitPort(int port,unsigned char para); /*初始化端口*/
void SendPort(int port,char c); /*端口发送*/
int ReadPort(int port); /*读端口字节*/
int CheckState(int port); /*检查端口状态*/
int Receive(int port,int *G); /*接收一个字节*/
main(int argc,char *argv[])
{
if(argc<2)
{
printf("Please input R(receive) or S(sent) parametre:");
getch();
exit(1);
}
InitPort(PORT,231); /* 端口COM1 波特率9600bps,8位数据位,2位停止位,无奇偶校验*/
if(*argv[1]=='S'| *argv[1]=='s') /*检查选择的有效性*/
{
SendFile(argv[2]);
printf("begin to sendfile \n");
getch();
}
else if(*argv[1]=='R'|argv[1]=='r')
{
ReceiveFile();
printf("begin to receivefile \n");
getch();
}
else
{
printf("Error parament.Please input again.");
getch();
exit(1);
}
}
void SendFile(char *fname) /* 发送文件*/
{
FILE *fp;
int ch,s;
if((fp=fopen(fname,"rb"))==NULL)
{
printf("Can't open the file.\n");
exit(1);
}
SendFileName(fname);
do{
ch=(int)getc(fp);
if(ferror(fp))
{
printf("Error reading file.\n");
break;
}
s=ch%16; /*取文件中一个字节的低4位*/
Send(s);
s=ch/16; /*取文件中一个字节的高4位*/
Send(s);
}while(!feof(fp));
s=46; /*发送文件结束信息*/
Send(s);
Send(s);
fclose(fp);
}
void Send(s) /*发送一个字节*/
int s; /*strange here*/
{
int G;
SendPort(PORT,s);
G=ReadPort(PORT); /*等待握手信号*/
if(s!=G)
s=s+16;
do
{
SendPort(PORT,s);
G=ReadPort(PORT);/*等待握手信号*/
}while(s!=G);
}
void SendFileName(fname) /*发送文件名*/
char *fname;
{
int s,ch;
printf("Now transmit the file.Please wait...\n");
while(*fname)
{
ch=(int)fname++;
s=ch%16; /*取文件名中一个字节的低4位*/
Send(s);
s=ch/16;
Send(s); /*取文件名中一个字节的低4位*/
}
s=32; /*发送文件名结束标志*/
Send(s);
Send(s);
}
void ReceiveFile() /*接收文件*/
{
FILE *fp;
char ch;
int G1,G2,G3;
char fname[15];
GetFileName(fname);
printf("Receiving file %s.\n",fname);
remove(fname);
if((fp=fopen(fname,"wb"))==NULL)
{
printf("Can't open output file.\n");
exit(1);
}
/*循环为检测每次接受的数据是否为新数据,如果不是,*/
/*则用此次接收的数据覆盖上次接收的数据*/
G1=ReadPort(PORT);
G2=Receive(PORT,&G1);
do
{
G3=Receive(PORT,&G2);
ch=(char)(G1%16+G2*16);/*恢复分开的数据,组合高4位和低4位*/
putc(ch,fp);
if(ferror(fp))
{
printf("\nError writing file.\n");
exit(1);
}
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!=48);
printf("\nTransmit finished.\n");
fclose(fp);
}
int Receive(port,G) /*接收一个字节*/
int port,*G;
{
int GM;
SendPort(port,*G);
GM=ReadPort(port);
if(GM/16==0)
return GM;
else if(GM/16==1)
{
do{
*G=GM;
SendPort(port,GM);
GM=ReadPort(port);
}while(GM/16==1);
}
return GM;
}
void GetFileName(char *f) /*接收文件名*/
{
int G1,G2,G3;
char ch;
G1=ReadPort(PORT);
G2=ReadPort(PORT);
do{
G3=Receive(PORT,&G3);
ch=(char)(G1%16+G2/16);
*f=ch;
*f++;
G2=Receive(PORT,&G3);
G1=G3;
}while(G1/16!=32);
printf("File name transmit finished.\n");
getch();
}
void InitPort(port,para) /*初始化端口 */
int port;
unsigned char para;
{
union REGS reg;
reg.x.dx=port; /* dx为端口号 COM1 为0 COM2为1*/
reg.h.ah=0; /* ah为功能号 0号功能为通信端口初始化*/
reg.h.al=para; /* al 为初始化参数 */
int86(0x14,®,®); /* ah=通信端口状态 al=调制解调器状态 */
}
void SendPort(port,c) /*端口发送一字符*/
int port;
char c;
{
union REGS reg;
reg.x.dx=port;
reg.h.al=c; /*向端口写c所代表的字符*/
reg.h.ah=1; /* 1 号功能为向通信端口写字符*/
int86(0x14,®,®); /*返回:AH的第7位=0,表示成功,AL内容不变;
AH的第7位=1,表示失败,AL的0 6位给出端口状态。*/
if(reg.h.ah&128)
{
printf("\nSend mistakes!");
exit(1);
}
}
int ReadPort(port) /*读端口一个字符*/
int port;
{
union REGS reg;
while(!(CheckState(port)&256))
{
if(kbhit())
{ /*如端口长期无数据可人为终止等待*/
printf("Press any key to exit.");
getch();
exit(1);
}
}
reg.x.dx=port;
reg.h.ah=2; /* 2 号功能为从通信端口读一字符*/
int86(0x14,®,®);
if(reg.h.ah&128)
{
printf("\nRead mistake!");
exit(1); /*返回:AH的第7 位=0,表示成功,AL=读入的字符;
AH的第7 位=1,表示失败,AL的0 ̄6位给出端口状态。*/
}
return reg.h.al;
}
int CheckState(port) /*检查端口状态*/
int port;
{
union REGS reg;
reg.x.dx=port;
reg.h.ah=3; /* 3 号功能为返回通信端口状态*/
int86(0x14,®,®); /*返回:AH=端口状态
AL=调制解调器状态 */
return reg.x.ax;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -