《基于嵌入式Linux的温度采集系统的设计与实现.pdf》由会员分享,可在线阅读,更多相关《基于嵌入式Linux的温度采集系统的设计与实现.pdf(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、 页脚下载后可删除,如有侵权请告知删除!课 程 设 计 论文题目 基于嵌入式Linux的温度采集系统 的设计与实现 学 院 专 业 班 级 学 号 学生姓名 指导教师 完成时间 2021 年 5 月 页脚下载后可删除,如有侵权请告知删除!摘要 数据采集系统是信息科学的一个重要分支,它研究信息数据的采集、存储、处理以及控制等。本文提出采用嵌入式 Linux 作为操作系统,针对三星公司的S5PV210 嵌入式处理器,设计一个嵌入式温度采集系统。论文在分析了 Linux 设备驱动程序的根本工作原理根底上,讨论了开发中经常会碰到的中断处理、拥塞处理、I/O 端口,并在此根底上实现了基于 S5PV210
2、 嵌入式处理器的开、读、写、关外部 RAM 的字符设备驱动和网络驱动。结合高精度温度传感器 DS18B20,实现温度的正确采集,并通过以太网络将数据上传给上位效劳器。论文首先介绍了通信网络中各种设备特性、总线构造及传输技术,然后介绍根据单片机与 PC 机之间的串行通信原理,用 ubantu 完成数据采集系统的软件设计与实现,为用户提供一个友好的人机界面,对采集系统进展控制并显示采集后的数据。使用串口线传输数据,为数据采集系统和计算机之间的通讯开辟了新的道路。关键词:数据采集系统;以太网络;S5PV210;DS18B20 页脚下载后可删除,如有侵权请告知删除!Design and Impleme
3、ntation of an Embedded Temperature Acquisition System based on Linux Abstract Data 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 em
4、bedded S5PV210 processor is designed to design an embedded 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 s5pv2
5、10 embedded processor open,read,write,outside 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 pape
6、r introduces the communication network 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
7、 with a friendly man-machine interface,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;S5P
8、V210;DS18B20 I 页脚下载后可删除,如有侵权请告知删除!目录 第一章 需求分析.1 1.1 总体设计.1 1.2 客户端界面设计app:Linux_client.1 1.3 效劳器设计linux.1 1.4 硬件设计.2 第二章 详细设计.3 2.1 代码调用过程.3 2.2 文件 IO 系统库函数.3 2.3 网络编程.4 2.4 内核驱动开发:模块编程.6 2.5 注册字符设备驱动.7 2.6 操作硬件的过程:(裸奔代码).8 第三章 测试过程.10 3.1 测试.10 第四章 工程拓展.11 4.1 工程拓展.11 附录.12 总结.23 页脚下载后可删除,如有侵权请告知删除
9、!第一章 需求分析 1.1 总体设计 图 1-1 总体设计图 1.2 客户端界面设计app:Linux_client 1.作为用户操作的简单界面 2.用于发送命令控制硬件 3.接收 server 传输的数据 4.显示数据。1.3 效劳器设计linux 1.用于接收app客户端发送的命令 2.处理命令 3.转发给硬件 4.读取硬件传输数据 5.把数据传回app客户端 页脚下载后可删除,如有侵权请告知删除!1.4 硬件设计 1.Led 灯 点亮灯:led1、led2。2.温度传感器 把温度数据读取到客户端。3蜂鸣器 用于报警以及音乐播放。页脚下载后可删除,如有侵权请告知删除!第二章 详细设计 2.
10、1 代码调用过程 代码调用过程如下图:图 2-1 代码调用图 分析代码调用过程:0.准备工作:1.2.register_chrdev 注册字符设备驱动 1.App:fd=open(/dev/led,O_RDONLY);2.drivers:2.sys_open(/dev/led,O_RDONLY)3.由内核为我们匹配,看是否能够找到设备号为 249 的 led-drivers 4.如果匹配成功,继续找到 structfile_operationsled_fops构造体 2.2 文件 IO 系统库函数 1.Open 翻开文件 页脚下载后可删除,如有侵权请告知删除!返回一个文件描述符 2.Read
11、通过文件描述符 fd,读取文件 3.Write 通过文件描述符 fd,写文件 4.Close (进程完毕的时候,会自动关闭,可以不必显示的调用 close)阻塞:poll 机制解决 客户端如果要接收效劳器回发的数据,那么需要读取网络套接字,此时,客户端涉及到读终端和读效劳器,而读终端和读效劳器都是会阻塞的,所以调用poll机制解决。int poll(structpollfd*fds,nfds_tnfds,int timeout);功能:把所关心的文件描述符参加到structpollfd构造中,告诉内核我要非阻塞的读这个文件描述符,内核为我们判断,如果不阻塞,那么相应的状态,参数 1:struc
12、tpollfd intfd;/*所关心的文件描述符*/short events;/*告诉内核我要做什么:POLLIN:非阻塞的读*/short revents;/*内核返回的状态*/;参数 2:关心的描述符的个数 参数 3:愿意等待多长时间 -1 :一直等待 0 :表示愿意等待的时间 返回值:大于 0:表示至少有一个已经成功返回 =0 :表示超时 GPC0CON3-15-12 -0001=Output LED2-GPC0CON4-19-16 -0001=Output GPC0DAT:用于设置电平的上下 GPC0DAT3-GPC0CON15-12 led1 亮-高电平 1 GPC0DAT4-GP
13、C0CON19-16 led2-灭-低电平 0 Led:GPC0CON 存放器地址 0 xE0200060#define GPC0CON(*(volitale unsigned long*)0 xE0200060)GPC0DAT 存放器地址 0 xE0200064#define GPC0DAT(*(volitale unsigned long*)0 xE0200064)MMU 当开启了 MMU 之后,我们是不能直接访问到物理地址的。需要通过 ioreamp 把物 理地址映射为虚拟地址,我们只能通过虚拟地址操作硬件 Virt=ioremap(phy);intstrncasecmp(const c
14、har*s1,const char*s2,size_t n);比拟字符 s1 和 s2 的前 n 个字符是否相等,如果相等,那么返回 0 5.裸奔代码操作硬件过程 图 2-6 操作硬件流程图 页脚下载后可删除,如有侵权请告知删除!第三章 测试过程 3.1 测试 1用户登录 输入用户名和密码进展校验 2登录成功进入到用户操作界面如图3-1 所示 输入要控制硬件的命令:如:翻开 led1,那么输入 on1 关闭 led1,那么输入 off1 翻开音乐播放器,那么输入 song 获取温度,那么输入 get 退出,那么输入 quit 图 3-1 用户操作界面 页脚下载后可删除,如有侵权请告知删除!第四
15、章 工程拓展 4.1 工程拓展 目前本工程实现了通过客户端操作硬件,实现了点亮灯/蜂鸣器报警/音乐播放/温度数据采集功能。除用于温度监测外,在系统中的 ARM 外围可接入控制电路、其他性能的传感器甚至摄像头等,还可以实现多种其他特殊需要的远程监测及控制,如水位监测、视频监控等,具有十分广阔的应用背景。智能硬件框架如图4-1 所示 图 4-1 智能硬件框架图 页脚下载后可删除,如有侵权请告知删除!附录 效劳器模块:/*1.调用 socket 函数创立套接字。TCP 协议:SOCK_STREAM*/sockfd=socket(AF_INET,SOCK_STREAM,0);if(-1=sockfd)
16、perror(socket);return-1;/*填充效劳器信息*/struct sockaddr_in servaddr;memset(&servaddr,0,sizeof(servaddr);servaddr.sin_family=AF_INET;/PF_INET servaddr.sin_port=htons(PORT);/端口号(5001-65536)servaddr.sin_addr.s_addr=inet_addr(SERVERIP);/ip 地址 socklen_t adrlen=sizeof(servaddr);/*2.调用 bind 指定本地地址和端口。*/ret=bind
17、(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;printf(server init.d success.n);int newfd;char bufBUFSZ=0;pthread_t tid;while(1)/*4.调用 accept 从已连接列队中提取客户连接。*/页脚下载后可删除,如有侵权请告知删除!newfd=accept(soc
18、kfd,NULL,NULL);if(newfd tid :用于存放新建线程 ID =do_work:新建线程从这里开场执行 =newfd :传给执行函数的参数*/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
19、;int newfd=*(int*)arg;char*strerr=密码或者用户名输入有误!;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)/*发送命令给硬件*/if(!strncasecmp(buf,on1,3)cmd=LED_ON;val=3;else if(!strncasecmp(buf,on2,3)cmd=LED_ON;val
20、=4;else if(!strncasecmp(buf,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)if(pfd0.revents=POLLIN)interface_print(temp);/*从终端读取数据*/memset(buf,0
21、,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)/*接收效劳器发送的信息*/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);bre
22、ak;else perror(poll);break;/*6.调用 close 关闭连接。*/页脚下载后可删除,如有侵权请告知删除!close(sockfd);return 0;int login(void)char username100=0;char passwd100=0;int flags;int ret;char buf100;system(clear);/清屏 clear write(1,username:,strlen(username:);memset(username,0,sizeof(username);ret=read(0,username,sizeof(username
23、)-1);if(ret 0)write(sockfd,username,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;else flags=-1;r
24、eturn flags;页脚下载后可删除,如有侵权请告知删除!温度传感器驱动模块:static void Init_DS18B2O(void)/Init_DS18B2O unsigned int retvalue=1;writel(readl(gph1con)&0 xFFFFFFF0)|0 x1,gph1con);/gph1_0,output writel(readl(gph1dat)|0 x1,gph1dat);_udelay(1);writel(readl(gph1dat)&(0 xFFFFFFFE),gph1dat);_udelay(500);writel(readl(gph1dat)|
25、0 x1,gph1dat);_udelay(20);writel(readl(gph1con)&0 xFFFFFFF0,gph1con);/gph1_0,input _udelay(100);if(!(readl(gph1dat)&0 x01)retvalue=0;static int gpio_relrease(struct inode*inode,struct file*filp)iounmap(gph1con);iounmap(gph1dat);iounmap(gph1pud);iounmap(gpc0con);iounmap(gpc0dat);iounmap(gpc0pud);retu
26、rn 0;static unsigned char ReadOneChar(void)unsigned char i=0;unsigned char dat=0;spin_lock(&lock);for(i=8;i0;i-)dat=1;writel(readl(gph1con)&0 xFFFFFFF0)|0 x1,gph1con);/gph1_0,output writel(readl(gph1dat)&(0 xFFFFFFFE),gph1dat);页脚下载后可删除,如有侵权请告知删除!_udelay(2);/writel(readl(gph1con)&0 xFFFFFFF0,gph1con)
27、;/gph1_0,input _udelay(1);/if(readl(gph1dat)&0 x01)dat|=0 x80;_udelay(62);spin_unlock(&lock);return(dat);static void WriteOneChar(unsigned char dat)unsigned char i=0;writel(readl(gph1con)&0 xFFFFFFF0)|0 x1,gph1con);/gph1_0,output spin_lock(&lock);for(i=0;i=1;spin_unlock(&lock);static unsigned int Re
28、adTemp(void)unsigned char T_h=0;unsigned char T_l=0;unsigned int temp=0;writel(readl(gph1pud)&0 xFFFc)|0 x02,gph1pud);/gph1_0,pull-up 页脚下载后可删除,如有侵权请告知删除!enabled spin_lock(&lock);Init_DS18B2O();spin_unlock(&lock);_udelay(400);writel(readl(gph1con)&0 xFFFFFFF0)|0 x1,gph1con);/gph1_0,output writel(read
29、l(gph1dat)|0 x1,gph1dat);WriteOneChar(0 xcc);WriteOneChar(0 x44);mdelay(100);spin_lock(&lock);Init_DS18B2O();spin_unlock(&lock);_udelay(400);writel(readl(gph1con)&0 xFFFFFFF0)|0 x1,gph1con);/gph1_0,output writel(readl(gph1dat)|0 x1,gph1dat);WriteOneChar(0 xcc);WriteOneChar(0 xBE);T_l=ReadOneChar();/
30、L T_h=ReadOneChar();/H 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;return ret;页脚下载后可删除,如有侵权请告知删除!static struct file_operations gp
31、io_fops=.owner =THIS_MODULE,.open =gpio_open,.release =gpio_relrease,.unlocked_ioctl =gpio_ioctl,;static int _init gpio_init(void)int ret=0;if(gpio_major)devno=MKDEV(gpio_major,gpio_minor);ret=register_chrdev_region(devno,1,DEVICE_NAME);else ret=alloc_chrdev_region(&devno,0,1,DEVICE_NAME);gpio_major
32、=MAJOR(devno);if(ret 0)printk(KERN_WARNING%s%s:Unable to get major!n,DEVICE_NAME,_func_);goto err_devno;cdev_init(&cdev,&gpio_fops);cdev.owner=THIS_MODULE;ret=cdev_add(&cdev,devno,1);if(ret 0)printk(KERN_WARNING%s%s:Unable to add cdev!n,DEVICE_NAME,_func_);goto err_cdev;class=class_create(THIS_MODUL
33、E,fs210-gpio_class);if(IS_ERR(class)printk(KERN_WARNING%s%s:Fail to create classn,DEVICE_NAME,_func_);goto err_class;device_create(class,NULL,devno,NULL,DEVICE_NAME);printk(KERN_INFO Farsight FS210 GPIO Driver.n);页脚下载后可删除,如有侵权请告知删除!return 0;err_class:class_destroy(class);err_cdev:cdev_del(&cdev);err
34、_devno:unregister_chrdev_region(devno,1);return ret;static void _exit gpio_exit(void)device_destroy(class,devno);class_destroy(class);cdev_del(&cdev);unregister_chrdev_region(devno,1);页脚下载后可删除,如有侵权请告知删除!总结 回忆起此次课程设计,至今我仍感慨颇多,从理论到实践,在整整半个月的日子里,我学到很多很多的东西,不仅稳固了以前所学过的知识,而且学到了很多在书本上所没有学到过的内容。在实践期间遇到了很多的问题,例如:本次课程设计使用的 ds18b20 温度传感器,仅仅只有一个工作端口,但工作过程却很麻烦,理解它的工作过程是我花时间最长的。还有像驱动的编写,界面的设计,还有开发板的环境设置,运行命令等,十分麻烦,只要稍微有问题就不能正常运行。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才是真正的知识,才能提高自己的实际动手能力和独立思考的能力。