DOS下串口通信程序来传送文件的源代码
#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 <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);
}
DOS下串口通信程序来传送文件的源代码的更多相关文章
- Qt编写串口通信程序全程图文解说
(说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...
- 转:Qt编写串口通信程序全程图文讲解
转载:http://blog.csdn.net/yafeilinux/article/details/4717706 作者:yafeilinux (说明:我们的编程环境是windows xp下,在Q ...
- linux下串口通信与管理
linux下的串口与windows有一些区别,下面将介绍一下linux下串口通信管理 查看是否支持USB串口: #lsmod | grep usbserial 如果没有信息:sudo apt-get ...
- Qt编写串口通信程序全程图文讲解 .
在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qex ...
- 【转】Qt编写串口通信程序全程图文讲解
本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...
- C语言PIC16 serial bootloader和C#语言bootloader PC端串口通信程序
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 新PIC16 Boot ...
- 创建C#串口通信程序详解
在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports.这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信.我们将使用标准 ...
- C#串口通信程序详解
C#串口通信程序详解 摘要:创建C#串口通信程序需要注意什么呢?创建C#串口通信程序的步骤是什么?那么本文就向你详细介绍创建C#串口通信程序集体的内容. 在.NET平台下创建C#串口通信程序,.NET ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
随机推荐
- vs2012编译在win7 32位电脑和win xp电脑上运行的win32程序遇到的问题记录
一.win7 32位电脑: vs2012编译的64位程序是没有问题的.但编译的32位程序在别的电脑(虚拟机模拟)出错: 感觉很无语,vs这么牛逼的东西,在设计时候都不考虑这些吗? 在自己电脑C:\Wi ...
- C#基础(七)虚函数
若一个实例方法声明前带有virtual关键字,那么这个方法就是虚方法.虚方法与非虚方法的最大不同是,虚方法的实现可以由派生类所取代,这种取代是通过方法的重写实现的(以后再讲)虚方法的特点:虚方法前不允 ...
- spring-boot 使用 main函数 无法启动的问题完美 解决方案。
首先 是启动之后 ,直接回exit code 0,网址 里面输入localhost:8080显示站点未启动.网上查 了多种 方式 ,日志 也 打了,都没发现问题,最后到这篇文章里 找到了答案.但是这 ...
- OS模块的常用内置方法
chdir 修改当前工作目录到指定目录 Change the current working directory to the specified path. chmod 修改一个文件的访问权限 Ch ...
- c#控制WPF程序自动登录(Automation方式实现)
说明:winForm窗体,可以通过win32接口dll的findWindow之类的函数来实现查找winform窗口,mfc窗口等. 但是wpf却是不实用这些,可以靠automation方式来进行操作. ...
- xBIM 应用与学习 (一)
目录 xBIM 应用与学习 (一) xBIM 应用与学习 (二) xBIM 基本的模型操作 xBIM 日志操作 XBIM 3D 墙壁案例 xBIM 格式之间转换 xBIM 使用Linq 来优化查询 x ...
- 读Ghost博客源码与自定义Ghost博客主题
我使用的Ghost博客一直使用者默认的Casper主题.我向来没怎么打理过自己博客,一方面认为自己不够专业,很难写出质量比较高的文字:另一方面认为博客太耗时间,很容易影响正常的工作内容.最近公司即将搬 ...
- BZOJ 1854: [Scoi2010]游戏 [连通分量 | 并查集 | 二分图匹配]
题意: 有$n \le 10^6$中物品,每种两个权值$\le 10^4$只能选一个,使得选出的所有权值从1递增,最大递增到多少 一开始想了一个奇怪的规定流量网络流+二分答案做法...然而我还不知道怎 ...
- 【视频编解码·学习笔记】7. 熵编码算法:基础知识 & 哈夫曼编码
一.熵编码概念: 熵越大越混乱 信息学中的熵: 用于度量消息的平均信息量,和信息的不确定性 越是随机的.前后不相关的信息,其熵越高 信源编码定理: 说明了香农熵越信源符号概率之间的关系 信息的熵为信源 ...
- Eclipse多平台编译(armeabi, armeabi-v7a, x86, mips)
Jni目录下新增Application.mk,加入 APP_ABI := armeabi armeabi-v7a x86 mips 上面的平台可加可减,全编的话可以写为 APP_ABI := all ...