面就是用C语言编写控制串行口的程序.pdf
单片机串行口编程-推荐下载
一、实验目的 1、掌握单片机串行口的工作方式; 2、掌握片机串行口的编程方法。
二、实验内容 1、学习单片机串行口的工作方式、初始化以及应用等; 2、利用单片机串行口编写程序,利用串口助手工具通过 PC 机发送相应
信息,单片机串行口根据接收到的信息控制开发板上的 LED 灯按一定规 律工作。 要求: “#”指令开始标志,“*”指令结束标志。 根据接收到的指令 start—控制 LED 灯闪烁,闪烁频率 1Hz;pause—控制 LED 点亮;stop—控制 LED 熄灭。 测试串口正常工作的代码(通过串口接收一个字符,再发送回串口) #include <reg51.h> main() {
} //定时器中断 void Timer0() interrupt 1 {
TH0=(65536-50000)/256; TL0=(65536-50000)%256;
num ++; if(num==20) {
num=0; led=!led; } } //串行中断 void seri() interrupt 4 { //RI 接受中断标志 TI 发送中断标志 if(RI) {
TH1=0xf3; //设置定时器 1 的初值
TL1=0xf3; SCON=0x50; //设置串行口方式 1,并允许接收
PCON=0x80; //SMOD=1
TR1=1;
while(1) {
while(RI==0); a=SBUF; RI=0;
SBUF=a; while(TI==0); TI=0; } }
unsigned char num; //定时 unsigned char start[]="#start*"; unsigned char stop[]="#stop*"; unsigned char pause[]="#pause*"; unsigned char startNum,stopNum,pauseNum; //初始化 void init() {
第7章 单片机C语言编程串行口通讯
7.3.3 串行口方式2和方式3
串行口工作在方式2和方式3均为每帧11 位异步通信格式,由TXD和RXD发送与接 收(两种方式操作是完全一样的,不同的 只是特波率)。 每帧11位:即1位起始位、8位数据位 (低位在前)、1位可编程的第9数据位和1 位停止位。 发送时,第9数据位(TB8)可以设置为 1或0,也可将奇偶位装入TB8; 接收时,第9数据位进入SCON的RB8。
7.2.2 与串行口有关的特殊功能寄存器
TB8(SCON.3):发送数据的第9位。
RB8(SCON.2):接收数据的第9位。
TI(SCON.1):发送中断标志。
RI(SCON.0):接收中断标志。
关于TI和RI:串行发送中断标志TI和接 收中断RI是同一个中断源,CPU事先不知道 是发送中断标志TI还是接收中断标志RI产生 的中断请求,所以,在全双工通信时,必须 由软件来判别。
SM2(SCON.5):多机通信控制位,在 方式2或3中使用。 REN(SCON.4):允许接收控制位,由 软件置1或清0。
7.2 MCS-51单片机的串行通讯接口
SFR:SCON串行接口控制器(98H) 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
SM0 SM1 SM2 REN TB8 RB8 TI
3执行proteus和串口调试助手745电路图功能分析串口调试助手通过rs232串口发送数据给单片机单片机接受数据后将该数据也通过rs232串口返发送给串口调试助75max487多机通信应用实例751设计要求用c语言编程在主从三个单片机中进行双机通信若从机显示数字和主机的数字一致则表示该从机在和主机通信中
振荡频率 32 (65536 ( RC AP2H, RC AP2L) )
单片机应用技术基础(C语言)-串行口通信技术
串行口通信技术
6.2.4 波特率设计计算与常用波特率 1. 波特率设计计算 在串行通信中,收发双方对发送或接收的数据速率要有
一定的约定,通过软件对串行口编程可约定4种工作方式。 其中方式0和方式2的波特率是固定的,而方式1和方式3的波 特率是可调的,由定时器的溢出率决定。
串行口通信技术
对方式1和方式3的波特率设计,实际上是通过对定时器 设计实现的。定时器1的溢出率取决于单片机定时器1的工作 方式和计数初值X。定时器1作波特率发生器使用时,通常 选用具有自动重装载初值功能的方式2,那么定时器每过 “256-X”个机器周期,定时器1就会产生一次溢出。定时 器1的溢出率可用以下公式表示:
1. 任务目的 了解51系列单片机串行口的结构,掌握其使用方法。 2. 任务要求 发送方向接收方发送数据,接收方接收数据并将数据在 P1口通过8个LED发光二极管以二进制形式显示出来。
串行口通信技术
3. 硬件电路 U1为发送方,U2为接收方,将双方的RXD(P3.0)和 TXD(P3.1)交叉互连即可,如图6.1所示。图中最小系统没有 画,本任务仅涉及单向通信,所以只需将发送方的TXD连 接至接收方的RXD即可。
串行口通信技术
异步通信中有两个重要指标:数据帧格式和波特率。 1) 数据帧格式 数据帧通常由起始位、数据位、奇偶校验位和停止位四 部分组成。 (1) 起始位:表示传送一个数据的开始,用低电平表示, 占一位。 (2) 数据位:要传送的数据的具体内容,典型的数据位 数是7位或8位,一般为7位(ASCII 码),数据从低位开始传 送。
串行口通信技术
2. 电源控制寄存器PCON PCON主要是为CHMOS型单片机的电源控制而设置的 专用寄存器,其字节地址为87H, 没有位寻址功能。 PCON的格式为
串行口的C51编程
5.2.1 工作方式0的C51程序设计
• 方式0是同步移位寄存器输入/输出。 • 格式:
1、方式0的波特率
• 在串口方式0下,每个机器周期产生一个 移位时钟,对应着一个比特数据的发送和接 收。因此,此时波特率固定为单片机振荡频 率的1/12,其波特率计算公式如下: • 串口方式0波特率=fosc/12 • 在串口方式0下,波特率不受波特率倍增 SMOD的影响。因此,在C51程序设计时只要 指定工作方式0便完成串口速率的设置,而无 需再设置波特率。
5.3 串行口的C51编程应用示例
• 【例5-9】串行口自发自收
• • • • • • • • • • •
#include<reg51.h> #define uchar unsigned char #define uint unsigned int void main( ) { uchar i=0x55; uint j=0; TMOD=0X20; //设定定时器1模式2 TL1=TH1=0XF4; PCON=0X00; SCON=0X50; TR1=1;
第5章 单片机串行口的C51编程
5.1 串行口基础知识 5.1.1 串行口的结构 5.1.2 有关的寄存器 5.1.3 串行口的工作方式 5. 2 不同工作方式下的C51编程 5.2.1 工作方式0的C51程序设计 5.2.2 工作方式1的C51程序设计 5.2.3 工作方式2的C51程序设计 5.2.4 工作方式3的C51程序设计 5.3 串行口的C51编程应用示例
3.方式0的数据接收及C51程序设计
• 对于方式0的数据接收,单片机的TXD引脚都 用于发送同步移位脉冲,而8位串行数据是通 过RXD引脚来输入。 • 在方式0下,C51程序可以按照如下的流程来 进行数据的接收: • ①首先,需要对寄存器SCON进行初始化,即 工作方式的设置。由于这里使用的是串行口 的方式0,允许接收,因此需将10H送入SCON, 即置R和TB8位都 不起作用,一般置0即可。
最新-C语言实现串行通信接口程序 精品
C语言实现串行通信接口程序摘要本文说明了异步串行通信-232的工作方式,探讨了查询和中断两种软件接口利弊,并给出两种方式的语言源程序。
的通道之一,以最简单方式组成的串行双工线路只需两条信号线和一条公共地线,因此串行通信既有线路简单的优点同时也有它的缺点,即通信速率无法同并行通信相比,实际上-232在标准条件下的最大通信速率仅为20。
尽管如此,大多数外设都提供了串行口接口,尤其在工业现场-232的应用更为常见。
及兼容机系列都有-232的适配器,操作系统也提供了编程接口,系统接口分为功能调用和功能调用两种21的03和04号功能调用为异步串行通信的接收和发送功能;而14有4组功能调用为串行通信服务,但和功能调用都需握手信号,需数根信号线连接或彼此间互相短接,最为不便的是两者均为查询方式,不提供中断功能,难以实现高效率的通信程序,为此本文采用直接访问串行口硬件端口地址的方式,用语言编写了串行通信查询和中断两种方式的接口程序。
1串行口工作原理微机串行通信采用-232标准,为单向不平衡传输方式,信号电平标准±12,负逻辑,即逻辑1表示为信号电平-12,逻辑0表示为信号电平+12,最大传送距离15米,最大传送速率196波特,其传送序列如图1,平时线路保持为1,传送数据开始时,先送起始位0,然后传8或7,6,5个数据位0,1,接着可传1位奇偶校验位,最后为1~2个停止位1,由此可见,传送一个字符7位,加上同步信号最少需9位数据位。
@@812300;图1@@串行通信的工作相当复杂,一般采用专用芯片来协调处理串行数据的发送接收,称为通用异步发送接收器,以节省的时间,提高程序运行效率,系列采用8250来处理串行通信。
在数据区中的头8个字节为4个的端口首地址,但只支持2个串行口1基地址00400000和2基地址00400002。
8250共有10个可编程的单字节寄存器,占用7个端口地址,复用地址通过读写操作和线路控制寄存器的第7位来区分。
C语言_串行口
RI
位地址 9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
SM2:多机通信控制位。 1--允许多机通信;0--不允许多机通信。
REN:允许串行接收位。它由软件置位或清零。 1--允许接收;0--禁止接收。
TB8:发送数据的第9位。 在方式2和方式3中,由软件置位或复位,可做奇偶校验位。
接收时,由REN置1,允许接收,串行口采样RXD,当采样 由1到0跳变时,确认是起始位“0”,开始接收一帧数据。当 RI=0,且停止位为1或SM2=0时,停止位进入RB8位,同时置中 断标志RI;否则信息将丢失。所以,方式1接收时,应先用软件 清除RI或SM2标志。
方式1所传送和接受的波特率取决于定时器1的溢出率和 PCON中的SMOD位。
在多机通信中,可作为区别地址帧或数据帧的标识位,一般约 定地址帧时,TB8为1,数据帧时,TB8为0。 RB8:接收数据的第9位。功能同TB8。
5.8051单片机的串行接口寄存器
(2)串行口控制寄存器——SCON SM0、SM1:串行口工作方式选择位。
SM0 SM1 00 01 10 11
工作方式 方式 0 方式1 方式2 方式 3
波特率 2SMOD T1溢出率 32
T1溢出率
1 T1定时时间
1 机器周期T T1计数次数X
12
1 (最大计数次数M-计数初值C)
12
fOSC (2n -C)
fOSC
波特率
2SMOD 32
2.3 8051串行口应 用的C编程
1.串行通信与并行通信
在微型计算机中,通信(数据交换)有两种方式:并 行通信和串行通信。
并行通信——是指计算机与I/O设备之间通过多条传输 线交换数据,数据的各位同时进行传送。
C语言实现串行通信接口程序
C语言实现串行通信接口程序串行通信是一种在计算机系统中进行数据传输的常见方式。
C语言提供了许多用于串行通信接口的库函数,如<termios.h>和<fcntl.h>等。
在本文中,我将介绍如何使用这些库函数来实现一个简单的串行通信接口程序。
首先,我们需要打开串行通信端口并进行初始化设置。
在<fcntl.h>中,有一个函数叫做open(,我们可以用它来打开串行端口。
例如,如果我们想打开/dev/ttyS0端口,可以使用以下代码:```cint fd = open("/dev/ttyS0", O_RDWR);if (fd == -1)perror("Error opening serial port");exit(1);```这里的O_RDWR表示我们将以读写模式打开串行端口。
如果打开串行端口失败,open(函数会返回-1,并通过perror(函数打印错误信息到标准错误输出。
在这种情况下,我们使用exit(1)来结束程序。
接下来,我们需要配置串行端口的通信参数。
在<termios.h>中,有一个结构体叫做termios,它包含了一些用于配置串行端口的参数。
我们可以使用tcgetattr(和tcsetattr(函数来获取和设置串行端口的参数。
```cstruct termios options;tcgetattr(fd, &options);//设置串行端口的通信参数cfsetispeed(&options, B9600); // 设置输入波特率为9600cfsetospeed(&options, B9600); // 设置输出波特率为9600options.c_cflag ,= CS8; // 设置数据位为8位options.c_cflag &= ~PARENB; // 禁用奇偶校验tcsetattr(fd, TCSANOW, &options);```在这个示例中,我们将波特率设置为9600,数据位设置为8位,并禁用了奇偶校验。
51单片机C语言应用开发实例精讲8结构实例6:单片机的串口通信
8. 结构实例6:单片机串口通信虽然那个流水灯游戏的可玩性和按键手感问题还值得再好好提升一下,但小月更希望调剂一下,转而开始了对手头烧写板上关于RS-232转换部分的学习。
小月的做法并不难以理解,毕竟与RS-232转换的相关电路在原理图中还是相当显眼的,甚至于他手头编程器的别名就是RS-232转换器。
图8.1 单片机中负责RS-232通讯的电路在烧写器一端与电脑连接的两个接头中,9针的RS-232接口就是串口通信线,而另一个USB口仅接通了+5V和GND,只有给烧写器供电的作用。
这样就可以知道,电脑可以通过RS-232对单片机的内部程序进行改写。
那么,这就意味着单片机与电脑间必然可以进行数据的交换,这种交换,就叫做通信。
所谓串口通信,就是指这种基于RS-232串口的通信方式。
RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。
最早是为使电脑通过电话线系统相互通信的调制解调器上而是设计的。
后来发展到连接鼠标或打印机上,目前已经被支持设备的即插即用和热插拔功能的USB所替代,但仍广泛的用于工业仪器仪表中,同时也是单片机最基础和最常见的通信方式。
不过要把“最基础和最常见”这两个最拆开来说,就要在后面加上“之一”了。
虽然目前的通信技术日新月异,但这种说法在今后很长一段时期内都是成立的,也正因为这样的特点,STC的51系列单片机都是默认通过RS-232方式进行烧写的。
作为两台设备之间进行的通信,必然需要共同遵守某种规定或规则,包括交流什么、怎样交流及何时交流。
这个规则就是通信协议。
RS-232通信中通信协议的原则就是串口按位(bit)发送和接收数据。
线路上,RS-232通信使用3根线完成,分别是地线、发送、接收。
端口能够在一根线上发送数据的同时在另一根线上接收数据,即全双工传输。
全双工传输是传输制式的一种分类方式中的一类,除此还有单工传输和半双工传输。
单工传输,是指消息只能单方向传输的工作方式。
串行口1编程的要点和步骤
串行口1编程的要点和步骤一、串行口1编程的基本概念串行口1是指计算机中的一个通信接口,它可以用来连接外设如打印机、调制解调器等,并通过串行通信协议进行数据传输。
在编程中,我们可以使用串行口1来实现计算机与外设之间的数据传输。
二、串行口1编程的步骤1. 打开串行口1在开始进行串行口1编程之前,我们需要先打开串行口1。
这可以通过访问计算机的端口地址来实现。
具体方法为:向端口地址0x3F8写入数值0x80,然后再向端口地址0x3FB写入数值0x03。
2. 配置波特率和数据格式在打开串行口1之后,我们需要对其进行配置,以确保数据能够正确地传输。
首先需要设置波特率,即数据传输速率。
这可以通过向端口地址0x3F8写入相应的数值来实现。
如果要设置波特率为9600,则需要向该地址写入数值0x01。
还需要设置数据格式,包括数据位、停止位和校验位等参数。
这些参数也可以通过向相应的端口地址写入数值来实现。
3. 发送数据在完成配置之后,就可以开始发送数据了。
这可以通过向端口地址0x3F8写入要发送的数据来实现。
需要注意的是,数据必须按照指定的数据格式进行发送,否则将无法正确接收。
4. 接收数据除了发送数据之外,我们还需要能够接收来自外设的数据。
这可以通过访问端口地址0x3FD来实现。
如果有数据传输过来,就可以从该端口地址读取相应的数值。
5. 关闭串行口1在完成所有操作之后,我们需要关闭串行口1以释放资源。
这可以通过向端口地址0x3F8写入数值0x00来实现。
三、串行口1编程的要点1. 端口地址:在进行串行口1编程时,需要访问计算机中特定的端口地址。
这些地址通常是预定义好的,具体取决于计算机硬件和操作系统等因素。
2. 波特率和数据格式:在配置串行口1时,需要设置波特率和数据格式等参数。
这些参数必须与外设相匹配才能确保数据正确传输。
3. 数据发送和接收:在进行串行通信时,需要注意正确地发送和接收数据。
如果格式不正确或者未按照协议进行操作,则可能会导致通信失败或者出现意想不到的错误。
面就是用C语言编写控制串行口的程序
面就是用C语言编写控制串行口的程序。
#include?"dos.h"#include?"stdlib.h"#include?"stdio.h"#define?PORT?0{if(argc<2){exit(1);}InitPort(PORT,231);if(*argv[1]==''''S'''')?/*检查选择的有效性*/ SendFile(argv[2]);else?if(*argv[1]==''''R'''')ReceiveFile();else{printf("Error?parament.Please?input?again."); exit(1);}}void?SendFile(char?*fname){FILE?*fp;int?ch,s;if((fp=fopen(fname,"rb"))==NULL) {exit(1);}do{if(ferror(fp)){break;}s=ch%16;?/*Send(s);s=ch/16;?/*Send(s);s=46;?/*发送文件结束信息*/ Send(s);Send(s);fclose(fp);}void?Send(s)int?s;{SendPort(PORT,s);G=ReadPort(PORT);?/*等待握手信号*/ if(s!=G)s=s+16;do{SendPort(PORT,s);G=ReadPort(PORT);/*等待握手信号*/ }while(s!=G);}char?*fname;{int?s,ch;s=ch%16;?/*Send(s);s=ch/16;Send(s);?/*}s=32;?/*Send(s);Send(s);}void?ReceiveFile(){FILE?*fp;char?ch;int?G1,G2,G3;char?fname[15];GetFileName(fname);remove(fname);if((fp=fopen(fname,"wb"))==NULL){printf("Can''''t?open?output?file.\n");exit(1);}/*循环为检测每次接受的数据是否为新数据,如果不是,*/ /*则用此次接收的数据覆盖上次接收的数据*/do{?putc(ch,fp);if(ferror(fp)){exit(1);}G1=G3;fclose(fp);}int?Receive(port,G)int?port,*G;{int?GM;SendPort(port,*G);GM=ReadPort(port);if(GM/16==0)else?if(GM/16==1){do{*G=GM;SendPort(port,GM);GM=ReadPort(port);}while(GM/16==1);}return?GM;}{char?ch;do{*f=ch;*f++;G1=G3;printf("File?name?transmit?finished.\n"); }void?InitPort(port,para)int?port;unsigned?char?para;{union?REGS?reg;int86(0x14,?,?);}void?SendPort(port,c)int?port;char?c;{union?REGS?reg;exit(1);}}int?port;{if(kbhit()){/*printf("Press?any?key?to?exit."); getch();exit(1);}}int86(0x14,?,?);printf("\nRead?mistake!"); exit(1);}}int?CheckState(port) int?port;{}。
运用C语言对串行口进行操作
运用C语言对串行口进行操作李金钟;赵欣;李敬民【摘要】通过运用C语言对串行口进行操作的应用与研究,现给出C语言对串行口的一系列操作方法,对于用C语言或其他语言对串行口进行操作的编程者,有重要的参考价值.【期刊名称】《唐山师范学院学报》【年(卷),期】2005(027)005【总页数】3页(P93-95)【关键词】串行口;C语言;指令【作者】李金钟;赵欣;李敬民【作者单位】唐山师范学院,物理系,河北,唐山,063000;唐山师范学院,物理系,河北,唐山,063000;唐山一中,河北,唐山,063000【正文语种】中文【中图分类】TP311C语言是当前最流行的程序设计语言,它像其它高级语言一样,面向用户,面向解题的过程,编程者不必熟悉具体的计算机内部结构和指令;C语言又像汇编语言一样,可以对机器硬件进行操作,如进行端口I/O操作、位操作、地址操作,并可内嵌汇编指令,将汇编指令当作它的语句一样。
我们知道,汇编语言将涉及计算机硬件,所以C语言又像低级语言一样,可以对计算机硬件进行控制,因此人们把它称为介于高级语言与低级语言之间的一种中级语言。
正是因为C语言具有这样的特性,所以很适合编写要对硬件进行操作的软件程序。
[1]通讯数据是从RS232串行接口读入的。
从串口读数,初始化是个关键。
下面把串行口通讯初始化程序语句做一详细分析。
1.1 数据接收采用查询方式1.2 数据接收采用中断方式2.1 串行口查询发送数据2.2 串行口查询接收数据PC机有两种类型的中断:由执行某些指令引起的软中断(也可以称为内中断)和接口设备引起的硬中断(也可以称为外中断)。
因此,串行口所引发的中断为硬中断。
3.1 注意事项对于硬中断,就要在相应的中断请求线(IRQi,i=0,1,…,7)产生一个由低到高的中断请求电平,这个过程必须由接口电路来实现,但是必须由程序控制来激励它产生这个电平,如发命令(outportb(口地址,命令))。
用C语言实现串口通信技术
第7卷 第2期 山东商业职业技术学院学报 V ol.7 N o.2 2007年4月 Journal of Shandong Institute of C ommerce and T echnology Apr.2007 用C 语言实现串口通信技术刘锡冬,黄丽民(山东商业职业技术学院计算机系,山东济南 250103) 摘 要: 简要介绍了串口和串口通信的基础知识,然后运用c 语言实现了串口通信和联机文件的传输,并详细阐述了其中的一些重要步骤。
使用c 语言实现串行通信连线简单,常用于对实时性要求不高的数据通信系统。
关键词: 串口通信;RS -232;奇偶校验;传输率;波特率中图分类号: TP311 文献标识码: A 文章编号: 1671-4385(2007)02-093-04To R ealize Serial Communication Technology by C LanguageLIU X i -dong ,HUANGLi -m in(Shandong Institute of C ommercial and T echnology ,Jinan 250103,China )Abstract : This paper mainly introduced the basic knowledge of serial communication ,and then realized serialcommunication and online file trans fer by C language ,and expound s ome im portant processes particularly .It is easy to op 2erate by C language which usually be used in s ome data communication systems that demand lower in Real -time.K ey w ords : serial communication ;RS -232;parity check ;trans fers rate ;baud rate收稿日期: 2006-10-20作者简介: 刘锡冬(1979-),女,山东烟台人,讲师。
单片机C语言-第6章串行口的C51编程3
• void t0int( ) interrupt 1
• { TH0=-50000/256; TL0=-50000%256;
• i=i-1;
• while(i==0)
• { i=20;
•
a=~a;
•
SBUF=a;
•}
•}
• 修改:将上述程序改为流水灯形式。
【例6-11】串行口自收自发
•
将51单片机的TXD接RXD,实现单片机
• TH1=256–fosc/(波特率×12×32/2SMOD) • =256-2SMOD×13 • 当SMOD=0时:TH1=256–13=243=0F3H。 • 当SMOD=1时:TH1=256–2×13=230=0E6H。
【例6-10】编程:高4位灯和低4位灯以1s 亮1s灭的频率进行闪烁。
行初始化,以设定其溢出率。
6.3.2 编程步骤
• (1)设定波特率
• 串行接口的波特率设定方式有两种:固守波特率和可 变波特率。当采用可变波特率时,应先确定T1的计数 初值,并对T1进行初始化。当采用固定波特率(工作 方式0和工作方式2)时,该步可以省略。
• (2)填写控制字
• 设定串行口控制寄存器SCON和波特率倍增控制寄存 器PCON。
• ④中断方式接收数据:等待中断、在中断中接 收一个数据。
•
两种方式中,发送与接收数据后都要将TI
或RI清零。
【例6-9】波特率计算及初始化编程
• 设某51单片机系统,其串行口工作于方式3,要 求传送波特率为1200。作为波特率发生器的定 时器T1工作在模式2时,请求出计数初值为多 少?设单片机的振荡频率为6MHz。 X=256-(2SMOD×fosc)/(384×波特率)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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);
2
一寸光阴不可轻
int s; { 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..."); 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;
一寸光阴不可轻
面就是用 C 语言编写控制串行口的程序。
#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:"); exit(1); } InitPort(PORT,231); if(*argv[1]==''''S'''') /*检查选择的有效性*/ SendFile(argv[2]); else if(*argv[1]==''''R'''') ReceiveFile(); else{ printf("Error parament.Please input again.");
3
一寸光阴不可轻
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."); exit(1); } G2=Receive(PORT,&G3); G1=G3; }while(G1/16!=48); printf("\nTransmit finished."); fclose(fp); } int 阴不可轻
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)