基于嵌入式Linux的温度采集系统的设计与实现_第1页
基于嵌入式Linux的温度采集系统的设计与实现_第2页
基于嵌入式Linux的温度采集系统的设计与实现_第3页
基于嵌入式Linux的温度采集系统的设计与实现_第4页
基于嵌入式Linux的温度采集系统的设计与实现_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、课 程 设 计论文题目基于嵌入式Linux的温度采集系统 的设计与实现 学 院 专 业 班 级 学 号 学生姓名 指导教师 完成时间2016 年 5 月  摘要数据采集系统是信息科学的一个重要分支,它研究信息数据的采集、存储、处理以及控制等。本文提出采用嵌入式Linux作为操作系统,针对三星公司的S5PV210嵌入式处理器,设计一个嵌入式温度采集系统。论文在分析了Linux设备驱动程序的基本工作原理基础上,讨论了开发中经常会碰到的中断处理、拥塞处理、I/O端口,并在此基础上实现了基于S5PV210嵌入式处理器的开、读、写、关外部RAM的字符设备驱动和网络驱动。结合高精度温度传感器DS

2、18B20,实现温度的正确采集,并通过以太网络将数据上传给上位服务器。论文首先介绍了通信网络中各种设备特性、总线结构及传输技术,然后介绍根据单片机与PC机之间的串行通信原理,用ubantu完成数据采集系统的软件设计与实现,为用户提供一个友好的人机界面,对采集系统进行控制并显示采集后的数据。使用串口线传输数据,为数据采集系统和计算机之间的通讯开辟了新的道路。关键词:数据采集系统;以太网络;S5PV210;DS18B20I Design and Implementation of an Embedded Temperature Acquisition System based on LinuxAb

3、stractData 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 embedded tempera

4、ture 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, outside the ram of

5、 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 characteristi

6、cs 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 interface, to contr

7、ol 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目录第一章 需求分析11.1 总体设计11.2 客户端界面

8、设计(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第一章 需求分析1.1 总体设计图1-1 总体设计图1.2 客户端界面设计(app:Linux_client)1. 作为用户操作的简单界面2. 用于发送命令控制硬件3. 接收server传输的数据4. 显示数据。1.3 服

9、务器设计(linux)1. 用于接收(app)客户端发送的命令2. 处理命令3. 转发给硬件4. 读取硬件传输数据5. 把数据传回(app)客户端1.4 硬件设计1. Led灯点亮灯:led1、led2。2. 温度传感器把温度数据读取到客户端。 3蜂鸣器用于报警以及音乐播放。第二章 详细设计2.1 代码调用过程代码调用过程如图所示:图2-1 代码调用图分析代码调用过程:0. 准备工作:1. 先调用insmodled.ko插入模块2. register_chrdev注册字符设备驱动1. App:fd = open("/dev/led",O_RDONLY);2. drivers

10、: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 (系统库函数)1. Open 打开文件返回一个文件描述符2. Read 通过文件描述符fd,读取文件3. Write 通过文件描述符fd,写文件4. Close (进程结束的时候,会自动关闭,可以不必显示的调用close)阻塞:

11、poll机制解决客户端如果要接收服务器回发的数据,则需要读取网络套接字,此时,客户端涉及到读终端和读服务器,而读终端和读服务器都是会阻塞的,所以调用poll机制解决。int poll(structpollfd *fds, nfds_tnfds, int timeout);功能:把所关心的文件描述符加入到structpollfd结构中,告诉内核我要非阻塞的读这个文件描述符,内核为我们判断,如果不阻塞,则相应的状态,参数1 :structpollfd intfd; /*所关心的文件描述符 */ short events; /* 告诉内核我要做什么:POLLIN:非阻塞的读*/ short reve

12、nts; /*内核返回的状态 */;参数2:关心的描述符的个数参数3:愿意等待多长时间-1 : 一直等待> 0 : 表示愿意等待的时间返回值:大于0 :表示至少有一个已经成功返回= 0 : 表示超时< 0 :  表示失败2.3 网络编程TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信)。适用情况:1适合于对传输质量要求较高,以及传输大量数据的通信。2在需要可靠数据传输的场合,通常使用TCP协议3MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议项目需求:1. Linu

13、x平台下a) 服务器(server)i. 等待连接客户端ii. 接收客户端发送的数据字符串和文件iii. 处理客户端发送的数据和命令iv. 发送处理结果给客户端b) 客户端i. 简单的界面ii. 从键盘接收用户输入命令iii. 发送数据或者命令给服务器iv. 接收服务器返回的结果c) 协议:tcp2. 实现编程a) TCP四次握手协议b) TCP编程模型图2-2 TCP编程模型图3. 网络编程所需要的API函数a) 服务器i. Socketii. Bindiii. Listeniv. Acceptv. Read/readvi. Closeb) 客户端i. Socketii. Connectii

14、i. Read/readiv. Close通用地址结构structsockaddr u_shortsa_family; / 地址族, AF_xxxchar sa_data14; / 14字节协议地址 ;Internet协议地址结构structsockaddr_in sa_family_tsin_family; /*地址族: AF_INET */in_port_tsin_port; /*端口号*/structin_addrsin_addr; /* IPV4地址internet address */; /* IPv4地址结构*/structin_addr uint32_t s_addr; /* a

15、ddress in network byte order */ ;2.4 内核驱动开发:(模块编程)1. 模块入口moude_init2. 模块出口module_exit3. 语法 : c语言4. 编译(Makefile)a) make installb) makec) cpled.ko /opt/filesystem/test5. 执行: 驱动模块后缀:led.ko a) 插入内核: insmodled.ko b) 查看模块:lsmod c) 移除模块:rmmod led2.5 注册字符设备驱动static inline intregister_chrdev(unsigned int maj

16、or, const char *name,conststructfile_operations *fops)功能:把设备注册,添加到字符设备的表格中图2-3 字符设备驱动图insmodled.ko调用内核驱动模块注册设备到内核字符设备管理注册表中图2-4 打开文件设备过程图2.6 操作硬件的过程:(裸奔代码)1. 找到外设(led),分析外设功能a) 原厂提供b) Google ,baidu2. led原理图图2-5 led点灯流程图操作led的GPIO控制器,主要有以下两个:GPC0CON : 用于控制GPIO引脚输入还是输出GPC0CON32 LED1 ->GPC0CON3 ->

17、; 15-12 -> 0001 = Output LED2 ->GPC0CON4 -> 19-16 -> 0001 = OutputGPC0DAT : 用于设置电平的高低 GPC0DAT3 ->GPC0CON15-12 àled1 à亮 ->高电平1 GPC0DAT4 ->GPC0CON19-16 àled2 ->灭 ->低电平 0Led:GPC0CON寄存器地址0xE0200060#define GPC0CON (*(volitale unsigned long *)0xE0200060)GPC0DAT 寄存

18、器地址0xE0200064#define GPC0DAT (*(volitale unsigned long *)0xE0200064)MMU当开启了MMU之后,我们是不能直接访问到物理地址的。需要通过ioreamp把物理地址映射为虚拟地址,我们只能通过虚拟地址操作硬件Virt = ioremap(phy);intstrncasecmp(const char *s1, const char *s2, size_t n);比较字符s1和s2的前n个字符是否相等,如果相等,则返回05. 裸奔代码操作硬件过程图2-6 操作硬件流程图第三章 测试过程3.1 测试1用户登录输入用户名和密码进行校验2登录

19、成功进入到用户操作界面(如图3-1所示)输入要控制硬件的命令:如:打开led1,则输入on1关闭led1,则输入off1打开音乐播放器,则输入song获取温度,则输入get退出,则输入quit图3-1 用户操作界面第四章 项目拓展4.1 项目拓展目前本项目实现了通过客户端操作硬件,实现了点亮灯/蜂鸣器报警/音乐播放/温度数据采集功能。除用于温度监测外,在系统中的ARM外围可接入控制电路、其他性能的传感器甚至摄像头等,还可以实现多种其他特殊需要的远程监测及控制,如水位监测、视频监控等,具有十分广阔的应用背景。智能硬件框架(如图4-1所示)图4-1 智能硬件框架图附录服务器模块:/*1.调用soc

20、ket函数创建套接字。 TCP协议:SOCK_STREAM*/sockfd = socket(AF_INET,SOCK_STREAM,0);if(-1 = sockfd)perror("socket");return -1;/*填充服务器信息*/struct sockaddr_in servaddr;memset(&servaddr,0,sizeof(servaddr);servaddr.sin_family = AF_INET;/PF_INETservaddr.sin_port = htons(PORT);/端口号(5001-65536)servaddr.sin_

21、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 -1;/*3.调用listen启动监听。*/ret = listen(sockfd,1000);if(-1 = ret)perror("listen");return -1;pri

22、ntf("server init.d success.n");int newfd;char bufBUFSZ = 0;pthread_t tid;while(1)/*4.调用accept从已连接列队中提取客户连接。*/newfd = accept(sockfd,NULL,NULL);if(newfd <= 0)continue;printf("%d connect success.n",newfd);/*为每个客户创建线程去维护它 => tid : 用于存放新建线程ID => do_work : 新建线程从这里开始执行 => ne

23、wfd : 传给执行函数的参数*/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 = "密码或者

24、用户名输入有误!"unsigned int cmd = -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)perror("open");return (void *)-1;/*开辟一个线程不停的发送温度给客户*/pthread_t tid1;ret = pthread_create(&tid

25、1,NULL,do_temp,&newfd);pthread_detach(tid1);while(1)/*读取客户端信息*/memset(buf,0,sizeof(buf);ret = read(newfd,buf,sizeof(buf)-1);if(ret > 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

26、,"off1",4)cmd = LED_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)perror("ioctl failedn")

27、;exit(1);客户端模块:int main(int argc,char *argv)int ret;char bufBUFSZ = 0;char tempBUFSZ = "26.234000"/*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

28、,sizeof(servaddr);servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);/端口号servaddr.sin_addr.s_addr = inet_addr(SERVERIP);/ip地址socklen_t adrlen = sizeof(servaddr);/*2.调用connect连接服务器端*/ret = connect(sockfd,(struct sockaddr *)&servaddr,adrlen);if(-1 = ret)perror("connect");retur

29、n -1;printf("client connect success.n");struct pollfd pfd2 = 0;pfd0.fd = 0;pfd0.events = POLLIN;/不阻塞的读数据pfd1.fd = sockfd;pfd1.events = POLLIN;/不阻塞的读数据/*登录验证*/if(-1 = login()printf("登录失败n");return -1;printf("登录成功.n");interface_print(temp);/*5.调用I/O函数(read/write)与客户端通讯。*/

30、int i = 5;int pos;while(1)ret = poll(pfd,2,-1);if(ret > 0)if(pfd0.revents = POLLIN)interface_print(temp);/*从终端读取数据*/memset(buf,0,sizeof(buf);ret = read(pfd0.fd,buf,sizeof(buf)-1);if(ret > 0)/*发送数据给服务器*/write(sockfd,buf,ret);if(pfd1.revents = POLLIN)if(!strncmp(buf,"get",3)/*接收服务器发送的信

31、息*/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");break;/*6.调用close关闭连接。*/close(sockfd);return 0;int login(void)char username100 = 0;c

32、har 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,username,ret);write(1,"passwd : ",strlen

33、("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 fl

34、ags;温度传感器驱动模块: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 , gph1da

35、t);_udelay(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);ret

36、urn 0;static unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat=0;spin_lock(&lock);for (i=8;i>0;i-)dat>>=1;writel(readl(gph1con) & 0xFFFFFFF0) | 0x1, gph1con);/gph1_0,outputwritel(readl(gph1dat) &(0xFFFFFFFE), gph1dat);_udelay(2);/writel(readl(gph1con) & 0xFF

37、FFFFF0, gph1con);/gph1_0,input_udelay(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<8;i+)wr

38、itel(readl(gph1dat) &(0xFFFFFFFE), gph1dat);_udelay(15);if(dat&0x01)writel(readl(gph1dat) | 0x1 , gph1dat);elsewritel(readl(gph1dat) &(0xFFFFFFFE), gph1dat);_udelay(45);writel(readl(gph1dat) | 0x1 , gph1dat);_udelay(1);dat>>=1;spin_unlock(&lock);static unsigned int ReadTemp(voi

39、d)unsigned char T_h=0;unsigned char T_l=0;unsigned int temp=0;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

40、) | 0x1 , gph1dat);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=ReadOneC

41、har();/LT_h=ReadOneChar();/Htemp=(unsigned int) (unsigned int)T_h<<8)|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;return ret;static struct file_operations gpio_fops = .owner=THIS_MODULE,.open=gpio_open,.release=gpio_relrease,.unlocked_ioctl=gpio_ioctl,;static int _init gpio_init(void)int ret = 0;if (gp

温馨提示

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

评论

0/150

提交评论