毕业设计论文一个Linux下基于电话线路的数据通信程序的设计与实现.doc

上传人:sccc 文档编号:4860994 上传时间:2023-05-20 格式:DOC 页数:25 大小:354.52KB
返回 下载 相关 举报
毕业设计论文一个Linux下基于电话线路的数据通信程序的设计与实现.doc_第1页
第1页 / 共25页
毕业设计论文一个Linux下基于电话线路的数据通信程序的设计与实现.doc_第2页
第2页 / 共25页
毕业设计论文一个Linux下基于电话线路的数据通信程序的设计与实现.doc_第3页
第3页 / 共25页
毕业设计论文一个Linux下基于电话线路的数据通信程序的设计与实现.doc_第4页
第4页 / 共25页
毕业设计论文一个Linux下基于电话线路的数据通信程序的设计与实现.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《毕业设计论文一个Linux下基于电话线路的数据通信程序的设计与实现.doc》由会员分享,可在线阅读,更多相关《毕业设计论文一个Linux下基于电话线路的数据通信程序的设计与实现.doc(25页珍藏版)》请在三一办公上搜索。

1、一个Linux下基于电话线路的数据通信程序的设计与实现摘 要本设计基于Linux操作系统,控制本地MODEM通过电话线网向异地终端机所带MODEM拨号,并实现两台MODEM之间数据传输,达到两台计算机之间数据通信的目的。 MODEM与计算机RS-232串行端口相连,Linux通过POSIX termios接口控制计算机串行端口,方便实现了对计算机串行端口的设置和数据读写。计算机(DTE)与MODEM(DCE)之间数据交换,以及计算机对MODEM的控制,就是计算机对串行端口的读写。本文作者完成了对RS-232串行端的设置和读写操作,利用AT命令控制MODEM拨号,和一个文件传输协议,实现了两台P

2、C机利用MODEM通过公用电话网,传送和接收文件。本设计旨在使没有安装网络的用户,利用56K MODEM,通过电话线网方便和对方传输数据。相比较Internet网络,电话线网更安全,分布更广泛。本设计就是利用了电话线网的广泛性和安全性。关键词:Linux;串行端口;MODEMThe Design and Implementation of Data Transportation through Telephone Line in LinuxAbstractThe purpose of the design is to control the local MODEM to dial remote

3、 terminal by telephone line base on Linux operating system. At the same time,it can make the data transmit between two MODEMs to achieve the purpose of data transportation. the MODEM is connected to the computer through the serial port RS-232. Linux can control the serial port of the computer by POS

4、IX termios interface. That can carry out the setting and data reading/writing of the serial port, the data transmit between computers (DTE) and MODEM (DCE), and the control from the computer to the MODEM, namely, the reading/writing of the serial port from the computer. The author of this paper acco

5、mplishes the setting and reading/writing operation, using the AT commands to control the MODEM dialing, and a transport protocols for files. All of these make two PCs send and receive files from the public telephone line by using the MODEM. The design is intended to make the user who has not install

6、ed the network to transmit data with others by telephone lines using the 56k MODEM. Compared with the Internet, the telephone line is safer and widely distributed. The design makes use of the universality and the safety of the telephone line.Key words: Linux; serial port; MODEM目 录论文总页数:24页1引 言21.1设计

7、背景21.2本设计的意义21.3设计方法21.4理论依据22设计理论依据22.1Linux22.2串行端口简介22.2.1串行通迅22.2.2RS-232-C22.2.3异步通迅32.3MODEM简介42.3.1MODEM42.3.2AT命令43系统开发环境53.1系统开发环境53.2gcc简介54程序的设计64.1设计概要64.2RS-232-C建立与打开74.3串口设置与读写84.3.1c_cflag控制项设置84.3.2c_iflag、c_lflag和c_oflag设置94.3.3c_cc控制字符设置104.3.4读写串口114.4MODEM的控制124.4.1MODEM的两种工作状态1

8、24.4.2DTE与DCE的握手124.4.3MODEM拨号连接134.5文件传输协议的设计145编码实现165.1串口初始化实现165.2串口读写的实现175.3MODEM初始化的实现185.4MODEM状态读取的实现206程序测试206.1串口传输文件测试206.2MODEM拨号连接并传输数据测试21结 论21参考文献22致 谢23声 明24第 21 页 共24页1 引 言1.1 设计背景现在,随着计算机网络技术的发展,国民收入的提高,互联网走进了千家万户,但仍有很多计算机用户并没有安装宽带或其它网络设备。电话已经发展了一百多年,但互联网只出现了不到五十年,英特网所分布的范围远远比不上公用

9、电话网。1.2 本设计的意义如果想传送份文件给对方,却苦恼于无法上互联网,那么用MODEM通过电话线发送文件就变得非常有用处了。还有些特殊情况,当单位或工厂需要几台计算机之间数据共享时,进入互联网有安全隐患,配置局域网费用又很高,而且需要共享的数据很小,仅按字节计算,这时候利用MODEM通过公用电话网或电话专线传输数据,既经济,又安全,维护也非常简单。1.3 设计方法本设计基于Linux操作系统,用POSIX termios函数控制计算机串口,使用AT指令操作MODEM进行初始化及拨号连接,最后用一个自编的文件传输协议传输文件。整个程序使用C语言实现。此次设计之所以选择Linux,是因为Lin

10、ux有着丰富的应用程序和开发工具,可以支持各种硬件平台和外部设备;Linux又是完全开放的操作系统,很大程度上,Linux的开放性,赋予了其无穷的生命力。GCC的发展与Linux发展息息相关,相辅相承。所以在Linux平台的基础上,选用GCC编绎代码。AT指令做为MODEM的标准化语言,提供了丰富的MODEM初始化、拨号、挂机等等命令,AT命令简单的操作方式,使MODEM控制变得很方便。1.4 理论依据本次设计所需要的开发环境的搭建并不复杂,可是因为程序直接对计算机硬件进行操作,需要对RS-232串行端口有比较深入的了解,必须清楚各引脚电信号的作用,串口的工作方式,针对不同工作的方式,进行不同

11、的设置。MODEM的功能非常丰富,这给程序的实现也带来一定难度。通过完成本设计,既有助于深入了解计算机接口,又为硬件控制编程打下了一定基础,而且还能熟悉Linux程序设计。2 设计理论依据2.1 LinuxLinux操作系统核心最早是由芬兰的Linus Torvalds 1991年8月在芬兰赫尔辛基大学上学时发布的那年Torvals 25岁,后来经过众多世界顶尖的软件工程师的不断修改和完善,Linux得以在全球普及开来,在服务器领域及个人桌面版得到越来越多的应用,在嵌入式开发方面更是具有其它操作系统无可比拟的优势,并以每年100%的用户递增数量显示了Linux强大的力量。本设计中使用的POSI

12、X(UNIX可移植标准)终端控制函数,少量修改就可以运行于IRIX, HP-UX, SunOS, Solaris, Digital UNIX, Linux,和许多其它的类UNIX操作系统。在不同的类UNIX操作系统之间的最大差别是串口设备和锁定文件的名字。并且Linux支持各种体系结构的计算机,所以本设计虽然仅在个人PC机上实现,但它对于不同体系结构的计算机,或者不同的类UNIX操作系统,都有很好的可移植性。2.2 串行端口简介2.2.1 串行通迅计算机一次传输一位或多位的信息(数据),串行是指一次传输一位数据。串行通讯包括了大多数的网络设备、键盘、 麦克风,调制解调器和终端。当进行串行通讯时

13、,传送或接收的每个字(例如:字节或字符)是以每次一位传输的。 每位或者为on 或者 off。有时也能听到以mark 表示 on 状态和 space 表示 off 状态。串行数据的速度常表示为比特每秒 (bps) 或波特率 (波特)。这只是用于表示每秒能够传送的1和0的数量。追溯到计算机时代的早期,300波特被认为是很快的速度,但今天的计算机能够控制RS-232速度高达115,200波特!当波特率超过1,000,通常将看到速度被表示为千波特,或kbps (例如9.6k, 19.2k等等)。对于超过1,000,000的速度表示为兆波特,或者Mbps (例如1.5Mbps)。2.2.2 RS-232

14、-CRS-232-C是标准的串行通讯电气接口,是由美国EIA(电子工业联合会)与BELL等公司一起开发并于1969年公布的通信协议,这个标准对串行通信接口的有关问题,如信号线功能、电器特性都作了明确规定,它适合于数据传输速率在020 000bit/s范围内的通信。由于通信设备厂商都生产与RS-232-C制式兼容的通信设备,因此,它作为一种标准,目前已在微机通信中广泛采用,它不仅已被内置于每一台计算机,同时也已被内置于从微控制器到主机的多种类型的计算机及其相连接的设备。RS-232-C常用于连接到一个MODEM,其他拥有RS-232接口的设备包括打印机、数据采模块、测试装置和控制回路。另外,RS

15、-232也可以直接应用于任何类型计算机之间的简单连接。EIA-RS-232-C对电器特性、逻辑电平和各种信号线功能都作了规定。在TxD和RxD上:逻辑1(MARK) = -3V-15V。逻辑0(SPACE) = +3V+15V。在RTS、CTS、DSR、DTR和DCD等控制线上:信号有效(接通,ON状态,正电压) = +3V+15V。信号无效(断开,OFF状态,负电压) = -3V-15V。由于RS-232-C并未定义连接器的物理特性,因此,出现了DB-25、DB-15和DB-9各种类型的连接器,其引脚的定义也各不相同,现在最常见的是DB-9连接器。DB-9的信号引脚说明如表1所示:表1 RS

16、-232 各引脚含义RS-232 SignalsPin描述Pin描述1DCD - Data Carrier Detect6DSR - Data Set Ready2RXD - Received Data7RTS - Request To Send3TXD - Transmitted Data8CTS - Clear To Send4DTR - Data Terminal Ready9RI - Ring Detect5GND - Logic Ground还有其它两种常见的串行接口标准是RS-422和RS-574。RS-422使用低电压和微分信号,允许线缆长度到 1000英尺 (300米)。RS-

17、574定义了9-pin PC串行接口和电压。2.2.3 异步通迅为使计算机理解进入它的串行数据,它需要一些途径决定哪里是字符的开始和结束。这里仅讨论异步串行数据。在异步模式下,串行数据线保持在mark (1)状态,直到有字符传送。一位起始start 位、字符内容的每一位、一位可选的校验位、以及一位或一位半的终止位。起始位始终是一个 space (0),从而告诉计算机新的串行数据到来。数据能够在任何时候传送或接受,所以称做异步。图1 异步数据通讯 可选的校验是一个简单数据位的加和,表明了数据位包含偶数或奇数个1。如果是偶校验, 当在字符中的1是偶数个数时,校验位为0;如果是奇校验,当字符中的1是

18、奇数个时,校验位为0。其它常见的校验如space校验, mark校验, 和无校验。Space校验意味着校验始终为0,而mark校验意味着校验位始终为1。无校验意味校验不存在或不传输。余下的被称为停止位。这可以是1, 1.5, 或2位停止位在字符之间,始终是1。停止位原先是用来给计算机时间处理前面的字符的,但现在只是用来同步计算机和接收字符。异步数据格式通常表示为8N1, 7E1,诸如此类。它们相应地表示8位数据,无校验,1位停止和7位数据,偶校验,1位停止。2.3 MODEM简介2.3.1 MODEM目前最广泛使用的数据传输通道就是模拟电话线路。计算机所能处理的数字信号不能直接进入这样的模拟通

19、道,MODEM就是用来实现数字信号和模拟信号相互转换的设备。MODEM从发送方串行接收数据,然后经过调制,将数字信号转换为模拟信号,最后通过电话网络传送到接收方,然后接收方的MODEM将电话线上信号解调,将模拟信号转换为数字信号,然后进入计算机通道。即MODEM实现了计算机数据与模拟电话线路适合传输的模拟信号之间的相互转换。MODEM的分类和型号众多,为了方便Linux操作系统设置,本次设计选用外置56K MODEM。MODEM的工作过程如图2如示:DTE 模拟信号 数字信号 数字信号DTEMODEMMODEM图2 MODEM数模转换2.3.2 AT命令和其它通信标准一样,MODEM通信也有其

20、自己的一套规则和标准。Hayes公司的SmartMODEM系列产品已成为MODEM的事实上的标准,而几乎所有应用于计算机通信的MODEM均号称与Hayes SmartMODEM兼容。所谓Hayes兼容MODEM,主要是指它能识别并执行称为AT命令的某些命令和命令串。目前各厂家生产的MODEM除了可以执行最基本的Hayes命令集外,还有自己特有的命令。AT命令的建立使得DTE(Data Terminal Equipment,用于发送和接收数据的数据终端设备)从以上杂条中解脱出来,振铃检测、载波检测、速率选择等等都可以由MODEM来完成。此时TXD和RXD不仅仅是传输数据,还传送AT命令。DTE发

21、送AT命令到MODEM,MODEM执行后通过RXD返回结果给DTE。这些命令和返回结果符合RS-232C数据格式。MODEM由AT命令和几个特定的S寄存器的状态确定DTE发出的是命令还是数据。3 系统开发环境3.1 系统开发环境本系统采用的软件工具有:Windows平台虚拟机:VMware-workstation-5.5.1-19175操作系统: Radhat 9.0编辑器:VI编译器:gcc 3.2.2 20030222函数库:glibc 2.3.2.so系统头文件:glibc_header3.2 gcc简介Linux系统下的gcc(GNU C Compiler)是GNU推出的功能强大、性能

22、优越的多平台编译器,是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。 Gcc编译器能将C、C+语言源程序、汇编程序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别。虽然称gcc是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤预处理(也称预编译,Preproc

23、essing)、编译(Compilation)、汇编(Assembly)和连接(Linking)。命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。gcc编译器的调用参数大约有100多个,其中多

24、数参数可能根本就用不到,开发过程中使用最多的命令就是:gcc -O test test.c, test.c是C语言源程序,test是可执行文件,-O是gcc的参数,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些。4 程序的设计4.1 设计概要此次设计之所以选择Linux,是因为Linux支持各种硬件平台和外部设备,Linux对串口的操作非常简单,功能齐全,且Linux有功能强大的C语言编译器(gcc),使程序的可移植性非常好。Linux又是完全开放的操作系统,很大程度上,Linu

25、x的开放性,赋予了其无穷的生命力。本设计基于Linux操作系统,利用POSIX termios函数控制计算机串口,通过AT命令初始化本地MODEM并让本地MMODEM与异地MODEM进行拨号连接。本设计使用的是56K MODEM,不同于现在市面上常见的ADSL MODEM。 连接成功后,通过读写计算机串口来实现文件传输-这个过程是用一个自编的文件传输协议来完成的。整个程序使用C语言实现。总体设想如图3所示:图3 预期设计效果 总体来说,设计可以分成两部分来进行:RS-232-C与MODEM。但这两部分并不独立,MODEM的初始化及拨号连接等等一切对MODEM的控制和访问,都要通过串口,因为串口

26、是计算机与MODEM的唯一通道。两部分的关系如图4如示:图4 RS-232-C 所以设计的关键是现实对RS-232-C控制,然后再完成MODEM的部分。4.2 RS-232-C建立与打开 一个输入/输出(I/O)端口是用来将资料送入计算机及从计算机取出的通道,有许多种类的输出/输入端口,现在要处理的是串行端口,每一个串行端口必须有一个输入/输出地址,以及一个中断号码(IRQ),有四个串口设备对应到COM1- COM4:ttyS0 (COM1) address 0x3f8 IRQ 4ttyS1 (COM2) address 0x2f8 IRQ 3ttyS2 (COM3) address 0x3e

27、8 IRQ 4ttyS3 (COM4) address 0x2e8 IRQ 3ttyS*是串口在Linux中的命名方式,COM*是串口在Windows中的命名方式,Linux是以ttyS0开始命名的,与Windows从COM1开始命名不同。ttyS0和ttyS2使用同一个中断IRQ4,ttyS1和ttyS3使用同一个中断IRQ3,所以如果同时使用了ttyS0和ttyS2或者ttyS1和ttyS3,就必须重设它们的中断才可以,幸运的是,现在常见的设备都不使用串口,所以连接56K MODEM时,多数情况都不必再重设串口中断,如果是外置MODEM,则它占用的是ttyS0,如果是内置MODEM,则它占

28、用的很可能是ttyS2。Linux下可以使用ls l /dev/ttyS*来检查系统是否正确的建立了串口设备。此次设计是在Windows VMware Workstation虚拟机环境下安装的Radhat9.0操作系统,所以在进行设计之前,必须为虚拟机添加串口设备,具体是在设置中点击添加,选择串口设备,然后一直选择下一步即可。如果不设置虚拟机串口设备,在虚拟机下将无法识别到串口。设置成功后,可以像使用真正的操作系统一样使用虚拟机,虚拟机下面的串口是真实的物理串口,而并非是虚拟出来的。VMware Workstation中设备的使用很多都是真实的,不是模拟出来的。确定串口正确建立以后,使用ope

29、n()函数来打开它。像所有的设备一样,Linux提供设备文件来挂载端口。要访问一个串行端口,只要像访问文件一样来访问设备文件即可。串行端口的设备文件名在Linux中是:/dev/ttyS*(*代表0,1,2)。以ttyS0以例,int fd;fd = open(“/dev/ttyS0”, O_RDWR | O_NOCTTY | O_NDELAY);O_RDWR代表可读可写,O_NOCTTY告诉Linux该程序不想成为那个端口的“控制终端”。如果不指明这个,任何输入都会影响此进程。O_NDELAY标志该程序不关心DCD信号的输入状态,即无论另一端端口是否启用和运行。如果不指明这个标志,此进程将休

30、眠,直到另一端发送DCD信号过来。如果不是以root身份登陆,在打开串口时,可能会发生权限不允许的情况,这时候使用chmod a+rw /dev/ttyS0命令改变文件权限即可,或者直接用root身份登陆。4.3 串口设置与读写4.3.1 c_cflag控制项设置在对串口进行读写之前,必须对串口进行设置,这也是串口操作部分最复杂,最重要的一步。串口技术已经很成熟,相应的它的设置也变得很复杂,但相当一部分功能是针对已经被淘汰的外部设备,所以这里只用到了其中一部分的功能。多数系统支持POSIX termios终端串行接口来改变,例如波特率,字符尺寸等参数。首先必须引入文件。它定义了终端控制结构te

31、rmios和POSIX控制函数。termios是一个结构体,它的结构成员如表2如示:表2 Termios 结构成员成员描述c_cflag控制项c_lflag线路项c_iflag输入项c_oflag输出项c_cc控制字符c_ispeed输入波特(新接口)c_ospeed输出波特(新接口)在对termios成员进行设置之前,首先要使用tcgetattr(fd, &option)读取当前串口的状态,termios成员设置完之后,再使用tcsetattr (fd,TCSANOW,&option)将设置的内容写入计算机串口,option是termios类型变量,TCSANOW表明所有的改变立即生效,而不

32、等待发送或者接收的数据结束。c_cflag成员控制波特率、数据位、校验、停止位和硬件流控制,所有支持的设置都有常数对应。对应此次设计的c_cflag设置如下:cfsetispeed(&options, B115200); /Buadrate 115200cfsetospeed(&options, B115200);options.c_cflag |= (CLOCAL | CREAD);options.c_cflag &= CSIZE; /Mask the character size bitsoptions.c_cflag |= CS8; /Select 8 data bitsoptions.

33、c_cflag &= PARENB; /NOoptions.c_cflag &= CSTOPB; /One Stop bit cfsetispeed和cfsetospeed函数用于设备波特率,上面设置的是115200波特,可供选择的还有B76800,B19200,B1200等等。有些Linux版本并不支持cfsetispeed和cfsetospeed,但仍可以用options.c_cflag |= B115200这种方式进行设置。不同于波特率,没有函数可以用来设置字符尺寸,需要使用比特掩码的操作来完成。CLOCAL代表本地线不改变端口的拥有者,CREAD表示接收有效。CLOCAL | CREA

34、D将保证这个程序不会成为端口的拥有者,从而不会妨碍控制工作和挂起信号并使串行接口驱动读取进入的数据。由异步通信可知,串行数据中数据可以有5位、6位、7位、8位,并且可以选择奇偶校验,或者无校验。最后的停止位也可以设置成1位或者2位。CS8,PARENB,CSTOPB将把串行数据设置为:八位数据位,无奇偶校验,1位停止位。CSIZE是数据位数掩码,必须在设置CS8之前使用,起清除的作用,会把之前对数据位数的设置清除掉。c_cflag还包括对硬件流设备的常数,这里不会用到,可以不予理会。4.3.2 c_iflag、c_lflag和c_oflag设置 options.c_lflag &= (ICAN

35、ON | ECHO | ECHOE | ISIG)options.c_iflag &= (INPCK | IGNPAR |IXON |IXOFF |IXANY);options.c_oflag &= OPOST; 输入模式成员c_iflag控制任何在端口接收字符的输入处理,INPCK和IGNPAR分别代表校验有效和忽略校验错误,但是并没有使用校验位,所以屏蔽这两项。IXON、IXOFF、IXANY分别是软件流控制开启、软件流控制关闭和允许任何字符再次启动流,为简单起见,设计中不使用软件流控制串行通迅,所以屏蔽这三项。c_lflag控制输入字符如何被串行驱动使用,它和c_oflag的设置应该说是

36、整个串口设置当中最重要的,它直接影响到串口的工作方式。简单讲,串行设备有三种不同的的输入方式,需要为程序选择合适的工作方式: 标准输入模式。这是终端设备的标准处理模式,这种方式下,read会传回一整行完整的输入,一行的结束默认是以NL、文件结束符,或是一个行结束字符。 非标准输入模式。此模式下,可以每次读取固定数量的字符,并允许使用字符接收时间定时器。这种模式可以用在每次读取固定长度字符串的程序中,或者所连接的设备会突然大量字符的情况下。 等待来自多信号源的输入。实际上这并不是另一种输入方式,它用于处理来自多个设备的数据。非标准输入输出更适合此次项目,ICANON代表标准模式,所以屏蔽它。EC

37、HO和ECHOE是关于回显的选项,如果串口另一端也要求回显的话,那就会造成串口两端反馈死循环,所以屏蔽它们。ISIG是让某些信号起作用,这里不需要这些信号,所以不也不考虑选择ISIG。而c_oflag是对输出数据进行处理的成员项,相应的就有标准输出模式和非标准输出模式。非标准输出模式更加灵活,适合做为本次设计的输出模式,而对这种模式的选择是非常简单的,只要屏蔽c_cflag的OPOST项即可,屏蔽OPOST项,c_oflag其余的项就都被忽略。如果选择了OPOST项,那么就是标准输出模式。其余的项大多出于历史原因要追溯到打印机和终端还不能和串行数据流保持一致的时候,现在已经没有使用价值了。4.

38、3.3 c_cc控制字符设置 options.c_ccVMIN = 0; options.c_ccVTIME = 200;c_cc的结构是一个字符数组,它包含了控制字符和超时参数。其中常用到的只有其中的VMIN和VTIME两个元素。VMIN和VTIME只有在非标准输入时才有效。在非标准输入模式中,输入的数据并不组合成行,也不会进行erase、kill、delete等输入处理。这两个参数控制这种模式的输入行为:c_ccVTIME设定字符输入间隔时间计时器,而c_ccVMIN设置满足读取函数的最少字节数。MIN 0, TIME = 0: 函数在读到了MIN值的字符数后返回。MIN = 0, TIM

39、E 0: TIME决定了超时值,读取函数在读到一个字节的字符,或者等待读取时间超了TIME(t = TIME*0.1s)以后返回,也就是说,即使没有从串口读到数据,读取函数会在TIME时间后返回。MIN 0, TIME 0: 读取函数会在收到了MIN字节的数据后,或者超TIME时间没有收到数据后返回。此时计时器会在每次收到字符的时候重新计时,且只在收到第一个字节后才启动。所以读取函数最少要读取一个字节才能正常返回。MIN = 0, TIME = 0: 读取函数会立即返回。实际读取到的字符数,或者要读到的字符数,会作为返回值返回。设计时考虑到不能让串口接收不到数据陷入无限等待的僵死状态,并且又得

40、让串口有一定长的等待时间等待数据到来,所以选择了MIN = 0, TIME 0的组合,即在没有数据到来时,会等待TIME时间,如果超过TIME仍没有数据到来,则读取串口的函数仍可以返回。TIME的值的大小可以根据不同情况而定,但是不能太长,超过30s程序就会报错,这里选择的是200(20s)。MIN和TIME需要配合fcntl(fd, F_SETFL,0)使用,fcntl(fd, F_SETFL,0)作用是当串口没有接收到字符时,阻塞等待一段时间。这时对MIN,TIME的设置才可以起作用。如果不想让串口阻塞,则可以设置fcntl(fd, F_SETFL,FNDELAY),这时它与MIN = 0

41、, TIME = 0得到的结果相同。fcntl函数是在open函数后面加入的。可以用#include 将其函数声明加入程序。最后,将设置的内容存入串口tcsetattr (fd,TCSANOW,&option),串口设置就完成了。4.3.4 读写串口写数据到串口是很简单的,只需要使用write()系统呼叫去传送数据:n = write(fd, “ATZ/R”, 4);if( n 4 ) printf(“write to serial port failed!n”);从串口读取数据:n=read(fd, rdata, 1);rdata是预先先定义好的字符数组,要让rdata足够大,才不会发生数据

42、溢出错误。串口本身有4K的读写缓存,不同的计算机可能缓存大小不一样。不能一次性读写超过串口缓存本身大小的字符数,不过4K已经足够使用了。向串口写数据往往一次性就能成功,例如一次性往串口写100个字符,但若从串口读这100个字符,根据MIN和TIME设置的不同,可能需要读取两次才能将这100个字符完整读出来。所以MIN 和TIME的设置很重要。同时,串口波特率越高,一次性把串口数据读完的机率也越小。4.4 MODEM的控制 4.4.1 MODEM的两种工作状态MODEM的状态可以分为命令状态和在线状态。除了拨号占据短暂的时间之外,MODEM总是处于其中一种状态。当MODEM启动后,首先处于命令状

43、态,连接后进入在线状态。在命令状态下MODEM以AT命令形式接受命令,例指示MODEM去拨号或当电话响铃时给予自动应答。在在线状态下,MODEM与远端系统通信。这时MODEM不再尝对发送给它的数据进行解释,而是直接将其发送出去。这两种状态之间可以相互转换。当MODEM处于命令状态时,MODEM不是和远端系统通信,而是准备接受命令,此时MODEM一般处于挂机状态(离线命令状态),但也可以处于摘机状态(在线命令状态)。MODEM接收并解释AT命令,DET只有在命令状态才能对MODEM进行控制。在线状态又称为联机状态或数据状态,当通信双方握手完成,建立通信链路后,MODEM就可以发送和接收数据,MO

44、DEM不再对接收到的数据分析处理,而是直接将其发送出去。MODEM状态之间的转换如图5所示:图5 MODEM工作状态转换 设计的目的就是要让MODEM由开机时的命令状态转入在线状态,此时通过串口发给MODEM的数据不经MODEM处理的被传出去,从远处接收到的数据也不经MODEM处理的被传到串口。一旦MODEM进入在线状态,便可以忽略MODEM的存在,就好象两台计算机之间通过串口连接进行数据通迅一样。4.4.2 DTE与DCE的握手DTE(Data Terminal Equipment)与DCE(Data Communications Equipment)通过九针RS-232-C连接,其针脚含义

45、如表3所示。表3 RS-232 SignalsRS-232 SignalsPin描述Pin描述1DCD - Data Carrier Detect6DSR - Data Set Ready2RXD - Received Data7RTS - Request To Send3TXD - Transmitted Data8CTS - Clear To Send4DTR - Data Terminal Ready9RI - Ring Detect5GND Logic Ground DSR、DTR:数据机(DCE)准备好、数据终端(DTE)准备好,只表示设备本身可用。首先,通过电话机拨号呼叫对方,电话

46、交换台向对方发出拨号呼叫信号,当对方DCE收到该信号后,使RI(振铃信号)有效,通知DTE,已被呼叫。当对方“摘机”后,两方建立了通信链路若计算机要发送数据至对方,首先通过接口电路(DTE)发出RTS(请求发送)信号。此时,若DCE(MODEM)允许发送,则向DTE回答DTE回答CTS(允许发送)信号。一般可直接将RTS/CTS接高电平,即只要通信链路已经建立,就可传送信号。(RTS/CTS可只用于半双工系统中做发送方式和接收方式的切换。)大多数情况下都不需要用RTS/CTS对通信进行控制,所以认为RTS/CTS总是有效的。当DTE获得CTS信号后,通过TxD线向DCE发出串行信号,DCE(MODEM)将这些数字信号调制成模拟信号(载波信号),传向对方。计算机向DTE“数据输出寄存器”传送新的数据前,应检查MODEM的状态和数据输出寄存器为空。当对方的DCE收到载波信号后,向对方的DTE发出DCD信号(数据载波检出),通知其DTE准备接收,同时,将载波信号解调为数据信号,从RxD线上送给DTE,DTE通过串行接收移位寄存器对接收到的位流进行移位,当收到1个字符的全部位流后,把该字

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号