1、.课 程 设 计论文题目基于嵌入式Linux的温度采集系统 的设计与实现 学 院 专 业 班 级 学 号 学生姓名 指导教师 完成时间2016 年 5 月 精品word文档.摘要数据采集系统是信息科学的一个重要分支,它研究信息数据的采集、存储、处理以及控制等。本文提出采用嵌入式Linux作为操作系统,针对三星公司的S5PV210嵌入式处理器,设计一个嵌入式温度采集系统。论文在分析了Linux设备驱动程序的基本工作原理基础上,讨论了开发中经常会碰到的中断处理、拥塞处理、I/O端口,并在此基础上实现了基于S5PV210嵌入式处理器的开、读、写、关外部RAM的字符设备驱动和网络驱动。结合高精度温度传
2、感器DS18B20,实现温度的正确采集,并通过以太网络将数据上传给上位服务器。论文首先介绍了通信网络中各种设备特性、总线结构及传输技术,然后介绍根据单片机与PC机之间的串行通信原理,用ubantu完成数据采集系统的软件设计与实现,为用户提供一个友好的人机界面,对采集系统进行控制并显示采集后的数据。使用串口线传输数据,为数据采集系统和计算机之间的通讯开辟了新的道路。关键词:数据采集系统;以太网络;S5PV210;DS18B20精品word文档.I Design and Implementation of an Embedded Temperature Acquisition System bas
3、ed on LinuxAbstractData Acquisition System is an important branch of information science, it studies the collection, storage, processing and control of information data. In this paper, the embedded Linux is used as the operating system, and the embedded S5PV210 processor is designed to design an emb
4、edded temperature acquisition system. Based on the analysis of the Linux device driver based on the basic working principle discussed development often encounter interruption congestion handling, processing, I / O ports, and on this basis, realized s5pv210 embedded processor open, read, write, outsi
5、de the ram of the character set by driver and the network drive on. Combined with the high precision temperature sensor DS18B20, to achieve the correct temperature collection, and through the Ethernet network to upload data to the host server.At first, the paper introduces the communication network
6、characteristics of various devices, bus structure and transmission technology, and then introduce according to the principle of serial communication between MCU and PC, ubantu completed software design and implementation of data acquisition system, to provide users with a friendly man-machine interf
7、ace, to control the acquisition system and display after the collection of the data. The use of serial data transmission, for the data acquisition system and the communication between the computer has opened up a new path.Key words: Data acquisition system; Ethernet; S5PV210; DS18B20精品word文档.目录第一章 需
8、求分析11.1 总体设计11.2 客户端界面设计(app:Linux_client)11.3 服务器设计(linux)11.4 硬件设计2第二章 详细设计32.1 代码调用过程32.2 文件IO (系统库函数)32.3 网络编程42.4 内核驱动开发:(模块编程)62.5 注册字符设备驱动72.6 操作硬件的过程:(裸奔代码)8第三章 测试过程103.1 测试10第四章 项目拓展114.1 项目拓展11附录12总结23精品word文档.精品word文档.第一章 需求分析1.1 总体设计图1-1 总体设计图1.2 客户端界面设计(app:Linux_client)1. 作为用户操作的简单界面2.
9、 用于发送命令控制硬件3. 接收server传输的数据4. 显示数据。1.3 服务器设计(linux)1. 用于接收(app)客户端发送的命令2. 处理命令3. 转发给硬件4. 读取硬件传输数据5. 把数据传回(app)客户端精品word文档.1.4 硬件设计1. Led灯点亮灯:led1、led2。2. 温度传感器把温度数据读取到客户端。 3蜂鸣器用于报警以及音乐播放。精品word文档.第二章 详细设计2.1 代码调用过程代码调用过程如图所示:图2-1 代码调用图分析代码调用过程:0. 准备工作:1. 先调用insmodled.ko插入模块2. register_chrdev注册字符设备驱动
10、1. App:fd = open(/dev/led,O_RDONLY);2. drivers:2. sys_open(/dev/led,O_RDONLY)3.由内核为我们匹配,看是否能够找到设备号为249的led-drivers4.如果匹配成功,继续找到structfile_operationsled_fops结构体5.通过结构体找到 open函数的入口led_fops.open6.led_open7.arm_init2.2 文件IO (系统库函数)精品word文档.1. Open 打开文件返回一个文件描述符2. Read 通过文件描述符fd,读取文件3. Write 通过文件描述符fd,写文
11、件4. Close (进程结束的时候,会自动关闭,可以不必显示的调用close)阻塞:poll机制解决客户端如果要接收服务器回发的数据,则需要读取网络套接字,此时,客户端涉及到读终端和读服务器,而读终端和读服务器都是会阻塞的,所以调用poll机制解决。int poll(structpollfd *fds, nfds_tnfds, int timeout);功能:把所关心的文件描述符加入到structpollfd结构中,告诉内核我要非阻塞的读这个文件描述符,内核为我们判断,如果不阻塞,则相应的状态,参数1 :structpollfd intfd; /*所关心的文件描述符 */ short eve
12、nts; /* 告诉内核我要做什么:POLLIN:非阻塞的读*/ short revents; /*内核返回的状态 */;参数2:关心的描述符的个数参数3:愿意等待多长时间-1 : 一直等待 0 : 表示愿意等待的时间返回值:大于0 :表示至少有一个已经成功返回= 0 : 表示超时GPC0CON3 - 15-12 - 0001 = Output LED2 -GPC0CON4 - 19-16 - 0001 = OutputGPC0DAT : 用于设置电平的高低 GPC0DAT3 -GPC0CON15-12 led1 亮 -高电平1 GPC0DAT4 -GPC0CON19-16 led2 -灭 -
13、低电平 0Led:GPC0CON寄存器地址0xE0200060#define GPC0CON (*(volitale unsigned long *)0xE0200060)GPC0DAT 寄存器地址0xE0200064#define GPC0DAT (*(volitale unsigned long *)0xE0200064)MMU当开启了MMU之后,我们是不能直接访问到物理地址的。需要通过ioreamp把物理地址映射为虚拟地址,我们只能通过虚拟地址操作硬件Virt = ioremap(phy);intstrncasecmp(const char *s1, const char *s2, si
14、ze_t n);比较字符s1和s2的前n个字符是否相等,如果相等,则返回05. 裸奔代码操作硬件过程图2-6 操作硬件流程图精品word文档.第三章 测试过程3.1 测试1用户登录输入用户名和密码进行校验2登录成功进入到用户操作界面(如图3-1所示)输入要控制硬件的命令:如:打开led1,则输入on1关闭led1,则输入off1打开音乐播放器,则输入song获取温度,则输入get退出,则输入quit图3-1 用户操作界面精品word文档.第四章 项目拓展4.1 项目拓展目前本项目实现了通过客户端操作硬件,实现了点亮灯/蜂鸣器报警/音乐播放/温度数据采集功能。除用于温度监测外,在系统中的ARM外
15、围可接入控制电路、其他性能的传感器甚至摄像头等,还可以实现多种其他特殊需要的远程监测及控制,如水位监测、视频监控等,具有十分广阔的应用背景。智能硬件框架(如图4-1所示)图4-1 智能硬件框架图精品word文档.精品word文档.附录服务器模块:/*1.调用socket函数创建套接字。 TCP协议:SOCK_STREAM*/sockfd = socket(AF_INET,SOCK_STREAM,0);if(-1 = sockfd)perror(socket);return -1;/*填充服务器信息*/struct sockaddr_in servaddr;memset(&servaddr,0,
16、sizeof(servaddr);servaddr.sin_family = AF_INET;/PF_INETservaddr.sin_port = htons(PORT);/端口号(5001-65536)servaddr.sin_addr.s_addr = inet_addr(SERVERIP);/ip地址socklen_t adrlen = sizeof(servaddr);/*2.调用bind指定本地地址和端口。*/ret = bind(sockfd,(struct sockaddr *)&servaddr,adrlen);if(-1 = ret)perror(bind);return
17、-1;/*3.调用listen启动监听。*/ret = listen(sockfd,1000);if(-1 = ret)perror(listen);return -1;printf(server init.d success.n);int newfd;char bufBUFSZ = 0;pthread_t tid;while(1)/*4.调用accept从已连接列队中提取客户连接。*/精品word文档.newfd = accept(sockfd,NULL,NULL);if(newfd tid : 用于存放新建线程ID = do_work : 新建线程从这里开始执行 = newfd : 传给执
18、行函数的参数*/ret = pthread_create(&tid,NULL,do_work,&newfd);if(0 != ret)continue;/*设置为可分离态*/pthread_detach(tid);/*6.调用close关闭连接。*/close(sockfd);close(newfd);return 0;/*执行函数 (void *表示可以接收任意类型)*/void *do_work(void *arg)int ret;char bufBUFSZ;int newfd = *(int *)arg;char *strerr = 密码或者用户名输入有误!;unsigned int c
19、md = -1;unsigned long val = -1;int i = 0;int n = 2;int dev_fd;/*5.调用I/O函数(read/write)与客户端通讯。*/int fd_led;fd_led = open(/dev/led,O_RDWR);if(fd_led 0)/*发送命令给硬件*/if(!strncasecmp(buf,on1,3)cmd = LED_ON;val = 3;else if(!strncasecmp(buf,on2,3)cmd = LED_ON;val = 4;else if(!strncasecmp(buf,off1,4)cmd = LED_
20、OFF;val = 3;else if(!strncasecmp(buf,off2,4)cmd = LED_OFF;val = 4;else if(!strncasecmp(buf,onb,3)pwm_on();else if(!strncasecmp(buf,song,4)pwm_music_fun();if(ioctl(fd_led,cmd,(unsigned long)val) 0)if(pfd0.revents = POLLIN)interface_print(temp);/*从终端读取数据*/memset(buf,0,sizeof(buf);ret = read(pfd0.fd,bu
21、f,sizeof(buf)-1);if(ret 0)/*发送数据给服务器*/write(sockfd,buf,ret);if(pfd1.revents = POLLIN)if(!strncmp(buf,get,3)/*接收服务器发送的信息*/memset(temp,0,sizeof(temp);ret = read(pfd1.fd,temp,sizeof(temp)-1);if(ret 0)tempret-1 = 0;/*把信息显示到终端*/interface_print(temp);else if(0 = ret)printf(超时n);break;elseperror(poll);brea
22、k;/*6.调用close关闭连接。*/精品word文档.close(sockfd);return 0;int login(void)char username100 = 0;char passwd100 = 0;int flags;int ret;char buf100;system(clear);/清屏clearwrite(1,username : ,strlen(username : );memset(username,0,sizeof(username);ret = read(0,username,sizeof(username)-1);if(ret 0)write(sockfd,us
23、ername,ret);write(1,passwd : ,strlen(passwd : );memset(passwd,0,sizeof(passwd);ret = read(0,passwd,sizeof(passwd)-1);if(ret 0)write(sockfd,passwd,ret);memset(buf,0,sizeof(buf);ret = read(sockfd,buf,sizeof(buf);if(ret 0)printf(%sn,buf);if(!strncmp(buf,ok,2)flags = 0;elseflags = -1;return flags;精品word
24、文档.温度传感器驱动模块:static void Init_DS18B2O(void)/Init_DS18B2Ounsigned int retvalue=1;writel(readl(gph1con) & 0xFFFFFFF0) | 0x1, gph1con);/gph1_0,outputwritel(readl(gph1dat) | 0x1 , gph1dat);_udelay(1);writel(readl(gph1dat) &(0xFFFFFFFE), gph1dat);_udelay(500);writel(readl(gph1dat) | 0x1 , gph1dat);_udela
25、y(20);writel(readl(gph1con) & 0xFFFFFFF0, gph1con);/gph1_0,input_udelay(100);if (!(readl(gph1dat)&0x01)retvalue=0;static int gpio_relrease(struct inode *inode, struct file *filp)iounmap(gph1con);iounmap(gph1dat);iounmap(gph1pud);iounmap(gpc0con);iounmap(gpc0dat);iounmap(gpc0pud);return 0;static unsi
26、gned char ReadOneChar(void)unsigned char i=0;unsigned char dat=0;spin_lock(&lock);for (i=8;i0;i-)dat=1;writel(readl(gph1con) & 0xFFFFFFF0) | 0x1, gph1con);/gph1_0,output精品word文档.writel(readl(gph1dat) &(0xFFFFFFFE), gph1dat);_udelay(2);/writel(readl(gph1con) & 0xFFFFFFF0, gph1con);/gph1_0,input_udela
27、y(1);/if(readl(gph1dat)&0x01)dat |=0x80;_udelay(62);spin_unlock(&lock);return (dat);static void WriteOneChar(unsigned char dat)unsigned char i=0;writel(readl(gph1con) & 0xFFFFFFF0) | 0x1, gph1con);/gph1_0,outputspin_lock(&lock);for(i=0;i=1;spin_unlock(&lock);static unsigned int ReadTemp(void)unsigne
28、d char T_h=0;unsigned char T_l=0;unsigned int temp=0;精品word文档.writel(readl(gph1pud) & 0xFFFc) | 0x02, gph1pud);/gph1_0,pull-up enabledspin_lock(&lock);Init_DS18B2O();spin_unlock(&lock);_udelay(400);writel(readl(gph1con) & 0xFFFFFFF0) | 0x1, gph1con);/gph1_0,outputwritel(readl(gph1dat) | 0x1 , gph1da
29、t);WriteOneChar(0xcc);WriteOneChar(0x44);mdelay(100);spin_lock(&lock);Init_DS18B2O();spin_unlock(&lock);_udelay(400);writel(readl(gph1con) & 0xFFFFFFF0) | 0x1, gph1con);/gph1_0,outputwritel(readl(gph1dat) | 0x1 , gph1dat);WriteOneChar(0xcc);WriteOneChar(0xBE);T_l=ReadOneChar();/LT_h=ReadOneChar();/H
30、temp=(unsigned int) (unsigned int)T_h8)|T_l);return temp;static int gpio_ioctl(struct file *filp, unsigned int cmd, unsigned int *arg)unsigned int ret;switch(cmd) case GPIO_ON:ret=ReadTemp();arg=&ret;break;default:ret = -1;精品word文档.return ret;static struct file_operations gpio_fops = .owner=THIS_MODULE,.open=gpio_open,.release=gpio_relrease,.unlocked_ioc