版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上课 程 设 计论文题目基于嵌入式Linux的温度采集系统 的设计与实现 学 院 专 业 班 级 学 号 学生姓名 指导教师 完成时间2016 年 5 月 专心-专注-专业摘要数据采集系统是信息科学的一个重要分支,它研究信息数据的采集、存储、处理以及控制等。本文提出采用嵌入式Linux作为操作系统,针对三星公司的S5PV210嵌入式处理器,设计一个嵌入式温度采集系统。论文在分析了Linux设备驱动程序的基本工作原理基础上,讨论了开发中经常会碰到的中断处理、拥塞处理、I/O端口,并在此基础上实现了基于S5PV210嵌入式处理器的开、读、写、关外部RAM的字符设
2、备驱动和网络驱动。结合高精度温度传感器DS18B20,实现温度的正确采集,并通过以太网络将数据上传给上位服务器。论文首先介绍了通信网络中各种设备特性、总线结构及传输技术,然后介绍根据单片机与PC机之间的串行通信原理,用ubantu完成数据采集系统的软件设计与实现,为用户提供一个友好的人机界面,对采集系统进行控制并显示采集后的数据。使用串口线传输数据,为数据采集系统和计算机之间的通讯开辟了新的道路。关键词:数据采集系统;以太网络;S5PV210;DS18B20I Design and Implementation of an Embedded Temperature Acquisition Sy
3、stem based 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 desig
4、n 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 s5pv210 embedded processor open, read, writ
5、e, 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 paper introduces the communication
6、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 with a friendly man-machin
7、e 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; S5PV210; DS18B20目录第一章 需求
8、分析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.1 代码调用过程代码调用过程如图所示:图2-1 代码调用图分析代码调用过程:0. 准备工作:1
9、. 先调用insmodled.ko插入模块2. register_chrdev注册字符设备驱动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 (系统库函数)1.
10、 Open 打开文件返回一个文件描述符2. Read 通过文件描述符fd,读取文件3. Write 通过文件描述符fd,写文件4. Close (进程结束的时候,会自动关闭,可以不必显示的调用close)阻塞:poll机制解决客户端如果要接收服务器回发的数据,则需要读取网络套接字,此时,客户端涉及到读终端和读服务器,而读终端和读服务器都是会阻塞的,所以调用poll机制解决。int poll(structpollfd *fds, nfds_tnfds, int timeout);功能:把所关心的文件描述符加入到structpollfd结构中,告诉内核我要非阻塞的读这个文件描述符,内核为我们判断,
11、如果不阻塞,则相应的状态,参数1 :structpollfd intfd; /*所关心的文件描述符 */ short events; /* 告诉内核我要做什么:POLLIN:非阻塞的读*/ short revents; /*内核返回的状态 */;参数2:关心的描述符的个数参数3:愿意等待多长时间-1 : 一直等待> 0 : 表示愿意等待的时间返回值:大于0 :表示至少有一个已经成功返回= 0 : 表示超时< 0 : 表示失败2.3 网络编程TCP(即传输控制协议):是一种面向连接的传输层协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信
12、)。适用情况:1适合于对传输质量要求较高,以及传输大量数据的通信。2在需要可靠数据传输的场合,通常使用TCP协议3MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议项目需求:1. Linux平台下a) 服务器(server)i. 等待连接客户端ii. 接收客户端发送的数据字符串和文件iii. 处理客户端发送的数据和命令iv. 发送处理结果给客户端b) 客户端i. 简单的界面ii. 从键盘接收用户输入命令iii. 发送数据或者命令给服务器iv. 接收服务器返回的结果c) 协议:tcp2. 实现编程a) TCP四次握手协议b) TCP编程模型图2-2 TCP编程模型图3. 网
13、络编程所需要的API函数a) 服务器i. Socketii. Bindiii. Listeniv. Acceptv. Read/readvi. Closeb) 客户端i. Socketii. Connectiii. 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; /*端
14、口号*/structin_addrsin_addr; /* IPV4地址internet address */; /* IPv4地址结构*/structin_addr uint32_t s_addr; /* address 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) 插入内核:
15、insmodled.ko b) 查看模块:lsmod c) 移除模块:rmmod led2.5 注册字符设备驱动static inline intregister_chrdev(unsigned int major, const char *name,conststructfile_operations *fops)功能:把设备注册,添加到字符设备的表格中图2-3 字符设备驱动图insmodled.ko调用内核驱动模块注册设备到内核字符设备管理注册表中图2-4 打开文件设备过程图2.6 操作硬件的过程:(裸奔代码)1. 找到外设(led),分析外设功能a) 原厂提供b) Google ,bai
16、du2. led原理图图2-5 led点灯流程图操作led的GPIO控制器,主要有以下两个:GPC0CON : 用于控制GPIO引脚输入还是输出GPC0CON32 LED1 ->GPC0CON3 -> 15-12 -> 0001 = Output LED2 ->GPC0CON4 -> 19-16 -> 0001 = OutputGPC0DAT : 用于设置电平的高低 GPC0DAT3 ->GPC0CON15-12 àled1 à亮 ->高电平1 GPC0DAT4 ->GPC0CON19-16 àled2 -&g
17、t;灭 ->低电平 0Led:GPC0CON寄存器地址0xE#define GPC0CON (*(volitale unsigned long *)0xE)GPC0DAT 寄存器地址0xE#define GPC0DAT (*(volitale unsigned long *)0xE)MMU当开启了MMU之后,我们是不能直接访问到物理地址的。需要通过ioreamp把物理地址映射为虚拟地址,我们只能通过虚拟地址操作硬件Virt = ioremap(phy);intstrncasecmp(const char *s1, const char *s2, size_t n);比较字符s1和s2的前
18、n个字符是否相等,如果相等,则返回05. 裸奔代码操作硬件过程图2-6 操作硬件流程图第三章 测试过程3.1 测试1用户登录输入用户名和密码进行校验2登录成功进入到用户操作界面(如图3-1所示)输入要控制硬件的命令:如:打开led1,则输入on1关闭led1,则输入off1打开音乐播放器,则输入song获取温度,则输入get退出,则输入quit图3-1 用户操作界面第四章 项目拓展4.1 项目拓展目前本项目实现了通过客户端操作硬件,实现了点亮灯/蜂鸣器报警/音乐播放/温度数据采集功能。除用于温度监测外,在系统中的ARM外围可接入控制电路、其他性能的传感器甚至摄像头等,还可以实现多种其他特殊需要
19、的远程监测及控制,如水位监测、视频监控等,具有十分广阔的应用背景。智能硬件框架(如图4-1所示)图4-1 智能硬件框架图附录服务器模块:/*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,sizeof(servaddr);servaddr.sin_family =
20、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 -1;/*3.调用listen启动监听。*/r
21、et = 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(sockfd,NULL,NULL);if(newfd <= 0)continue;printf("%d connect success.n",newfd
22、);/*为每个客户创建线程去维护它 => 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
23、 *arg)int ret;char bufBUFSZ;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)perror("open");retur
24、n (void *)-1;/*开辟一个线程不停的发送温度给客户*/pthread_t tid1;ret = pthread_create(&tid1,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(!st
25、rncasecmp(buf,"on2",3)cmd = LED_ON;val = 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(
26、ioctl(fd_led,cmd,(unsigned long)val) < 0)perror("ioctl failedn");exit(1);客户端模块:int main(int argc,char *argv)int ret;char bufBUFSZ = 0;char tempBUFSZ = "26."/*1.调用socket函数创建套接字。 TCP协议:SOCK_STREAM*/sockfd = socket(AF_INET,SOCK_STREAM,0);if(-1 = sockfd)perror("socket");
27、return -1;/*填充服务器信息*/struct sockaddr_in servaddr;memset(&servaddr,0,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 sockadd
28、r *)&servaddr,adrlen);if(-1 = ret)perror("connect");return -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(&qu
29、ot;登录成功.n");interface_print(temp);/*5.调用I/O函数(read/write)与客户端通讯。*/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)
30、;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");break;/*6.调用c
31、lose关闭连接。*/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
32、 > 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",b
33、uf);if(!strncmp(buf,"ok",2)flags = 0;elseflags = -1;return flags;温度传感器驱动模块: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) &(
34、0xFFFFFFFE), gph1dat);_udelay(500);writel(readl(gph1dat) | 0x1 , gph1dat);_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);
35、iounmap(gph1pud);iounmap(gpc0con);iounmap(gpc0dat);iounmap(gpc0pud);return 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) &
36、amp;(0xFFFFFFFE), gph1dat);_udelay(2);/writel(readl(gph1con) & 0xFFFFFFF0, 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)
37、| 0x1, gph1con);/gph1_0,outputspin_lock(&lock);for(i=0;i<8;i+)writel(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
38、);dat>>=1;spin_unlock(&lock);static unsigned int ReadTemp(void)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(gph1co
39、n) & 0xFFFFFFF0) | 0x1, gph1con);/gph1_0,outputwritel(readl(gph1dat) | 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(gph1d
40、at) | 0x1 , gph1dat);WriteOneChar(0xcc);WriteOneChar(0xBE);T_l=ReadOneChar();/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 (gpio_major) devno = MKDEV
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《自动控制原理》课件第5章
- 对河水污染报告 范文
- 2025年哈尔滨货运从业资格考试题目和答案大全
- 人物实践调研报告范文
- 社会实践报告表范文
- 2025年昌都货运从业资格模拟考试题
- 2025年赣州b2考货运资格证要多久
- 2025年湖北货运从业资格证考试题库工具箱
- 2025年北京年货运从业资格证考试题库
- 小儿糖尿病的饮食护理
- 广东省深圳市龙岗区2023-2024学年高一年级上册1月期末考试 物理试题(含解析)
- 2024年全国营养师技能大赛(云南赛区)理论考试原题库(含答案)
- 劳务派遣外包人力资源采购投标方案(技术方案)
- 天津市勘察设计院集团有限公司招聘笔试题库2024
- 4.4 对数函数(精练)(解析版)-人教版高中数学精讲精练必修一
- 2024年秋季学期新湘教版七年级上册数学课件 第4章 图形的认识 4.1 立体图形与平面图形
- 天翼云高级解决方案架构师认证资格考试题库及答案
- 项目学习主题活动(二) 天宫空间站轨道长度变了多少
- 2024人形机器人产业半年研究报告
- 石油钻采设备招标合同三篇
- 行道树的选择标准(2023年甘肃中考语文试卷说明文阅读题及答案)
评论
0/150
提交评论