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

简介: <div class="bct fc05 fc11 nbw-blog ztag">接收程序:<br><div style="BORDER-BOTTOM: windowtext 0.5pt solid; BORDER-LEFT: windowtext 0.5pt solid; PADDING-BOTTOM: 4px; PADDING-LEFT: 5.4pt; WIDTH: 95%; PADDIN
接收程序:
#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*/

char ser_buffer[SERIAL_BUFF_SIZE]; /**/ /*/ the receive buffer*/

int ser_end = - 1 ,ser_start =- 1 ; /**/ /*/ indexes into receive buffer*/
int ser_ch, char_ready = 0 ; /**/ /*/ current character and ready flag*/
int old_int_mask; /**/ /*/ the old interrupt mask on the PIC*/
int open_port; /**/ /*/ the currently open port*/
int serial_lock = 0 ; /**/ /*/ serial ISR semaphore so the buffer*/
/**/ /*/ isn't altered will it is being written*/
/**/ /*/ to by the ISR*/


/**/ /*-------------写串口-----------------*/
void interrupt far Serial_Isr(__CPPARGS)
... {
serial_lock
= 1;
ser_ch
= inp(open_port + SER_RBF);
if (++ser_end > SERIAL_BUFF_SIZE-1)
ser_end
= 0;
ser_buffer[ser_end]
= ser_ch;

++char_ready;
outp(PIC_ICR,
0x20);
serial_lock
= 0;

}



int Ready_Serial()
... {
return(char_ready);

}


/**/ /*--------------读串口--------------*/

int Serial_Read()
... {
int ch;
while(serial_lock)...{}
if (ser_end != ser_start)
...{
if (++ser_start > SERIAL_BUFF_SIZE-1)
ser_start
= 0;
ch
= ser_buffer[ser_start];
printf(
"%x",ch);
if (char_ready > 0)
--char_ready;
return(ch);

}

else
return(0);

}


/**/ /*--------------写串口-----------------*/
Serial_Write(
char ch)
... {
while(!(inp(open_port + SER_LSR) & 0x20))...{}
asm cli
outp(open_port
+ SER_THR, ch);
asm sti
}


/**/ /*-----------初始化串口---------------*/
Open_Serial(
int port_base, int baud, int configuration)
... {
open_port
= port_base;
disable();
outp(port_base
+ SER_LCR, SER_DIV_LATCH_ON);
outp(port_base
+ SER_DLL, baud);
outp(port_base
+ SER_DLH, 0);
outp(port_base
+ SER_LCR, configuration);
outp(port_base
+ SER_MCR, SER_GP02);
outp(port_base
+ SER_IER, 1);
if (port_base == COM_1 || port_base==COM_3)
...{
Old_Isr
= _dos_getvect(INT_SER_PORT_0);
_dos_setvect(INT_SER_PORT_0, Serial_Isr);
printf(
" Opening Communications Channel Com Port #1/3... ");

}

else
...{
Old_Isr
= _dos_getvect(INT_SER_PORT_1);
_dos_setvect(INT_SER_PORT_1, Serial_Isr);
printf(
" Opening Communications Channel Com Port #2/4... ");
}

old_int_mask
= inp(PIC_IMR);
outp(PIC_IMR, (port_base
==COM_1) ? (old_int_mask & 0xEF) : (old_int_mask & 0xF7 ));
enable();
}

/**/ /*-------------关闭串口--------------*/
Close_Serial(
int port_base)
... {
outp(port_base
+ SER_MCR, 0);
outp(port_base
+ SER_IER, 0);
outp(PIC_IMR, old_int_mask );
if (port_base == COM_1)
...{
_dos_setvect(INT_SER_PORT_0, Old_Isr);
printf(
" Closing Communications Channel Com Port #1. ");
}

else
...{
_dos_setvect(INT_SER_PORT_1, Old_Isr);
printf(
" Closing Communications Channel Com Port #2. ");
}


}


/**/ /*-------------发送应用----------------*/

void main( int argc, char * argv[])
... {

char ch,press;
int done=0;
FILE
*fp;
argc
=2;
//argv[1]="c:/comfile.c";
if(argc<2)
...{
printf(
" Usage:display filename.wav!!!");
// exit(1);
}

if((fp=fopen(argv[1],"r+b"))==NULL)
...{
printf(
"cannot open the file ");
// exit(0);
}

fseek(fp,
0, SEEK_SET);
Open_Serial(COM_1,SER_BAUD_9600,SER_PARITY_EVEN
| SER_BITS_8 | SER_STOP_1);
printf(
"com:1;bps:9600;parity:even;bits:8;stop bit:1");
printf(
"press any key to begin sending");
getch();
//Serial_Write(''); //该语句可用于发送单个字符

while(!done&&ch != EOF) //发送文件开始
...{
ch
= fgetc(fp);
//if(ch==EOF) Serial_Write(27);
Serial_Write(ch);
delay(
30);
if (kbhit())
...{
press
=getch();
if (press==27)
...{
Serial_Write(
27);
done
=1;
}

}

}



Close_Serial(COM_1);
fclose(fp);
}
相关文章
|
3月前
|
Linux 索引 关系型数据库
Linux 终端命令之文件目录操作,对比Dos相关命令
Linux 终端命令之文件目录操作,对比Dos相关命令
79 0
Linux 终端命令之文件目录操作,对比Dos相关命令
|
Java 开发工具 知识图谱
java知识图谱+Java语言特点+常用dos命令+Java程序总结
java知识图谱+Java语言特点+常用dos命令+Java程序总结
105 0
|
IDE Java Shell
Java 跨平台运行机理:Dos 命令在桌面新建文件夹,并在其中编译、运行一段 Java 程序
Java 跨平台运行机理:Dos 命令在桌面新建文件夹,并在其中编译、运行一段 Java 程序
113 0
Java 跨平台运行机理:Dos 命令在桌面新建文件夹,并在其中编译、运行一段 Java 程序
|
编译器 Windows
PE文件学习--Dos头部
PE文件学习--Dos头部
156 0
|
IDE 开发工具 C++
Python命令行解析:IDE内点击Run运行代码直接得出结果、基于TF flags(或argparse、sys.argv)在Dos内命令行(一条命令)调用代码文件得出结果
Python命令行解析:IDE内点击Run运行代码直接得出结果、基于TF flags(或argparse、sys.argv)在Dos内命令行(一条命令)调用代码文件得出结果
|
编译器 开发工具 Windows