Goahead网络远程设备控制程序设计_第1页
Goahead网络远程设备控制程序设计_第2页
Goahead网络远程设备控制程序设计_第3页
Goahead网络远程设备控制程序设计_第4页
Goahead网络远程设备控制程序设计_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

1、Goahead网络远程设备控制程序设计 小组成员:周凯亮 查伟 王俊杰 赵震玺 张慧成 一一. .课程课程设计目的和意义设计目的和意义 n 1.1课程设计目的 课程设计的主要目的是通过实际的嵌入式应用系统开发实例掌握嵌入式 系统设计和开发的技能和专门知识,积累实践和工程经验。 本课题设计尝试移植嵌入式服务器上广泛使用的网络服务器中称为 “GoAhead”的网络服务器。并且,利用 CGI 程序,尝试在网络上控制 HBE- EMPOSIII-SV210 的 LED,7-Segment,TextLCD。 n 1.2课程设计要求 本课题所设计的系统要求实现以下功能。 1.将“GoAhead”网络服务器

2、移植到实验箱目标板Linux系统上; 2.创建作为网络服务器的索引文件使用的 index.html 文件; 3.完成编写利用 Web 的 LED,7-Segment,TextLCD的控制程序。 二二. .课程设计的课程设计的需求需求与与方法方法 n 2.2需求分析 2.2.1功能需求分析 远程控制是当前信息技术领域的热点,使用远程控制技术,我们可以克 服因地域差异而造成的操作不便,让网络的效率得到更大的发挥。随着技术的发 展与网络的普及,目前远程控制技术的应用领域已经相当广泛。我们不仅可以通 过远程控制技术管理远端电脑,解决远端电脑的故障,与其他同事通过网络实现 远程协作,一起编辑一份文档或者

3、与其他团队成员交流信息,还可以在家里或旅 途中使用公司内部网络的数据与办公设备,实现远程办公。 2.2.2性能需求分析 (1)准确性与及时性 (2)灵活性 (3)响应速度 2.2.3课题任务目标 (1)将“GoAhead”网络服务器移植到实验箱目标板Linux系统上; (2)创建作为网络服务器的索引文件使用的 index.html 文件; (3)完成编写利用 Web 的 LED,7-Segment,TextLCD的控制程序。 2.2.4输入输出的要求 (1)鼠标点击WEB输入,通过键盘输入两个16进制的数,通过CGI程 序将其转换成8位二进制数来控制开发板中的LED 08的暗灭。(1为亮0为灭

4、) (2)鼠标点击WEB输入,通过键盘输入6位16进制的数,在开发板的 七段码中显示出来。 (3)鼠标点击WEB输入,通过键盘在网页的Line1和Line2中输入一串 字母或数字,在开发板的TextLCD中将输入的这些字符对应的显示出来。 2.2.5系统运行系统运行环境环境 硬件环境:pc机、HBE-EMPOSIII-SV210 hardware、串口线、网线等 软件环境:windows、ubuntu等一些应用软件 宿主机开发环境:交叉编译环境、调试环境 n2.3软硬件平台设计 2.3.1硬件平台设计 以太网接 口 S5PV210(ARM CortexTM-A8 Core) SDRAM NAN

5、D FLASH NOR FLASH SD卡接口 系统电 源 嵌入式网络控制 系统通过串行接口直 接传送到S5PV210微 处理器上的Web服务 器,之后通过浏览器, 用户可以方便的监测 控制。 硬件平台设计框图如 图所示: 2.3.2 软件平台设计 嵌入式网络控制系统通过RS-232串行接口直接传送到Samsung S5PV210微处理器上的WEB服务器,之后通过浏览器,用户可以方便的监测控 制。 因此系统软件部分主要由数据采集、数据传输、服务器数据处理和CGI 程序访问等几大部分。系统工作流程如下图所示: PC IE CGI 应用程序 驱动程序 HTML网页 数据采集程序 2.3.3 Goa

6、head服务器的特点以及使用方式 Goahead 服务器是一款主要面向嵌入式系统的Web服务器。 GoAhead Webserver是跨平台的服务器软件 它的特点是: 1、很小的内存消耗 2、支持认证功能Digest Access Authentication (DAA) 3、支持安全的通信,例如SSL(安全的套接字层) 4、支持动态Web页面,如ASP页面 5、可以使用传统的C语言编程定制Web页面里的HTML标签 6、支持CGI(公共网关编程接口) 7、嵌入式的JavaScript脚本翻译器 8、独特的URL分析器 三.课程设计的步骤与实现 n3.1GoAhead 网络服务器移植 1.下载

7、Goahead源码 2.GoAhead 源码复制及解压缩 3.为了为了 GoAhead 编译的源码修改对“Makefile”进行修改 main.c 和 misc.c 文件 4.GoAhead 编译生成了“webs”网络服务器执行文件和“libwebs.a”库 5.创建作为网络服务器的索引文件使用的 index.html 文件 6.创建在目标板上连接网络服务器时出现的网页目录(/web),创建包含 cgi 的目录(/web/cgi-bin)。 7.向目标板下载 GoAhead 执行文件及 main.html 8.在目标板上运行 GoAhead 9.通过主机 PC 的网页浏览器连接网络服务器 n3

8、.2通过HTML中的CGI接口完成对开发板的链接 开始 编译HTML文件(如: first.html) 编译.c文件(如:first.c) 通过gcc.将c文件 生成CGI文件 将HTML.cgi文件 用TFTP指令下载到开发板 并运行 结束 CGI(公用网关接口)规定了Web服务器调用其 他可执行程序(CGI程序)的接口协议标准。Web服务器 通过调用CGI程序实现和Web浏览器的交互,也就是CGI 程序接受Web浏览器发送给Web服务器的信息,进行处 理,将响应结果再回送给Web服务器及Web浏览器。CGI 程序一般完成Web网页中表单(Form)数据的处理、数据 库查询和实现与传统应用系

9、统的集成等工作。CGI接口 标准包括: 1标准输入 可通过标准输入(stdin)从Web服务器得到输 入信息 2环境变量 Web服务器和CGI接口设置了自己的一些环 境变量,用来向CGI程序传递一些重要的参数 3标准输出 通过标准输出(stdout)将输出信息传送给 Web服务器(html形式),就在命令行状态调试CGI 程序,并且得到它们的输出。 虚拟机及超级终端截图:虚拟机及超级终端截图: 通过HTML中的CGI接口完成对开发板的链接 实验截图: n3.3嵌入式Web服务器的实现 3.3.1利用 Web 的 LED 控制程序 创建 8bitled.html ; 8bitled.c文件 LE

10、D 控制控制 程序创建程序创建 8bitled.html 和 8bitled.cgi 复 制到 /tftpboot 目录中 LED 控制控制 程序编译程序编译 通过 tftp 下载 8bitled.html 和 8bitled.cgi , 并复制到 /web 和 /web/cgi- bin 向目标板向目标板 下载下载 LED 控制程序控制程序 接下来,通过主机 PC 的网页浏览器连接网络服务器 并向地址栏中输入“65/ 8bitled.html”并 连接,则 8bitled.html 网页运行。 向地址栏中输入“65/8bit

11、led.html 向文本框中输入两位十六进制数并单击 input 按钮。在这 里,输入“1a”后,单击“input”按钮。 LED 控制页面运行确认及测试 实验截图: 3.3.2 7-Segment 设备驱动程序 vi 7segment.html vi 7segment.c 7Segment 控制程序创 建 将 7segment.html 和 7segment.cgi 文件复制到 /tftpboot 目录中。 7Segment 控制程序编控制程序编 译译 通过 tftp 下载 7segment.html 和 7segment.cgi 文件,向 /web 和 /web/cgi-bin 目录中复制

12、文件。 向目标板下向目标板下 载载 7Segment 控制程序控制程序 接下来,通过主机 PC 的网页浏览器连接网络服务器。 如果运行网页浏览器并向地址栏中输入 “65/ 7segment.html”并连接,则 7segment.html 网页运行。 向地址栏中输入“65/7segment.html”。 向文本框中输入六位十进制数并单击 input 按钮。在这里, 输入 ”123456”后单击“input”按钮。 7segment控制页面运行确认及测试 实验截图: 3.3.3利用 Web 的 textlcd 控制程序 创建 t

13、extlcd.html 创建 textlcd.c Textlcd控控 制程序创建制程序创建 将 textlcd.html 和 textlcd.cgi 文 件复制到 /tftpboot 目录中。 编译编译 textlcd 控控 制程序制程序 下载 textlcd.html 和 textlcd.cgi 文件, 向/web 和 /web/cgi-bin 目 录中复制文件。 向目标板下向目标板下 载载 textlcd 控制程序控制程序 接下来,通过主机 PC 的网页浏览器连接网络服务器。 如果运行网页浏览器并向地址栏中输入“65/ textlcd.html”并连接,则

14、 textlcd.html 网页运行。 向地址输入栏输入“65/textlcd.html”。 输入文本框的 Line1 和 Line2 文字并单击“input”按钮。 如果画面上出现“LCD Done”消息窗,则可以清楚 /web/cgi-bin 中的 textlcd.cgi 程序顺利运行。 textlcd控制页面运行确认 实验截图: textlcd控制页面运行确认 实验截图: 赵震玺周凯亮*查伟 王俊杰 四四 总结总结 n 4.1实验认知与发现的问题 本次课程设计是嵌入式开发与应用,虽然只有短短的两个星期,但在这两个星 期里我们学到了很多。首先,我们对计嵌入

15、式开发有了进一步的掌握。基本掌握了 Goahead网络远程设备控制并在网络上控制 HBE-EMPOSIII-SV210 的 LED,7-Segment, TextLCD。 但在完成这些题目的同时,我们也发现了自己的很多问题: 第一,比如很多的专业术语都没有听说过,只好在同学的帮助和网络的帮助下, 勉勉强强完成了任务,我们也知道了自己的很多不足,在往后的时间中还要继续研究。 第二,在我们使用tftp传送文件的时候忘记修改虚拟机IP地址导致没有传送文件 成功。 第三,在我们将文件传送成功的时候,网页文件已经能在goahead中显示出来, 但是输入数据的时候,开发板并没有显示出来,后面才发现是传送文

16、件时,忘记用chomd 命令给CGI文件加上权限,我们通过分析及时的解决了这个问题。 第四,我们在完成实验后的第二天再次开启虚拟机并不能将这些网页文件打开,原来是每 次启动虚拟机它的IP地址都是原地址,要将它改成00并通过超级终端运行网 页文件。 第五,在运行网页文件的时候,首先要查看进程,要将进程中bin目录下的 webs进程杀除再运行网页文件才能将它打开。 最后,通过本次实验我们知道了团队力量的重要性,有的题目单靠单人的力量 是很难完成的,但是经过大家的合作,相比一个人来说完成的容易了点。 n4.2实验效果分析 本次实验虽然能将开发板中的LED,7-Segment,T

17、extLCD成功显示出来。但是 本次实验的效果仍有几点不足。 第一:通过goahead网页服务器编写LED,7-Segment,TextLCD的网页较为简单。 第二:控制开发板中7-Segment的显示时间没有进行精确的控制。 n4.3课程设计心得体会 本次课程设计也获得一个经验:在写一个程序的时候,一定要事先把程序原理方 框图化出来。以前总觉得这样做没必要,很浪费时间。但是,这次课程设计完全改变了我 以前的那种错误的认识。这次课程设计中碰到的那些需要很多代码才能完成的任务,画程 序方框图是很有必要的,因为通过程序方框图,在做设计的过程中,我们每一步要做什么, 每一步要完成什么任务都有一个很清

18、楚的思路,而且在程序测试的过程中也有利于查错。 经过本次试验我们这次做的实验还算是比较成功的,因为我们同时也在不知不觉 中提高了动手能力和独立分析思考问题、解决问题的能力。 这两个星期的嵌入式应用的课程设计,使我们更加系统的认识和了解Goahead 网络远程设备控制的工作原理,更深层次的认识了嵌入式开发,相信在今后的学习以及相 关工作上会有很大帮助。 n致谢 感谢孙老师和范老师在课设中给予的指导和鼓励。感谢学校提供机会,能够让我 们在实践中培养动手能力,将理论与实际结合再一起。 五五. .代码附录参考资料代码附录参考资料 n5.1 7segment实验代码附录 /* *7-Segment CG

19、I Program */ #include #include #include #include #include #include #include #include #include #define FPGA_BASEADDRESS0 x88000000 #define SEG_GRID_OFFSET 0 x30 #defineSEG_DATA_OFFSET 0 x32 typedef struct char name128; char val128; entry; void getword(char *word, char *line, char stop) int x =0, y =

20、0; for(x=0;(linex) x+) wordx = linex; wordx = 0; if(linex) +x; while(liney+ = linex+); int sizeofword(char *word) int i=0; for(i=0;i10;i+) if(wordi = 0) break; return i; unsigned int Getsegcode(char x) unsigned int code; switch (x) case 0 : code = 0 xfc; break; case 1 : code = 0 x60; break; case 2 :

21、 code = 0 xda; break; case 3 : code = 0 xf2; break; case 4 : code = 0 x66; break; case 5 : code = 0 xb6; break; case 6 : code = 0 xbe; break; case 7 : code = 0 xe4; break; case 8 : code = 0 xfe; break; case 9 : code = 0 xf6; break; case a : case A : code = 0 xfa; break; case b : case B : code = 0 x3

22、e; break; case c : case C : code = 0 x1a; break; case d : case D : code = 0 x7a; break; case e : case E : code = 0 x9e; break; case f : case F : code = 0 x8e; break; default : code = 0; break; return code; int main() char *cl; int k; unsigned int low = 0,high = 0; entry entries; unsigned short digit

23、6 = 0 x20, 0 x10, 0 x08, 0 x04, 0 x02, 0 x01; unsigned short data6; int i,j,m; int fd; unsigned short *addr_fpga; unsigned short *addr_grid, *addr_data; printf(Content-type: text/htmlnn); printf(n7-Segment cgi programn); printf(n); if(fd=open(/dev/mem,O_RDWR|O_SYNC) 0) printf(mem open failn); exit(1

24、); addr_fpga= (unsigned short *)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, FPGA_BASEADDRESS); addr_grid=addr_fpga+SEG_GRID_OFFSET/sizeof(unsigned short); addr_data=addr_fpga+SEG_DATA_OFFSET/sizeof(unsigned short); if(addr_grid 0 | addr_data 0) close(fd); printf(mmap errorn); exit(1); cl

25、= (char *)getenv(QUERY_STRING); getword(,cl,=); getword(entries.val,cl, k = sizeofword(entries.val); for(i=0; ik; i+) data(k-i)-1 = Getsegcode(entries.vali); for(j=0;j200;j+) for(i=0; ik; i+) *addr_grid = digiti; *addr_data = datai; for(m=0;m65536;m+); *addr_grid = digit0; *addr_data = 0

26、; munmap(addr_grid, 4096); munmap(addr_data, 4096); close(fd); if( k != 0)printf(7-Segment Done); else printf(You entered the wrong value!); printf(); printf(n); return 0; n 5.1 7segment HTML源码附录 7segment cgi program 向 7-Segment 中输入要显示的十进制数。 n5.2 LED实验代码附录 /* 8-Bit LED CGI Program */ #include #inclu

27、de #include #include #include #include #include #include #include #define FPGA_BASEADDRESS0 x88000000 #define LED_OFFSET0 x20 typedef struct char name128; char val128; entry; void getword(char *word, char *line, char stop) int x =0, y = 0; for(x=0;(linex) x+) wordx = linex; wordx = 0; if(linex) +x;

28、while(liney+ = linex+); int main() int fd; unsigned short *addr_fpga, *addr_led; char *cl; unsigned short val; entry entries; printf(Content-type : text/htmlnn); printf(n8bit LED cgi programn); printf(n); cl = (char *)getenv(QUERY_STRING); getword(,cl,=); getword(entries.val,cl, val = (u

29、nsigned short)strtol(entries.val,NULL,16); if(val = 0) if(!(entries.val0 = 0 exit(1); if(fd=open(/dev/mem,O_RDWR|O_SYNC) 0) printf(mem open fail, %dn, fd); exit(1); addr_fpga= (unsigned short *)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, FPGA_BASEADDRESS); addr_led = addr_fpga + LED_OFFSE

30、T/sizeof(unsigned short); *addr_led = val|0 x100; munmap(addr_fpga, 4096); close(fd); printf(You entered 0 x%x,val); printf(); printf(n); return 0; 8bit led cgi program 输入两位十六进制值 : n 5.2 LED HTML源码附录 n5.3 LCD实验代码附录 /* *TextLCD CGI Program */ #include #include #include #include #include #include #inc

31、lude #define FPGA_BASEADDRESS0 x88000000 #define TEXTLCD_OFFSET 0 x10 void setcommand(unsigned short command); void writebyte(char ch); void initialize_textlcd(); void writeTextLcd(int row, char *str,int length); int function_set(int rows, int nfonts); int display_control(int display_enable, int cur

32、sor_enable, int nblink); int cusrsor_shit(int set_screen, int set_rightshit); int entry_mode_set(int increase, int nshift); int return_home(); int clear_display(); int set_ddram_address(int pos); void splitword(char *out, char *in, char stop); void unescape_url(char *url); char x2c(char *x); unsigne

33、d short *pTextlcd; typedef struct char name128; char val128; entry2; int get_get(entry entries) char qs128; int i; /bzero(qs,sizeof(qs); sprintf(qs,%s0,getenv(QUERY_STRING); for(i=0;*qs c *= 16; c += (x1 = A ? (x1 return c; int main(int argc, char *argv) char data2128; int fd; entry entries; char *c

34、l; unsigned short *addr_fpga; printf(Content-type: text/htmlnn); cl = (char *)getenv(QUERY_STRING); get_get(entries); if (fd=open(/dev/mem,O_RDWR|O_SYNC) 0) perror(mem open failn); exit(1); addr_fpga= (unsigned short *)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fd, FPGA_BASEADDRESS); pTextlc

35、d=addr_fpga+TEXTLCD_OFFSET/sizeof(unsigned short); if(pTextlcd 0) close(fd); printf(mmap errorn); exit(1); initialize_textlcd(); strcpy(data0, entries0.val); strcpy(data1, entries1.val); writeTextLcd(1,data0,strlen(data0); writeTextLcd(2,data1,strlen(data1); munmap(pTextlcd,4096); close(fd); printf(

36、LCD Done!); return 0; void setcommand(unsigned short command) command *pTextlcd = command | 0 x0000; usleep(1000); *pTextlcd = command | 0 x0100; usleep(1000); *pTextlcd = command | 0 x0000; usleep(1000); void writebyte(char ch) unsigned short data; data = ch *pTextlcd = data usleep(1000); *pTextlcd

37、 = data|0 x500; usleep(1000); *pTextlcd = data|0 x400; usleep(1000); void initialize_textlcd() function_set(2,0); /Function Set:8bit,display 2lines,5x7 mod display_control(1,0,0); / Display on, Cursor off clear_display(); / Display clear entry_mode_set(1,0); / Entry Mode Set : shift right cursor ret

38、urn_home(); / go home /send Function Set command to the text lcd / rows = 2 : = 2 rows, rows = 1 = 1 rows / nfonts = 1 : = 5x10 dot, nfonts = 0 : 5x7 dot int function_set(int rows, int nfonts) unsigned short command = 0 x30; if(rows = 2) command |= 0 x08; else if(rows = 1) command else return -1; co

39、mmand = nfonts ? (command | 0 x04) : command; setcommand(command); return 1; int display_control(int display_enable, int cursor_enable, int nblink) unsigned short command = 0 x08; command = display_enable ? (command | 0 x04) : command; command = cursor_enable ? (command | 0 x02) : command; command =

40、 nblink ? (command | 0 x01) : command; setcommand(command); return 1; int cusrsor_shit(int set_screen, int set_rightshit) unsigned short command = 0 x10; command = set_screen ? (command | 0 x08) : command; command = set_rightshit ? (command | 0 x04) : command; setcommand(command); return 1; int entry_mode_set(int increase, int nshift) unsigned short command = 0 x04; command = increase ? (command | 0 x2) : command; command = nshift ? ( command | 0 x1) : command;

温馨提示

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

最新文档

评论

0/150

提交评论