我们PC/104系统只能装DOS,并且只有串口。平时调试很不方便,需要将电脑里的程序写到软盘,然后

再通过软盘复制到开发装置。可怜软驱还不争气,到现在已经坏了好多软盘了。而且调试间和办公室离得比较远。到了调试间软盘读不出来,很郁闷。

这些天任务不是很重,就利用现有资源把串口程序整理了一下。做了一个DOS下的文件传送程序。在短距离下调试通过,不过长距离或者现场干扰较大的话,就不能保证传送的正确了。毕竟程序里没有校验文件功能,等以后再加吧。以后还要加一个传送整个文件夹的功能。

抛砖引玉。

接收程序:

#include #include #include #include #include #include #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("\nsender outportdata=%c\n",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

enable();

};

void SerClose(void)

{

disable();

outportb(portaddr+IER,0);

outportb(portaddr+MCR,0);

outportb(IMASKREG,inportb(IMASKREG)|(1

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 .\n");

exit(1);

}

else

{

printf("The used port is :COM%d\n",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\t",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\n",incount);

// printf("%d char has been sended\n",outcount);

// printf("\nsum=%d \n",sum);

}

void main()//com1 receive

{

printf("Please input the receive COMnum:(1~4)\n");

cin>>ComNum;

printf("the current com set is:9600,even, data bits 8, stop 1,");

Int();

printf("\n\nOVER\n");

exit(0);

};

---------------

发送文件程序

#include #include #include #include #include #include #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   /*/ pics interrupt mask reg.*/

#define PIC_ICR    0x20   /*/ pics 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*/

/*/ isnt 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("\nOpening Communications Channel Com Port #1/3...\n");

}

else

{

Old_Isr = _dos_getvect(INT_SER_PORT_1);

_dos_setvect(INT_SER_PORT_1, Serial_Isr);

printf("\nOpening Communications Channel Com Port #2/4...\n");

}

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("\nClosing Communications Channel Com Port #1.\n");

}

else

{

_dos_setvect(INT_SER_PORT_1, Old_Isr);

printf("\nClosing Communications Channel Com Port #2.\n");

}

}

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

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("\nUsage:display filename.wav!!!");

// exit(1);

}

if((fp=fopen(argv[1],"r+b"))==NULL)

{

printf("cannot open the file\n");

// 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环境c语言写串口程序,DOS下串口通信程序来传送文件的源代码(转)相关推荐

  1. 51单片机c语言485通讯案例,485通讯协议程序怎么写(51单片机的485通信程序案例)...

    RS-485总线接口是一种常用的串口,具有网络连接方便.抗干扰性能好.传输距离远等优点.RS-485收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力,加上收发器具有高的灵敏度,能检测到低达20 ...

  2. 通讯rs232c语言编程,基于C51的RS232基本通信程序

    由于即将用到C#与单片机的通信程序,我回头使用了STC12系列的单片机,暂时停止AVR.因为AVR的编程器不属于RS232接口通信,弄起来麻烦.为了兼容性,我把程序的名称定义为和AVR里的名称一样,而 ...

  3. win10锁屏c语言,win10系统锁屏状态下运行任意程序设置的操作方法

    很多小伙伴都遇到过对win10系统锁屏状态下运行任意程序设置进行设置的困惑吧,一些朋友看过网上对win10系统锁屏状态下运行任意程序设置设置的零散处理方法,并没有完完全全明白win10系统锁屏状态下运 ...

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

    接收程序: #include < dos.h > #include <

  5. 帮我用c语言写一个求1000以内质数的程序

    很高兴为您服务!我可以为您编写一个用C语言求1000以内质数的程序,代码如下: #include<stdio.h> int main() { int n, i, j, flag; prin ...

  6. PHP充值怎么打折,教大家如何用PHP语言写一个简单的商品打折小程序!

    注:php是嵌套在html里面使用的,本文仅是商品打折小程序的代码 效果图: 代码:html> 宗波尘客php代码演示P17 请输入商品折扣价: 折扣: 九折 八折 七折 六折 五折 $Orig ...

  7. mac用什么写python程序_mac下的应用程序发布 及 打包(Python写的脚本,可打包第三方库)...

    其实这个问题在网上能搜到大把的解决方案.大家的统一答案都是 otool -L yourapp.app/Contents/MacOS/yourapp 根据输出信息在运行 install_name_too ...

  8. 用python写出瑞利衰落信道下的QPSK程序

    好的.瑞利衰落信道是一种电信信道模型,其中信号在传输过程中会受到衰落.QPSK (Quadrature Phase Shift Keying) 是一种相位移相键控方式,其中信号的相位会在四个状态之间移 ...

  9. 用C语言写一个通信软件,客户端可以实现文字聊天,文件传输,建立群聊;服务端可以创建账号吧...

    首先,需要为客户端和服务端分别编写代码,客户端的代码应该包括实现文字聊天.文件传输和建立群聊的功能,而服务端的代码则需要实现创建账号的功能.需要考虑到网络的安全性.客户端的用户体验以及服务端的可扩展性 ...

最新文章

  1. opencv各版本链接及opencv_contrib库各版本链接
  2. 机器视觉 · 立体相机
  3. PHP中获取当前页面的完整URL
  4. windows c语言 redis,windows上使用VS2012 C++语言调用Redis的解决方案
  5. python args kwargs 理解_*args和**kwargs在python中的作用
  6. linux下darknet指定opencv4编译安装
  7. [转载] arrayproxy转numpy_Python numpy.ptp() 使用实例
  8. Camera ISP与DSP的区别(二十五)
  9. ad如何设置pcb板子形状_FAQ031:如何将Altium的PCB板子导入CST
  10. 【智能制造】智能制造将势不可挡
  11. Apollo无人驾驶系统基础入门(云服务+感知(一))
  12. mysql分页查询如何优化_mysql分页查询优化
  13. Spring源码分析:Spring的循环依赖分析
  14. setup、erf、reactive
  15. EXCEL一个单元格内容分成多个单元格
  16. 智能停车场车牌识别计费系统
  17. 爬虫实战【12】使用cookie登陆豆瓣电影以及获取单个电影的所有短评
  18. 分销商城系统开发应用概述详解
  19. HTML设计简单的教务管理系统
  20. JZOJ 4745. 看电影

热门文章

  1. 在线版音乐播放器APP
  2. office2016每次弹激活_win10系统office2016激活后仍弹出激活怎么解决
  3. kubernetes节点维护命令——cordon, drain, uncordon
  4. 开发一个短信推送工具需要怎么做
  5. 通过SPSS使用命令语法实现快速删除变量的步骤
  6. 计算机语言类型和特点,计算机语言-计算机语言的特点
  7. 计算机博士5篇sci,研究员送5篇SCI论文给女博士 SCI论文到底是啥
  8. Win11关闭Windows Defender实时保护,暂时关闭和永久关闭方法 | Win10怎么永久关闭Windows Defender实时保护
  9. 97年Mekka ’97 4K Intro比赛的一等奖作品
  10. 开机后黑屏看不到桌面_电脑开机后不显示桌面图标怎么回事 电脑开机后不显示桌面图标解决办法大全!...