短距离无线数据传输系统论文_第1页
短距离无线数据传输系统论文_第2页
短距离无线数据传输系统论文_第3页
短距离无线数据传输系统论文_第4页
短距离无线数据传输系统论文_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

1、短距离无线数据传输系统摘要:本文介绍一种基于WiFi模块和Real6410开发板的短距离无线数据传输系统,利用USB接口,完成了无线数据传输系统的数据发射和接收过程.该系统数据传输速度快、可靠性高、可扩展性强,可广泛应用于各种短距离无线数据通信中。关键字:无线数据传输、短距离、终端、虚拟机一:前言现代通信技术的迅速发展使得许多应用领域都采用无线通信方式进行数据传输。随着网络及通信技术的飞速发展,人们对无线通信的需求越来越大,人们在享受蜂窝移动通信系统带来的便捷的同时,对短距离的无线通信又提出了新的需求,这释短距离的无线通信主要用于家庭、办公室、商场等室内场所,有时也用于室外环境。这种技术的应用

2、大大改善了人们的生活与工作质量,对现有的无线长距离通信技术是一个很好的补充。同时又由于无线频率资源的日渐珍贵,电子产品市场需求的激增,这其中的无线短距离通信技术更是受到了各国工业界和研究机构的广泛关注。短距离无线数据传输最流行的标准有蓝牙(Bluetooth),8021lbfW一Fi)帮IrDA,这些协议和标准各有优劣,各有自己擅长的应用领域,有的适合于办公环境,有的适合于个人应用,有的则更适合家庭用户。 本文采用的是REAL6410开发板自带的Wifi模块通过路由器传输数据,通过在Linux下编写两个socket的程序:server和client进行通信。网络的Socket数据传输是一种特殊

3、的I/O口,socket也是一种文件描述符socket也有一个类似于打开文件的函数:socket(),调用socket(),该函数返回一个整型的socket的描述符,随后的连接建立、数据传输等操作也都是通过该socket实现。通信时,服务端进行监听,在收到客户端的连接后,发送数据给客户端;客户端在接受到数据后打印出来,然后关闭。在本次综合实践中,我们只能实现本机通信,采用了回环地址。二:硬件、软件及操作系统的介绍2.1 Real6410开发板Real6410开发板是华天科技推出的高性能、高集成、广扩展的一体化开发板。Real6410由底板和核心板两部分组成。其中核心板命名为E6Cor

4、e。该板具有配置高端、外设接口多、性能稳定、抗干扰能力强等特点。此外,Real6410开发板配有256M超大内存,彻底解决了以往开发板内存不足的问题。也正是如此,Real6410开发板成功地将开发和学习集合于一体,因而备受企业用户和高校推崇,是当今国内外性价比最好的ARM11开发系统。2.2 S3C6410芯片S3C6410 是 SAMSUNG公司基于ARM1176的 16/32 位的高性能低功耗的 RSIC 通用微处理器,适用于手持、移动等终端设备。S3C6410 是一款低功率、高性价比、高性能的用于移动电话和通用处理RSIC 处理器。为 2.5G 和 3G 通信服务提供了优化的硬件性能,采

5、用 64/32bit 的内部总线架构,融合了AXI、AHB、APB 总线。还有很多强大的硬件加速器,包括运动视频处理、音频处理、2D加速、显示处理和缩放。一个集成的MFC(Multi-Format video Codec)支持 MPEG4/H.263/H.264 编解码和 VC1 的解码,这个硬件编解码器支持实时的视频会议以及 NTSC和 PAL 制式的 TV 输出。此外还内置一个采用最先进技术的 3D 加速器,支持 OpenGL ES1.1/ 2.0 和 D3DM API 能实现 4M triangles/s 的 3D 加速。S3C6410 包括优化的外部存储器接口,该接口能满足在高端通信服

6、务中的数据带宽要求。接口分为两路,DRAM 和 Flash/ROM/DRAM 端口。DRAM 端口可以通过配置来支持Mobile DDR、DDR、Mobile SDRAM、SDRAM。Flash/ROM/DRAM 端口支持 NOR-Flash,NAND-Flash,OneNAND,CF,ROM 等类型的外部存储器和任意的 Mobile DDR、DDR、Mobile SDRAM、SDRAM 存储器。2.2.1时钟信号的产生6410需要四路时钟信号,分别如下1、主时钟,12MHZ 2、Video时钟信号27HZ,用于显示模块,如MFC LCD TV模块提供时钟信号3、USB时钟,48MHZ,用于U

7、SB SD卡SDIO提供时钟信号4、RTC时钟,32.768KHZ,用于实时时钟模块提供时钟信号其是1 2 3可以选择用有源晶振还是无源晶振,除主时钟外,2和3都需要做CPU寄存器的配置才能产生相应的时钟,即选择无源还是有源的。而主时钟用的是有源的还是无源的,由OM0引脚来配置,当OM0拉高时,使用无源晶振,当置低时,使用有源晶振,当使用无源晶振时,XEXTCLK引脚需要拉高。综上所要求,设计如下所示,由于成本考虑,采用无源晶振2.2.2 Wifi模块模块要求3.3V供电,我们采用LDO LM1117-3.3为WIFI模块供电。SD通道0接至WIFI模块的SD接口,图中LED2为连接指示灯,当

8、连接时,LED2会闪烁,连接成功后,LED2灯常亮。由于模块是默认是SD卡接口连接,所以接口选择可以不接。模块的RESET引脚可以接至CPU的复位引脚,也可以不接。PDn引脚是上电使能引脚,模块默认拉高,低电平关闭模块供电。SD0通道0也接在iNAND上,两者不能同时使用SD0,所以当使用iNAND时,不能使用WIFI模块,反之亦然。2.3 NRF24L01无线收发模块2.3.1简介nRF24L01是一款新型单片射频收发器件,工作于2.4 GHz2.5 GHz ISM频段。内置频率合成器、功率放大器、晶体振荡器、调制器等功能模块,并融合了增强型ShockBurst技术,其中输出功率和通信频道可

9、通过程序进行配置。nRF24L01功耗低,在以-6 dBm的功率发射时,工作电流也只有9 mA;接收时,工作电流只有12.3 mA,多种低功率工作模式(掉电模式和空闲模式)使节能设计更方便。2.3.2工作原理发射数据时,首先将nRF24L01配置为发射模式:接着把接收节点地址TX_ADDR和有效数据TX_PLD按照时序由SPI口写入nRF24L01缓存区,TX_PLD必须在CSN为低时连续写入,而TX_ADDR在发射时写入一次即可,然后CE置为高电平并保持至少10s,延迟130s后发射数据;若自动应答开启,那么nRF24L01在发射数据后立即进入接收模式,接收应答信号(自动应答接收地址应该与接

10、收节点地址TX_ADDR一致)。如果收到应答,则认为此次通信成功,TX_DS置高,同时TX_PLD从TX FIFO中清除;若未收到应答,则自动重新发射该数据(自动重发已开启),若重发次数(ARC)达到上限,MAX_RT置高,TX FIFO中数据保留以便在次重发;MAX_RT或TX_DS置高时,使IRQ变低,产生中断,通知MCU。最后发射成功时,若CE为低则nRF24L01进入空闲模式1;若发送堆栈中有数据且CE为高,则进入下一次发射;若发送堆栈中无数据且CE为高,则进入空闲模式2。 接收数据时,首先将nRF24L01配置为接收模式,接着延迟130s进入接收状态等待数据的到来。当接收方检测到有效

11、的地址和CRC时,就将数据包存储在RX FIFO中,同时中断标志位RX_DR置高,IRQ变低,产生中断,通知MCU去取数据。若此时自动应答开启,接收方则同时进入发射状态回传应答信号。最后接收成功时,若CE变低,则nRF24L01进入空闲模式1。在写寄存器之前一定要进入待机模式或掉电模式,如下图spi操作机时序图 图2.5 SPI 写操作2.4 Linux系统 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和64位硬件。Linux继承

12、了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。它主要用于基于Intel x86系列CPU的计算机上。这个系统是由全世界各地的成千上万的程序员设计和实现的。其目的是建立不受任何商品化软件的版权制约的、全世界都能自由使用的Unix兼容产品。 Linux以它的高效性和灵活性著称,Linux模块化的设计结构,使得它既能在价格昂贵的工作站上运行,也能够在廉价的PC机上实现全部的Unix特性,具有多任务、多用户的能力。Linux是在GNU公共许可权限下免费获得的,是一个符合POSIX标准的操作系统。Linux操作系统软件包不仅包括完整的Linux操作系统,而且还包括了文本

13、编辑器、高级语言编译器等应用软件。它还包括带有多个窗口管理器的X-Windows图形用户界面,如同我们使用Windows NT一样,允许我们使用窗口、图标和菜单对系统进行操作。2.5 嵌入式系统 嵌入式系统是一种以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。它主要由嵌入式微处理器、外围硬件设备、嵌入式操作系统和特定的应用程序四部分组成。嵌入式系统具有系统内核小、专用性强、系统精简、实时性和可靠性高等特点,因而受到了人们的一致好评。2.6 VMware Workstation VMw

14、are Workstation 是VMware公司提供的一款功能强大的桌面虚拟计算机软件,此软件可以提供虚拟机功能,使计算机可以同时运行多个不同操作系统。用户可在单一的桌面上同时运行不同的操作系统,和进行开发、测试 、部署新的应用程序的最佳解决方案。VMware Workstation 可在一部实体机器上模拟完整的网络环境,以及可便于携带的虚拟机器,具有极强的灵活性和实用性,是当今IT领域开发人员的必备工具之一。2.7 Ubuntu Ubuntu 是一个由全球化的专业开发团队建造的操作系统它包含了:浏览器、Office套件、

15、多媒体程序、即时消息等应用程序。由于Ubuntu 项目完全遵从开源软件开发的原则,并且鼓励人们使用、完善并传播开源软件,因而Ubuntu操作系统有着十分广阔的应用领域。三:设计方案3.1设计思路 本次用到的数字采集系统,是用S3C6410的ADC模块定时地从AIN引脚采集电压信号,经模/数 转 换 器ADC采样、量化、编码后,成为数字信号,存入数据存储器,或通过无线方式将数据发送给接收端进行处理。无线数据传输系统就是这样一套利用无线手段,将采集的数据由测量站发送出去。在本系统中采用无线传输模块NRF24L01。短距离无线数据传输系统分以下几个模块1、定时模块:使用硬件RTC作为定时装

16、置;2、电压采集模块:使用实验板上S3C6410的ADC采集电压信号;3、数据接收、发送模块:nRF2401数传模块、wifi模块作为无线传输模块;4、存储模块:将采集到的电压信号存储到TXT文本中;5、显示模块:无图形界面;3.2数据采集程序流程图:四:软件配置过程4.1 Tftp服务器的建立sudo apt-get install tftp tftpd /安装tftp/目录下建一个 tftpboot, 把属性改成 777cd / /转至根目录sudo mkdir tftpboot /新建tftp文件夹sudo chmod 777 tftpboot /改名在建立过程执行到该步骤时,由于在et

17、c中缺少inetd.conf文件,需要先执行sudo apt-get install openbsd-inetd /下载安装软件包的简单命令行接口sudo apt-get install telnetdsudo gedit /etc/inetd.conf 先建立这样的一个文件sudo vi /etc/inetd.conf将tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd /tftpboot添加到inetd.conf中重启服务器sudo /etc/init.d/openbsd-inetd restartsudo i

18、n.tftpd -l /tftpboot测试tftp服务器在/tftpboot 文件夹下新建立一个文件cd /tftpboottouch test进入另外一个文件夹tftp> tftp get test服务器建立完成4.2 nfs配置过程sudo apt-get install nfs-kernel-server nfs-common rpcbind /安装nfs客户端sudo service rpcbind start /启动客户端showmount e /显示nfs客户端输出清单配置 /etc/exports将/nfsboot *(rw,sync,no_root_

19、squash)添加到exportssudo exportfs r /更新exports文件sudo /etc/init.d/nfs-kernel-server restart /重启客户端sudo mount -t nfs 31:/nfsboot / /mnt /客户端挂载df /显示挂载情况sudo umount /mnt /取消挂载4.3交叉编译环境的安装与配置mv /home/liyuhuan/桌面/arm-2008q3.tar.bz2 /root/ /解压包移至root下tar -xjvf arm-2008q3.tar.bz2 (或右键单击提取文件) /解压文件

20、gedit /etc/bash.bashrc /打开待编译文本文件source /etc/bash.bashrc /启动待编译文件arm-linux-gcc v /完成交叉编译在打开编译文本中加入PATH=/root/ arm-2008q3/bin:$PATH export PATH,保存完成即可4.4mkcramfs的安装将root_mkfs.tar.bz2移动到/usr/local/bin下先将文件移动到桌面,再往相应文件夹里移命令如下:Mv /home/liyuhuan/桌面/ root_mkfs.tar.bz2 /usr/local/bin/Mkcramfs配置命令如下:mv /hom

21、e/liyuhuan/桌面/root_mkfs.tar.bz2 /usr/local/bin/ /移动文件apt-get install cramfsprogs /文件安装mkcramfs /文件执行既可以完成mkcramfs的安装4.5Uboot配置与编译Mv home/tmp/ VMwareDnD /s3c-u-boot-1.1.6-Real6410.tar.bz2 /home/liyuhuantar jxvf s3c-u-boot-1.1.6-Real6410.tar.bz2home/liyuhuan/s3c-u-boot-1.1.6-Real6410./make_nand_image

22、/在s3c-u-boot-1.1.6-Real6410 目录下产生u-boot.bin,home/liyuhuan/s3c-u-boot-1.1.6-Real6410 ./make_mmc_image /在s3c-u-boot-1.1.6-Real6410 目录下产生u-boot_mmc.binuboot配置编译完成4.6uboot 烧写烧写 SD 启动uboota:打开tools/IROM_Fusing_Tool 工具。b:选择SD卡所在盘符以及要烧录的文件u-boot_mmc.bin。c:点击START,进行烧写。d:开启tools/DWN应用程序,用USB转串口线连接计算机和实验箱并在W

23、indows上查找驱动的链接口标号。e:对DWN进行配置后点击connect进行连接。f:格式化 NandFlash选择选项 f(格式化flash)g:烧写 NandFlash 启动的 uboot选择选项 u(下载固化在Nandflash中的u_boot.bin镜像)à 添加USB驱动(/tools/USB驱动/secusb2.sys))à加载u-boot.bin文件(完成烧写 NandFlash 启动的 uboot工作)h:烧写 Linux 内核选择选项 k(下载Linux Kernel文件zImage)à加载linuxlinux-imagezImage(完成L

24、inux核的烧写,下载root_mkfs.cramfs镜像)àqi:烧写 cramfs 根文件系统选择选项c à加载linuxlinux-imageroot_mkfs.cramfs(完成cramfs 根文件系统)j:烧写 ubifs 根文件系统复制linuxlinux-imageqtopia.tar.gz到SD卡 à 选择选项q à 进行屏幕校准uboot 配置与编译4.7Linux内核的编译(1)zImage镜像文件的生成cd /home/liyuhuan/linux/s3c-linux--Real6410 /解压cp Real6410

25、-3c.config .configapt-get install lie libncurses5-dev / 加载配置库文件make menuconfig /生成配置菜单make zImage /生成镜像文件(2)kconfig文件的配置在kconfig文件中加入命令将config S3C_AESbool "S3C AES support"depends on CPU_S3C6410default nhelp Say Y here if you want to use the S3C AES复制在endmenu上面修改如下:config LEDtristate "

26、;Real6410 leds support"depends on CPU_S3C6410default mhelp Say Y here if you want to use the S3C AESMakefile文件配置(3)在Makefile文件中obj-y +=led.oobj-$(CONFIG_LEGACY_PTYS)+= pty.o修改如下:obj-$(CONFIG_LED)+=led.oobj-$(CONFIG_LEGACY_PTYS)+= pty.o(4)动态链接配置real6410-3c文件中查找char如下文件CONFIG_MTD_CHAR=yCONFIG_MTD

27、_BLKDEVS=y修改如下:CONFIG_LED=m /配置后可生成.KO文件CONFIG_MTD_CHAR=yCONFIG_MTD_BLKDEVS=y(5)生成模块在终端执行Make modules指令4.8 ADC模块驱动配置(1)将“adc.c”与“adc.h”放在“drivers à char”下(2)在“char”下的Makefile文件开头添加如下指令:FONTMAPFILE = cp437.uniobj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o tty_buffer.o tty_port.

28、oobj-$(CONFIG_S3C6410_ADC)+= adc.oobj-y+= tty_mutex.o(3)在“char”下的在“Kconfig”文件中加入如下指令:config S3C6410_ADC tristate "S3C6410 ADC's driver" depends on (CPU_S3C6400 | CPU_S3C6410)default y -help- (4)删除起先存在的“.config”,并执行“cp Real6410_3d.config .config”指令(5)执行“make menuconfig”指令(6)在开启的配置菜单中的“L

29、oad an Alternate Configuration File”选项下载入“Real6410_3d.config”并作如下修改“Device Drivers à Character devices à <M> S3C6410 ADC's driver”(7)执行“make modules”命令生成“adc.ko”文件(8)编写“.sh”文件,简化开启adc驱动的过程#!/bin/shcp /mnt/sdcard/adc/adc.ko /lib/modules/ /复制驱动准备开启modprobe adc /加载adc模块,开启驱动

30、lsmod /显示所加载的模块cd /mnt/sdcard/adc /转入驱动所在文件夹方便指令开启4.9minicom的安装与nfs挂载命令(1):将编辑链接中的ipv4设置中方法改为“手动“,地址设置为11,子网掩码为(2):网络适配器仍为桥接方式,且打钩“复制物理机地址”(3):用ifconfig查看板子IP,并相互ping同(4):下载minicom软件,并查看网络配置(注意:一般/dev/ttyUSBS0为超级终端接口)(相关网址:(5):在终端下输入cp /home/liyuhuan/linux/helloworld1 /nfsboo

31、t/liyuhuan(helloworld1是在arm-linux-gcc -o helloworld1 helloworld.c生成的可执行文件,可以在LED屏上执行)helloworld.c文件#include <stdio.h>int main(int argc, char *argv)printf("Hello, World!n");(6):在超级终端下输入minicom,执行如下挂载命令:mount -o nolock 11:/nfsboot/ /mnt/nfs,在显示屏上执行cd /mnt/nfs/liyuhuan,ls 显示h

32、elloworld1(7):在显示屏上执行./helloworld1,会看到hello,world !4.10 WLAN的启动与配置 搜索 /proc 目录,在/net目录下发现 wireless文件,说明wlan模块及驱动已经加载 执行 iwconfig 命令,查找wlan模块,在eth1 执行 ifconfig eth1 up,打开wlan 执行 iwlist scanning,查找可用的无线网接入点 执行 iwconfig

33、0;eth1 essid Diaosi,连接路由器(可能需要 iwconfig eth1 channel ?、iwconfig eth1 key off) 执行 iwconfig,查看连接状况 执行 ifconfig eth1  双机互ping,成功(板子上arp协议有问题,需要手动添加arp项,命令:arp s  9C:21:6A:7F:72:E8,路由器端的a

34、rp也最好设置一下。)附:路由器设置 无线名称为ds 信道固定 模式11b only 不开启无线安全 关闭WMM,关闭AP隔离 关闭DHCP 重启无线 查看系统路由表,确定网关、子网掩码、子网地址电脑连接设置: 手动指定ip地址,11 子网掩码  默认网关 11 DNS:(任意)4.11 24L01无线模块驱动配置(1)将“24L01.c”与“24L01.h”放在

35、“drivers à char”下(2)在“char”下的Makefile文件开头添加如下指令:FONTMAPFILE = cp437.uniobj-y += mem.o random.o tty_io.o n_tty.o tty_ioctl.o tty_ldisc.o tty_buffer.o tty_port.oobj-$(CONFIG_24L01)+= 24L01.oobj-y+= tty_mutex.o(3)在“char”下的在“Kconfig”文件中加入如下指令:config 24L01 tristate "S3C6410 24L01's driver&q

36、uot; depends on (CPU_S3C6400 | CPU_S3C6410)default y -help- (4)执行“make menuconfig”指令(5)删除起先存在的“.config”,在开启的配置菜单中的“Load an Alternate Configuration File”选项下载入“Real6410_3d.config”并作如下修改“Device Drivers à Character devices à <M> S3C6410 24L01's driver”(6)并执行“cp Real6410_3d.config .co

37、nfig”指令(7)执行“make modules”命令生成“24L01.ko”文件(8)编写“.sh”文件,简化开启adc驱动的过程#!/bin/shcp /mnt/sdcard/24L01/24L01.ko /lib/modules/ /复制驱动准备开启modprobe 24L01 /加载adc模块,开启驱动lsmod /显示所加载的模块cd /mnt/sdcard/24L01 /转入驱动所在文件夹方便指令开启五:主程序(1) ADC定时采集实现主程序:float timeuse; /定义当前累加时间float timeuse1; /定义上一次采集的累加时间 float t

38、imeused; /定义定时时间间隔 static timer_count = 0;int sockClient;char buf5;void adc1 () /adc1()电压采集函数int fd = open("/dev/s3c6410_adc",O_RDWR); /打开"/dev/s3c6410_adc"/printf("*%d*n",fd);if(fd < 0)printf("open ADC device failed!n");exit(1);int i = 1; /定时时间内采集一次int ret

39、;time_t t = time(NULL); int data;unsigned int port = 0;int k=1;ioctl(fd,ADC_SET_PRSCVL,200); / ioctl是设备驱动程序中对设/备的I/O通道进行管理的函数,返回值:成功为0,出错为-1;while(i-)port = 0 ;ret = ioctl(fd,ADC_SET_SEL_MUX,port);ioctl(fd,ADC_SET_RESSEL,12);if(ret < 0 )switch(errno)case EFAULT:printf("argp references an ina

40、ccessible memory area.n");break;case EINVAL:printf("Request or argp is not valid.n");break;case ENOTTY:printf("d is not associated with a character special device.n");break;default:printf("undefined error!n");break;/perorr("the value of ioctl is %d n",ioc

41、tl(fd,port,1);ret = read(fd,&data,sizeof(data);if(ret != sizeof(data)printf("%f erorrn",errno);if(errno != EAGAIN)printf("read ADC device failed!n");continue;elsesprintf(buf,"%d",(int)data);send(sockClient,buf,strlen(buf),0);close(fd);void prompt_info(int signo) /定时

42、程序time_t t = time(NULL); /每两秒采集一次,并输出printf("%d prompt_info calledn", +timer_count); /输出"prompt_info called"printf(" current time %s", ctime(&t); /显示当前时间gettimeofday(&tpend,NULL);timeuse1=timeuse; timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpsta

43、rt.tv_usec; timeuse/=1000000;timeused=timeuse-timeuse1; adc1 (); /调用上述的电压采集函数,输出采集电压printf(" Used Time:%fn",timeused); /输出间隔时间void init_sigaction(void) struct sigaction act; act.sa_handler=prompt_info; / 信号到了要执行的任务处理函数为prompt_infoact.sa_flags=0; sigemptyset(&act.sa_mask); /初始化信号集sigact

44、ion(SIGPROF,&act,NULL); /建立信号处理机制gettimeofday(&tpstart,NULL); /开始计时void init_time() struct itimerval value; value.it_value.tv_sec=2; /设定执行任务的时间间隔为2秒0微秒value.it_value.tv_usec=0; value.it_interval=value.it_value; /设定初始时间计数也为2秒0微秒setitimer(ITIMER_PROF,&value,NULL); /设置计时器ITIMER_REAL void so

45、cket_init() sockClient=socket(AF_INET,SOCK_STREAM,0);struct sockaddr_in addrSrv; addrSrv.sin_addr.s_addr=inet_addr("");/网络服务器IP(由于这个程序是在本机上运行只能用这个)addrSrv.sin_family=AF_INET; /设置本机IPaddrSrv.sin_port=htons(uint16_t)123456); /设置端口connect(sockClient,(struct sockaddr*)&addrSrv,siz

46、eof(struct sockaddr);/连接服务器六:实现未能解决的问题(1)本次设计要求使用两种方法传输数据:nRF2401数传模块作为无线传输模块;使用WiFi模块通过路由器传输数据。但是我们小组仅实现利用WiFi模块通过路由器传输数据,第一种方法没能实现,原因是驱动程序未能解决,由于两机之间wifi无法连接,只能实现本机两个终端利用回环地址实现数据传输。(2)数据存储可以使用自定义格式文件,也可采用某种嵌入式数据库(如SQLite)。我们小组成员冯媛媛开始对嵌入式数据库有相关研究,但是由于有一定难度,另外其他很多问题亟待解决,以至于我们没采用嵌入式数据库方式,在发送

47、程序中加入了存储程序,存在一个文本中,但只能实现最后一个数据的存储,前面的数据都被覆盖,一直没有解决掉。(3)程序界面可以有多种方式:无图形界面方式、自建图形界面方式、Qtopia界面方式、Android界面方式。由于时间有限,我们小组只实现无图形界面方式,其他界面方式有待研究实现。七:实验心得短距离无线数据传输系统的实现有效地简化了数据传输的复杂性,可以给人们的生活和工作带来极大的方便,同时也是无线产业发展中的一项新的突破,本文只是简单的介绍了它的实现过程,而其日后的推广与发展还要经过不懈的努力,只有不断地完善和创新才能使我们的成果得以广泛应用,相信在不远的未来,短距离无线数据将会在更多人的

48、努力下得到更好地发展,让我们一起期待吧! 参考文献1 冯国进Linux驱动程序开发实例机械工业出版社199524(1):161-1642 周立功 陈明计等ARM嵌入式Linux系统构建与驱动开发范例【M】北京航空航天大学出版社20063 陈文智嵌入式系统开发与原理实践【M】清华大学出版社20064 美约瑟H多尔著,张林升等译教育新理念教育科学出版社199878.4 ClaudiaSalzberg Rodiaguez Linux内核编程M机械工业出版社2006附录:Ad_send.c实现源代码#include <sys/time.h> #include <signal.h>

49、; #include <stdlib.h>#include <errno.h>#include <sys/ioctl.h>#include <linux/fcntl.h>#include <linux/ioctl.h> #include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <unistd.h>#include <netinet/in.h>#include <arpa/inet.h

50、>#include <stdio.h>#define ADC_IOC_MAGIC 100/*在代码中使用不同的8位数字*/#define ADC_SET_SEL_MUX _IO(ADC_IOC_MAGIC,0) /设置通道#define ADC_SET_RESSEL _IO(ADC_IOC_MAGIC,1) /设置ADC精度define ADC_SET_PRSCVL _IO(ADC_IOC_MAGIC,2) /设置预分频率struct timeval tpstart,tpend; float timeuse; /定义当前累加时间float timeuse1; /定义上一次采集

51、的累加时间 float timeused; /定义定时时间间隔 static timer_count = 0;int sockClient;char buf5;void adc1 () /adc1()电压采集函数int fd = open("/dev/s3c6410_adc",O_RDWR); /打开"/dev/s3c6410_adc"/printf("*%d*n",fd);if(fd < 0)printf("open ADC device failed!n");exit(1);int i = 1; /定时时

52、间内采集一次int ret;time_t t = time(NULL); int data;unsigned int port = 0;int k=1;ioctl(fd,ADC_SET_PRSCVL,200); / ioctl是设备驱动程序中对设/备的I/O通道进行管理的函数,返回值:成功为0,出错为-1;while(i-)port = 0 ;ret = ioctl(fd,ADC_SET_SEL_MUX,port);ioctl(fd,ADC_SET_RESSEL,12);if(ret < 0 )switch(errno)case EFAULT:printf("argp refe

53、rences an inaccessible memory area.n");break;case EINVAL:printf("Request or argp is not valid.n");break;case ENOTTY:printf("d is not associated with a character special device.n");break;default:printf("undefined error!n");break;/perorr("the value of ioctl is %

54、d n",ioctl(fd,port,1);ret = read(fd,&data,sizeof(data);if(ret != sizeof(data)printf("%f erorrn",errno);if(errno != EAGAIN)printf("read ADC device failed!n");continue;elsesprintf(buf,"%d",(int)data);send(sockClient,buf,strlen(buf),0);close(fd);void prompt_info(i

55、nt signo) /定时程序time_t t = time(NULL); /每两秒采集一次,并输出printf("%d prompt_info calledn", +timer_count); /输出"prompt_info called"printf(" current time %s", ctime(&t); /显示当前时间gettimeofday(&tpend,NULL);timeuse1=timeuse; timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; timeuse/=1000000;timeused=timeuse-timeuse1; adc1 (); /调用上述的电压采集函数,输出采集电压printf(" Used Time:%f

温馨提示

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

评论

0/150

提交评论