《通信软件设计》实验指导书.doc_第1页
《通信软件设计》实验指导书.doc_第2页
《通信软件设计》实验指导书.doc_第3页
《通信软件设计》实验指导书.doc_第4页
《通信软件设计》实验指导书.doc_第5页
免费预览已结束,剩余103页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

通信软件设计实 验 指 导 书通信工程系计算机通信教研室2008年6月102前 言通信软件几乎存在于所有通信设备和系统,通信工程专业的学生应该了解通信软件的组成和主要设计要点,所以通信软件设计(design of communications software)是通信工程专业一门重要的选修课。本课程技术性、实践性很强。通信软件的开发平台和运行平台都是在某个操作系统之上,涉及到较多操作系统概念和技术。软件的设计基础是数据结构,这门课程也是操作系统、数据结构、程序设计语言等基础课程的综合运用。通信技术的范围很大,就其软件的类型来说,也非常复杂繁多。实验和课堂学时有限,只能选择目前流行的ip和linux作为实验环境和目标,目的是使学生了解通信软件的设计过程和方法,了解通信软件的核心问题,而非学习每个通信技术种类的软件开发和运行情况,比如程控交换机软件、以太网络交换机软件、第三层交换机软件等等。本实验选择linux作为基础操作系统,所以实验要从linux的结构/组成、开发入手,掌握基本的编辑、编译、运行方法;再深入进程间通信、内核构造;最后是协议实现。目 录前 言i目 录ii实验要求1实验一 linux程序设计环境21实验目的22实验内容23实验步骤及调试环境23.1调试环境23.2实验步骤:23.3程序样本:33.3.1 c-h.c文件33.3.2 makefile文件3实验二 利用linux的/dev/tty接口的通信程序设计41实验目的42实验内容43实验步骤及调试环境43.1调试环境43.2实验步骤:43.3原理和程序样本:53.3.1 串口简介53.3.2 计算机串口的引脚说明53.3.3 串口操作53.3.4 打开串口63.3.5 设置串口63.3.6 需要注意:103.3.7 读写串口103.3.8 关闭串口103.3.9 主程序例子103.3.10 例子程序(样本1)113.3.10.1 makfile文件113.3.10.2 头文件123.3.10.3 tty_comm_init.c文件(初始化子程序库)123.3.10.4 tty_send_file.c文件(文件发送程序)183.3.10.5 tty_recv_file.c文件(文件接收程序)19实验三 底层232通信程序221实验目的222实验内容223实验步骤及调试环境223.1调试环境223.2实验步骤:223.3原理和程序样本:233.3.1程序功能233.3.2 核外进程进入内核原理233.3.3 核内外的接口设备243.3.4 设备文件操作表和文件操作程序243.3.5 设备加载和注销形式263.3.6 内核程序的特殊性263.3.7 232串口的控制和数据读写寄存器263.3.8 232串口中断服务程序273.3.9 xon/xoff协议程序273.3.10 编写用户空间串口通信程序283.3.11 例子程序(样本2)283.3.11.1 makefile文件283.3.11.2 头文件283.3.11.3 rs232_comm.c文件293.3.11.4 rs232_comm_send.c文件303.3.11.5 rs232_comm_recv.c文件323.3.11.6 rs232_comm_driver.c文件34实验四 状态机程序设计481实验目的482实验内容483实验步骤及调试环境483.1调试环境483.2实验步骤:493.3简化的sdlc规程493.3.1体系关系493.3.2状态机设计493.3.3帧结构513.4系统结构与实验环境523.4.1系统结构523.4.2 任务设置533.4.3测试数据和运行543.5流程与数据结构543.5.1数据流程与缓冲区/队列543.5.2主要程序流程553.5.2.1 s_open()流程553.5.2.2 s_write()流程553.5.2.3 s_close()流程553.5.2.4 文件发送流程(file_send)553.5.2.5 r_read()流程563.5.2.6 文件接收流程(file_recv)563.5.2.7 sdlc状态机处理流程(sdlc_state_process()563.5.2.8事件队列结构(sdlc_event_q,sdlc_data)和sdlc_read()流程583.5.2.9 232接口中断处理流程(232_intr()593.5.3 数据结构说明593.5.4 程序样本(样本3)603.5.4.1 makefile文件603.5.4.2 file_copy.h 文件(上层文件传输头文件)613.5.4.3 file_send.c 文件613.5.4.4 file_recv.c 文件643.5.4.5 file_copy.c 文件653.5.4.6 sdlc.h 文件663.5.4.7 sdev.c 文件693.5.4.8 rdev.c 文件723.5.4.9 sdlc.c 文件753.5.4.10 msdlc.c 文件763.5.4.11 ssdlc.c 文件90实验五 ip交换软件设计911实验目的912实验内容913实验步骤及调试环境923.1调试环境923.2实验步骤:923.2.1实验五.1实验步骤:923.2.2实验五.2实验步骤:943.3原理和要求943.3.1程序功能943.3.2 linux操作系统内核原理943.3.3 ip原理和简化的ip转发程序功能要求943.3.3.1 ip数据包格式953.3.3.2 ip路由表963.3.3.3路由选择算法963.3.3.4 路由表的建立与刷新973.3.3.5 路由软件应处理的主要内容973.3.3.6 简化的路由程序983.3.3.7 简单的维护程序983.4 缓冲区队列设计983.4.1 自由队列983.4.2 接收队列983.4.3 发送队列983.5 程序流程设计993.5.1 文件接收和发送程序流程993.5.2 232驱动程序流程993.5.3 简化的sdlc程序流程993.5.4 ip初始化和管理程序程序流程993.5.5 ip转发程序流程1003.5.6 缓冲区操作程序流程1013.6 完整程序101实验六 rh linux 2.4版本下的u盘使用1021实验目的1022实验内容1023实验步骤及调试环境1023.1调试环境1023.2实验步骤:102实验要求通信软件设计实验课程主要是编写程序和调试程序,要求在知道某个通信协议的情况下,学会如何在设备中实现这个协议。因此学会开发环境的搭建、运行、编写程序、编辑、编译、运行、试验等等方法和步骤。本指导书已经写出了初步的实验步骤和程序样本。整体步骤和完整程序必须要求学生自己去完成。所以在通信软件设计的课程实验过程中,要求学生做到:(1)预习实验指导书有关部分,认真做好实验内容的准备,就实验可能出现的情况提前作出思考和分析,提前编写代码。(2)仔细观察调试时出现的各种现象,记录主要情况,作出必要说明和分析。(3)认真书写实验报告。实验报告包括实验目的和要求,实验情况及其分析。对需编程的实验,写出程序设计说明,给出源程序框图和清单。(4)遵守机房纪律,服从老师指挥,爱护实验设备。(5)实验课程不迟到。如有事不能出席,必须请假,且所缺实验不补。实验的验收将分为两个部分。第一部分是上机操作,包括检查程序运行、设备配置和即时提问。第二部分是提交书面的实验报告。上机检查逐个进行,按初步规定的时间检查,都将应当在规定的时间内完成并检查通过,过期视为未完成该实验,不计成绩。希望同学们抓紧时间,合理安排,认真完成。实验报告格式:1)实验名称三号字体、宋体2)实验日期、地点五号字体、宋体3)班级、年级、学号、姓名五号字体、宋体4)实验目的五号字体、标题黑体、内容宋体5)实验环境五号字体、标题黑体、内容宋体6)实验步骤五号字体、标题黑体、内容宋体7)实验关键程序分析五号字体、标题黑体、内容宋体8)实验过程分析和体会五号字体、标题黑体、内容宋体9)实验结论分析五号字体、标题黑体、内容宋体实验一 linux程序设计环境(linux环境下的c语言源程序编辑、源程序编译、可执行文件的执行)1实验目的掌握linux程序设计的基本方法和linux的编辑和编译操作。2实验内容用c语言编写和调试一个在显示器上显示“hello,xx!”的程序。xx可替代任何字串。3实验步骤及调试环境3.1调试环境pc以及linux操作系统。3.2实验步骤:1) 安装linux操作系统(请找到合适的pc机器上安装,学校实验室-省略该步骤);2) 启动linux操作系统,用root用户登陆;3) 用鼠标寻找主菜单-系统设置-用户和组管理-添加用户,产生一个普通用户(自己的选择,比如stu1);注意观察这个用户的主目录在整个linux中的位置4) 在主菜单中注销并退出root用户,然后再用你产生的用户(比如stu1)登陆系统;5) 在桌面上空白处点击鼠标右键,然后“新建终端”,并进入终端窗口;终端是命令行操作模式6) 在终端命令提示状态下,用mkdir c-test命令做一个子目录(自己的选择,比如c-test),并用cd c-test命令进入这个子目录;7) 在这个目录下用vi c-h.c编辑源程序文件;学习vi编辑器或其它编辑器8) 用vi makefile编辑makefile文件;9) 用make命令编译你刚输入的源程序;10) 在目录/home/stu1/c-test下,出现命令行提示符号$,输入./c-h lili就可以执行你编写的程序。观察结果,思考编辑、编译、执行三者关系。11) 在主菜单中选择关闭系统。3.3程序样本:3.3.1 c-h.c文件int main(int argc, char *argv)if (argc 2) printf(“命令参数不正确n”);exit(-1);printf(“nhello,%s!n”,argv1);exit(1);3.3.2 makefile文件c-h:c-h.ogcc -o c-h c-h.c实验二 利用linux的/dev/tty接口的通信程序设计(利用linux 串口设备文件编通信程序)1实验目的掌握linux程序设计的基本方法和linux的操作;掌握linux串口文件的使用,学会如何在linux之上采用串口作通信。2实验内容用c语言编写一个基于/dev/ttysx串口设备的文件发送通信程序和文件接收通信程序(利用linux提供的串口内核程序实现),然后编辑输入和编译调试。完成任务的标志是两个机器之间通过232电缆实现任何文件的传输。3实验步骤及调试环境3.1调试环境pc以及linux操作系统。3.2实验步骤:12) 脱机编写基于/dev/ttysx串口设备的通信程序(参见样本1);13) 做一个普通用户并这个普通用户登陆系统;14) 做一个子目录,并在这个目录下编辑文件;15) 学习vi编辑器或其它编辑器;16) 编辑输入程序和编辑makefile文件;17) 编译程序;18) 执行程序;19) 退出系统,关闭系统。3.3原理和程序样本:3.3.1 串口简介串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是 rs-232-c 接口(又称 eia rs-232-c)它是在 1970 年由美国电子工业协会(eia)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是数据终端设备(dte)和数据通讯设备(dce)之间串行二进制数据交换接口技术标准该标准规定采用一个 25 个脚的 db25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于 4% 的情况下,传输电缆长度应为 15 米。linux 操作系统从一开始就对串行口提供了很好的支持,需要详细了解串口使用,建议看参考书 serial programming guide for posix operating systems。3.3.2 计算机串口的引脚说明 序号信号名称符号流向功能2发送数据txddtedcedte发送串行数据3接收数据rxddtedcedte 接收串行数据4请求发送rtsdtedcedte 请求 dce 将线路切换到发送方式5允许发送ctsdtedcedce 告诉 dte 线路已接通可以发送数据6数据设备准备好dsrdtedcedce 准备好7信号地信号公共地8载波检测dcddtedce表示 dce 接收到远程载波20数据终端准备好dtrdtedcedte 准备好22振铃指示ridtedce表示 dce 与线路接通,出现振铃3.3.3 串口操作串口操作需要的头文件#include /*标准输入输出定义*/#include /*标准函数库定义*/#include /*unix 标准函数定义*/#include #include #include /*文件控制定义*/#include /*ppsix 终端控制定义*/#include /*错误号定义*/3.3.4 打开串口在 linux 下串口文件是位于 /dev 下的 串口一 为 /dev/ttys0 串口二 为 /dev/ttys1 打开串口是通过使用标准的文件打开函数操作:int fd;/*以读写方式打开串口*/fd = open( /dev/ttys0, o_rdwr);if (-1 = fd) /* 不能打开串口一*/ perror( 提示错误!);3.3.5 设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 struct termios 结构体的各成员值。struct termio unsigned short c_iflag;/* 输入模式标志 */unsigned short c_oflag;/* 输出模式标志 */unsigned short c_cflag;/* 控制模式标志*/unsigned short c_lflag;/* local mode flags */unsigned char c_line;/* line discipline */unsigned char c_ccncc; /* control characters */;设置这个结构体很复杂,这里就只说说常见的一些设置:波特率设置下面是修改波特率的代码struct termios opt;tcgetattr(fd, &opt);cfsetispeed(&opt,b19200); /*设置为19200bps*/cfsetospeed(&opt,b19200);tcsetattr(fd,tcanow,&opt);设置波特率的例子函数:/*set_speed(fd, speed) 设置串口通信速率参数 fd 类型 int 打开串口的文件句柄参数 speed 类型 int 串口速度返回 void*/int speed_arr = b38400, b19200, b9600, b4800, b2400, b1200, b300,b38400, b19200, b9600, b4800, b2400, b1200, b300, ;int name_arr = 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, ;void set_speed(int fd, int speed) int i; int status; struct termios opt;tcgetattr(fd, &opt); for (i= 0; i 0) printf(nlen %dn,nread); buffnread+1 = 0; printf( n%s, buff); / close(fd); / exit (0);3.3.10 例子程序(样本1)3.3.10.1 makfile文件all:send recvsend:tty_send_file.o tty_comm_init.ogcc -o send tty_send_file.o tty_comm_init.otty_send_file.o:tty_send_file.c tty_comm.hgcc -c tty_send_file.crecv:tty_recv_file.o tty_comm_init.ogcc -o recv tty_recv_file.o tty_comm_init.otty_recv_file.o:tty_recv_file.c tty_comm.hgcc -c tty_recv_file.cclean:#rm *.o send recvtty_comm_init.o:tty_comm_init.c tty_comm.hgcc -c tty_comm_init.c3.3.10.2 头文件#define false0#define true1#define name_len 50#define buffer_len 512#define c1 *#define e1 q#define e2 t#define s_n 0#define s_e1 1#define s_e2 2#define s_c 3void get_file_end_flag(char *, int *);int check_file_end(char *, int *);void insert_chang_char(char *, int *);3.3.10.3 tty_comm_init.c文件(初始化子程序库)/-#include /*标准输入输出定义*/#include /*标准函数库定义*/#include /*unix标准函数定义*/#include /*/#include /*/#include /*文件控制定义*/#include /*ppsix终端控制定义*/#include /*错误号定义*/#include /*错误号定义*/#include tty_comm.h/*void set_speed(fd, speed) 设置串口通信速率参数 fd 类型 int 打开串口的文件句柄参数 speed 类型 int 串口速度返回 void*/int speed_arr = b38400, b19200, b9600, b4800, b2400, b1200, b300, b38400, b19200, b9600, b4800, b2400, b1200, b300, ;int name_arr = 38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, ;void set_speed(int fd, int speed)int i;int status;struct termios opt;tcgetattr(fd, &opt);for ( i= 0; i sizeof(speed_arr) / sizeof(int); i+) if (speed = name_arri) tcflush(fd, tcioflush);cfsetispeed(&opt, speed_arri);cfsetospeed(&opt, speed_arri);status = tcsetattr(fd, tcsanow, &opt); if (status != 0)perror(tcsetattr fd1); return; tcflush(fd, tcioflush);/*int set_parity(fd, databits, stopbits, parity) 设置串口数据位,停止位和效验位参数 fd 类型 int 打开的串口文件句柄*参数 databits类型 int 数据位 取值 为 7 或者8*参数 stopbits类型 int 停止位 取值为 1 或者2*参数 parity 类型 int 效验类型 取值为n,e,o,s*/int set_parity(int fd,int databits,int stopbits,int parity) struct termios options; if (tcgetattr(fd, &options) != 0) perror(setupserial 1); return(false); options.c_cflag &= csize; switch (databits) /*设置数据位数*/ case 7: options.c_cflag |= cs7; break; case 8: options.c_cflag |= cs8; break; default: fprintf(stderr,unsupported data sizen); return (false); switch (parity) case n: case n: options.c_cflag &= parenb; /* clear parity enable */ options.c_iflag &= inpck; / enable parity checking break; case o: case o: options.c_cflag |= (parodd | parenb); /设置为奇效验 options.c_iflag |= inpck; /* disnable parity checking */ break; case e: case e: options.c_cflag |= parenb; /* enable parity */ options.c_cflag &= parodd; /* 转换为偶效验*/ options.c_iflag |= inpck; /* disnable parity checking */ break; case s: case s: /*as no parity*/ options.c_cflag &= parenb; options.c_cflag &= cstopb; break; default: fprintf(stderr,unsupported parityn); return (false); switch (stopbits) /* 设置停止位*/ case 1: options.c_cflag &= cstopb; break; case 2: options.c_cflag |= cstopb; break; default: fprintf(stderr,unsupported stop bitsn); return (false); if (parity != n) /* set input parity option */ options.c_iflag |= inpck; options.c_ccvtime = 150; / 15 seconds options.c_ccvmin = 0; tcflush(fd,tciflush); /* update the options and do it now */ if (tcsetattr(fd,tcsanow,&options) != 0) perror(setupserial 3); return (false); return (true);/* 打开串口*/int opendev(char *dev) int fd = open( dev, o_rdwr ); /| o_noctty | o_ndelay if (-1 = fd) /*设置数据位数*/ perror(cant open serial port); return -1; else return fd;/ 文件结束字段void get_file_end_flag(char *bufp, int *buf_len_p) /生成文件结束字串 char *p = bufp; *p+ = e1; *p+ = e2; *buf_len_p = 2;void memncopy(char *t1, char *f1, int n) register char *t = t1, *f = f1; register int i; for (i = 0; i n; i+) *t+ = *f+;static int endstat = s_n;int check_file_end(char *bufp, int *buf_len_p) /检查文件传输完成否? char *p, *p1 = bufp; int ti = 0, bi = 0, ei = *buf_len_p; int r = false; p = malloc(ei); if (p = null) return false; memncopy(p, bufp, ei); while (bi ei) *p1+ = *p+; bi+; ti+; switch

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论