/*头文件定义*/
#include <string.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <conio.H>
#define FALSE 0
#define TRUE 1
#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define COM1 0x3f8 /*Com1口地址*/
#define COM2 0x2f8 /*com2口地址*/
#define COM3 0x3E8 /*com3*/
#define COM4 0x2E8
#define BUFFERLEN 1024*20
#define INTR_ADD_13 0X0C /*COM1或COM3的中断处理程序的地址*/
#define INTR_ADD_24 0X0B /*COM2或COM4的中断处理程序的地址*/
/*函数声明*/
int Initialization();
void InitialPort(int* port,int* portCount);
void ReceiveChars(int portNum); /*处理函数接收字符*/
void ReceiveFile(); /*处理函数接收文件*/
void SendChars(int portNum);
void SendFile(int portNum);
int WorkModeInital();
int WorkModeSelect();
void Send_onechar(int port,char ch); /*查询方式发送一个字符*/
char Receive_onechar(int port); /*查询方式接收一个字符*/
int HasReceiveChar(int port); /*检测是否额字符到达*/
long getfilelength(FILE* fp); /*获取文件长度*/
void OpenPort_SQUE();/*以查询方式来打开串口*/
void OpenPort_INTR();/*以中断方式来打开串口*/
void ClosePort_SQUE();/*对应查询方式关闭串口*/
void ClosePort_INTR();/*对应中断方式关闭串口*/
void interrupt far (*Old_Isr)(__CPPARGS); /* 用来保存旧的中断处理例程*/
void interrupt far New_Isr(__CPPARGS); /*新的中断处理例程,主要用在接收文件,接收一个字符到缓冲区*/
/*定义全局变量*/
int COM_ADDRESS; /*COM口地址*/
int COM_NUM; /*COM口号*/
char Buffer[BUFFERLEN]; /*全局缓冲区*/
int buffend,buffstart,buffcount;/*计数器,buffend下个存储位置,buffstart读取的下个位置,buffcount有效字节数*/
int bufflock;/*全局互斥*/
long getfilelength(FILE* fp)
{
long i;
fseek(fp,0,SEEK_END);
i=ftell(fp);
rewind(fp);
return i;
}
void interrupt far New_Isr(__CPPARGS)
{
bufflock = 1;
Buffer[buffend] =inport(COM_ADDRESS);
buffend++;
if(buffend>BUFFERLEN-1)
buffend=0;
buffcount++;
outportb(0x20,0x20); /* 使中断程序结束后发送中断结束信号给8259*/
bufflock = 0;
}
void OpenPort_SQUE()
{
disable(); /*关闭中断*/
/*清空先前的状态,防止上次错误*/
inportb(COM_ADDRESS);
inportb(COM_ADDRESS+6);
inportb(COM_ADDRESS+3);
inportb(COM_ADDRESS+2);
outportb(COM_ADDRESS+1,0x0); /*不允许所有中断*/
outportb(COM_ADDRESS+4,0x07); /*设置MODEN的DTR,RTS衡有效状态,不允许发送中断信号*/
enable();
}
void OpenPort_INTR()
{
switch(COM_NUM)
{
case 1:
Old_Isr = getvect(INTR_ADD_13);
outportb(0x21,inport(0x21)&0xef);/*允许com13口中断*/
setvect(INTR_ADD_13,New_Isr); /*设置新的中断处理程序*/
break;
case 2:
Old_Isr = getvect(INTR_ADD_24);
outportb(0x21,inport(0x21)&0xf7);/*允许com24口中断*/
setvect(INTR_ADD_24,New_Isr);
break;
case 3:
Old_Isr = getvect(INTR_ADD_13);
outportb(0x21,inport(0x21)&0xef);/*允许com13口中断*/
setvect(INTR_ADD_13,New_Isr);
break;
case 4:
Old_Isr = getvect(INTR_ADD_24);
outportb(0x21,inport(0x21)&0xf7);/*允许com24口中断*/
setvect(INTR_ADD_24,New_Isr);
break;
}
disable(); /*关闭中断*/
/*清空先前的状态,防止上次错误*/
inportb(COM_ADDRESS);
inportb(COM_ADDRESS+6);
inportb(COM_ADDRESS+3);
inportb(COM_ADDRESS+2);
outportb(COM_ADDRESS+1,0x01); /*允许收到数据中断*/
outportb(COM_ADDRESS+4,0x0f); /*设置零MODEN衡有效状态,发送中断信号到总线*/
enable(); /*开中断*/
buffend = 0;
buffcount =0;
buffstart = 0;
}
void ClosePort_SQUE()/*对应查询方式关闭串口*/
{
outportb(COM_ADDRESS+1,0x00); /*不允许任何中断*/
outportb(COM_ADDRESS+4,0x00);
}
void ClosePort_INTR()/*对应中断方式关闭串口*/
{
disable();
outportb(COM_ADDRESS+1,0x00); /*不允许任何中断*/
outportb(COM_ADDRESS+4,0x00);
if(COM_NUM==1||COM_NUM==3)
{
outportb(0x21,inport(0x21)|0x10);/*不允许com13口中断*/
setvect(INTR_ADD_13,Old_Isr);
}
else
{
outportb(0x21,inport(0x21)|0x08);/*不允许com24口中断*/
setvect(INTR_ADD_24,Old_Isr);
}
enable();
}
int Initialization() /*程序初始化界面显示,返回用户的选择数字*/
{
int i;
int ch=0;
/*系统初始化*/
clrscr();
printf("********************************************************************\n");
printf(" PC Communication By Seriel Ports(Com) Utility\n");
printf("********************************************************************\n");
printf(" Write by:dujili Grade 05,Class 7,Sience college,GDUT\n");
printf("\t\t\t\t\t\tMade at:Jan 1st,2008.\n");
printf(" Any problem,Welcome to contact me!Email:dujili@tom.com\n");
for(i=1;i<3;i++) printf("\n");
printf("--------------------------------------------------------------------\n");
printf(" [1]Initialize Com ...\n");
printf(" [2]Exit Program!\n");
printf("--------------------------------------------------------------------\n");
printf("Enter your choice :");
scanf("%d",&ch);
return ch;
}/*Initialization*/
void InitialPort(int* port,int* portCount)
/*初始化Com口的用户交互界面,让用户选择Com口的工作方式,port 返回用户选择的端口*/
{
int portNum,baud,parity,databit,stopbit;/*端口号,波特率,奇偶校验,数据位,停止位*/
int ch=0;
int err=0; /*标记错误*/
char param=0; /*端口号,波特率,奇偶校验,数据位,停止位参数*/
/*系统初始化*/
clrscr();
printf("********************************************************************\n");
printf(" Com Work mode Setting\n");
printf("********************************************************************\n");
printf("Follow the Steps blow:\n\n");
/*设置端口号*/
do
{
if(err)
{printf("Port Number Input Error!\n");printf("Press any key to continue!");getch();}
printf("Select Work Comm Port Number:\n");
printf("\t[1]COM1\t[2]COM2\t[3]COM3\t[4]COM4\n");
printf("Which Com Port you want to use:(Input number):");
scanf("%d",&ch);
if(ch>4||ch<1) /*输入出错,重新输入*/
err=1;
else
err=0;
}while(err);
portNum=ch;
*portCount=ch; /*将端口号保存起来*/
/*设置波特率*/
do
{
if(err)
{printf("Baudary Select Error!\n");printf("Press any key to continue!");getch();}
printf("Select Work Baudary:\n");
printf("\t[1]19200[2]9600\t[3]7200\t[4]4800\n");
printf("Which Baud Rate you want to use:(Input number):");
scanf("%d",&ch);
if(!(ch==1 || ch==2||ch==3||ch==4)) /*输入出错,重新输入*/
err=1;
else
err=0;
}while(err);
baud=ch;
/*设置奇偶校验位*/
do
{
if(err)
{printf("Parity Set Error!\n");printf("Press any key to continue!");getch();}
printf("Select Parity mode:\n");
printf("\t[1]None\t[2]Odd\t[3]Even\n");
printf("Which parity mode you want to use:(Input number):");
scanf("%d",&ch);
if(!(ch==1 || ch==2||ch==3)) /*输入出错,重新输入*/
err=1;
else
err=0;
}while(err);
parity=ch;
/*设置数据位长度*/
do
{
if(err)
{printf("Data Bits Error!\n");printf("Press any key to continue!");getch();}
printf("Select Data Bits:\n");
printf("\t[1]8\t[2]7\t[3]6\t[4]5\n");
printf("How many Data Bits you want to use:(Input number):");
scanf("%d",&ch);
if(!(ch==1 || ch==2||ch==3||ch==4)) /*输入出错,重新输入*/
err=1;
else
err=0;
}while(err);
databit=ch;
/*�
串口通讯技术实现--两台pc机通过串口通讯(C语言)
5星 · 超过95%的资源 需积分: 11 91 浏览量
2008-12-30
12:55:50
上传
评论 8
收藏 32KB RAR 举报
flyeagledu
- 粉丝: 0
- 资源: 2
最新资源
- 基于Python的图像阴影检测与去除源码(高分期末大作业项目).zip
- 基于C++/Qt实现的井字棋游戏
- 基于 Python 编程语言的 Web 框架Django
- Python和Flask实现的基于体检数据的城市公共健康可视分析系统源码+使用说明.zip
- 基于python实现的华为智慧工地-安全帽检测
- buck-boost_2023-12-16_12-12-13.eprj
- 后端开发关于数据库和API开发的介绍
- 机器学习和数据挖掘课程设计-米其林餐厅数据挖掘管理系统源码+使用文档说明.zip
- html html html展示我与ai的对化
- 数据结构课程设计-全国交通出行咨询模拟系统C语言实现源码.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页