![嵌入式Linux编程入门与开发实例-嵌入式车载终端的设计-课件_第1页](http://file4.renrendoc.com/view/e75619fda7734968d73a91d9c440b37a/e75619fda7734968d73a91d9c440b37a1.gif)
![嵌入式Linux编程入门与开发实例-嵌入式车载终端的设计-课件_第2页](http://file4.renrendoc.com/view/e75619fda7734968d73a91d9c440b37a/e75619fda7734968d73a91d9c440b37a2.gif)
![嵌入式Linux编程入门与开发实例-嵌入式车载终端的设计-课件_第3页](http://file4.renrendoc.com/view/e75619fda7734968d73a91d9c440b37a/e75619fda7734968d73a91d9c440b37a3.gif)
![嵌入式Linux编程入门与开发实例-嵌入式车载终端的设计-课件_第4页](http://file4.renrendoc.com/view/e75619fda7734968d73a91d9c440b37a/e75619fda7734968d73a91d9c440b37a4.gif)
![嵌入式Linux编程入门与开发实例-嵌入式车载终端的设计-课件_第5页](http://file4.renrendoc.com/view/e75619fda7734968d73a91d9c440b37a/e75619fda7734968d73a91d9c440b37a5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第11章嵌入式车载终端的设计
随着社会的快速发展以及人民生活水平的提高,汽车及相关产业在整个国民经济中的地位变得越来越重要。数字信息技术以及网络技术的高速发展,使人民在追求驾驶舒适性、便利性的同时,汽车的自动化、智能化和网络化也相应地被提上了日程。车载终端是车辆导航、管理、监控和调度等ITS应用的基础,智能的车载终端为驾驶员提供了集通信,多媒体播放,导航,娱乐为一体的多种服务。车载移动多媒体系统的研制和产业化的实施,对发展车载移动多媒体应用信息产业,带动相关产业的共同发展具有十分重要的意义。
1ppt课件第11章嵌入式车载终端的设计
车载终端的硬件平台
11.1嵌入式开发环境的建立
11.2嵌入式车载终端软件的开发
11.32ppt课件11.1车载终端的硬件平台本设计选择的是SamSung的S3C2440A做为处理芯片,基于ARM920T内核,400MHz;S3C2440A的CPU内核采用的是ARM公司设计的16/32位ARM920TRISC处理器。ARM920T实现了MMU、AMBA总线和Harvard高速缓存体系结构,该结构具有独立的16KB指令Cache和16KB数据Cache。3ppt课件本设计的车载定位终端由GPRS模块、、嵌入式微处理器和存储器、显示单元、电源与复位电路、存储器、JTAG等必需的外围电路等组成。嵌入式微处理器是整个车载定位终端的核心,负责控制整个系统。GPS模块接收卫星信号,车载定位终端通过GPRS模块和车辆监控中心进行双向的信息传输,将车辆的位置和状态信息传送到车辆监控中心,同时接收车辆监控中心的指令数据。车载终端的结构框图如图11-1所示。4ppt课件图11-1车载终端的结构框图5ppt课件
S3C2440A是著名的半导体公司SAMSUNG推出的一款16/32位RISC微处理器,它为手持设备和一般类型的应用提供了低价格、低功耗、高性能微控制器的解决方案。S3C2440A采用了ARM920T的内核,0.13um的CMOS标准宏单元和存储器单元。其低功耗、简单、且全静态设计特别适合于对成本和功率敏感型的应用。它采用了新的总线架构AdvancedMicrocontrollerBusArchitecture(AMBA)。S3C2440A的最大特点是其核心处理器(CPU)是一个由AdvancedRISCMachines有限公司设计的16/32位ARM920T的RISC处理器。ARM920T实现了MMU,AMBABUS和Harvard高速缓冲体系结构。这一结构具有独立的16KB指令Cache和16KB数据Cache。每个都是由具有8字长的行组成。通过提供一套完整的通用系统外设,S3C2440A减少整体系统成本和无需配置额外的组件。
11.1.1S3C2440A微处理器6ppt课件S3C2440A集成的以下片上功能主要包括:1.2V内核供电,1.8V/2.5V/3.3V存储器供电,3.3V外部I/O供电具备16KB的I-Cache和16KBDCache/MMU。外部存储控制器(SDRAM控制和片选逻辑)。LCD控制器(最大支持4K色STN和256K色TFT)提供1通道LCD专用DMA。4通道DMA并有外部请求引脚。l
7ppt课件3通道UART(IrDA1.0,64字节TxFIFO,和64字节RxFIFO)。2通道SPI。1通道IIC-BUS接口(多主支持)。1通道IIS-BUS音频编解码器接口。AC’97解码器接口
8ppt课件兼容SD主接口协议1.0版和MMC卡协议2.11兼容版。2端口USB主机/1端口USB设备(1.1版)4通道PWM定时器和1通道内部定时器/看门狗定时器8通道10比特ADC和触摸屏接口具有日历功能的RTC相机接口(最大4096×4096像素的投入支持。2048×2048像素的投入,支持缩放)130个通用I/O口和24通道外部中断源。具有普通,慢速,空闲和掉电模式。具有PLL片上时钟发生器。9ppt课件车辆监控系统是在全球卫星定位系统(GPS)、公共移动通信网(GPRS)、互联网(Internet)和地理信息系统(GIS)等现有技术基础上开发的一套信息服务管理系统,以用于各种移动目标、固定目标的导航、定位和监控。完整的车辆监控系统主要由GPS车载终端、GPRS无线网络和监控中心3部分构成。车辆监控系统的整体结构如图11-2所示。其中,车载终端包括ARM、GPS卫星数据采集模块、GPRS无线通信模块以及各种辅助扩展电路等,GPRS无线链路基于移动公司的GPRS移动通信公众网,包括MSC基站控制器、SGSN业务支撑节点、GGSN网关支持节点等,监控中心包括信息服务器和GIS数据库。11.1.2车辆监控系统10ppt课件图11-2车载监控系统11ppt课件由于嵌入式车载终端使用了图形用户界面,应用程序在运行时需要使用较多的内存,因此系统需要有足够的内存。此外,使用图形界面的Linux文件系统体积较大,需要大容量的存储文件系统。在设计中为嵌入式车载终端配置了64MB的SDRAM用于代码的执行,以及64MB的NANDFlash用于保存代码和各种文件。11.1.3存储单元12ppt课件
LCD显示器是通过给不同的液晶单元供电,控制其光线的通过与否,从而达到显示的目的。因此,LCD的驱动控制归于对每个液晶单元通断电的控制,每个液晶单元都对应着一个电极,对其通电,便可使光线通过(也有刚好相反的,即不通电时光线通过,通电时光线不通过)。光源的提供方式有两种:透射式和反射式。笔记本电脑的LCD显示屏即为透射式,屏后面有一个光源,因此外界环境可以不需要光源。而一般微控制器上使用的LCD为反射式,需要外界提供光源,靠反射光来工作1261。11.1.4LCD13ppt课件扫描器控制方式LCD显示屏没有驱动电路,需要与驱动电路配合使用。这种LCD体积小,但需要另外的驱动芯片。S3C2440AA的内置LCD控制器支持单色、每象素2位(4级灰度)、每象素4位16级灰度)的黑白屏,也支持每象素8位(256色)和每象素12位(4096色)的彩色LCD,并且也支持每象素16位和每象素24位的真彩显示。LCD控制器可以通过编程选择支持不同的LCD屏的要求,例如行和列象素,数据总线宽度,就口时序和刷新频率。LCD控制器的主要作用是将定位于系统存储器的显示缓冲区的LCD图像数据传送到外部LCD驱动器。14ppt课件数字音频接口是嵌入式车载终端的一个多媒体接口,主要用来实现多媒体播放和录音等功能。对于播放多媒体文件,S3C2440A先将音频数据通过软件解码,然后将解码后的数据通过数字音频接口传输给数字音频编解码芯片,数字音频编解码芯片将数据处理后,经过数模转换,最后通过模拟音频接口将声音送到扬声器实现声音的输出。11.1.5数字音频接口15ppt课件11.2嵌入式开发环境的建立
进行嵌入式应用程序开发时,一般应先在宿主机上编译调试通过后,再下载到目标板上。若遇到问题时,可直接在目标板上进行调试开发。这种直接在目标板开发模式下的开发流程将宿主机和目标机使用交叉网线通过以太网连接,在PC宿主机上运行minicom
作为目标板的显示终端,在目标板上通过网络文件系统(NFS)来挂载(mount)宿主机硬盘,让应用程序直接运行在目标板上进行调试。
16ppt课件图11-3Linux系统开发流程图17ppt课件(l)宿主机软件安装当今Linux发行版本有很多,需要选择适合宿主机上的Linux开发版本。Linux的安装有两种方式,一是在PC上直接安装,这样PC上就有两种操作系统,在电脑启动的时候选择其中一个启动;另一种是在Windows中安装虚拟机Vmware,而Linux在虚拟机中安装,这样Linux的启动要先启动Windows,然后在虚拟机中启动,这种的优点是可以同时启动两个操作系统,而且两个系统就像两台直接连接的PC,可以互相通信。18ppt课件
(2)安装交叉编译器交叉编译器是在宿主机上编译目标机程序的编译器,是嵌入式软件开发特有的编译器。(3)NFS方式挂载调试
NFS(NetworkFileSystem)是由SunMierosystems公司开发的,NFS允许一个系统在网络上与其他人共享目录和文件。通过使用NFS,用户可以像访问本地文件一样访问远端系统上的文件。由于NFS的便利特性,使得在嵌入式开发过程中,往往在目标板上使用NFS挂在宿主机上的需要调试的文件来进行调试。19ppt课件(4)设置宿主机和目标机共享文件夹(5)连接交叉串口线配置串口由于嵌入式系统资源相对匾乏,缺少PC机上良好的开发环境和界面,故在调试过程中常常使用Minicom来进行调试,Minicom相当于一个人机交互的界面。可以把需要输出的调试信息通过串口输出到PC上。20ppt课件(6)网络配置在宿主机里开启一个终端后进入防火墙设置,接着进行系统设置,启动NFS服务,如果之前已经启动了NFS,此后还需要修改目标板的IP地址,使之与宿主机在一个局域网网段,然后在U-boot界面下输入配置文字设置开发板的启动方式。21ppt课件11.3嵌入式车载终端软件的开发本节介绍嵌入式车载终端应用程序的设计,包括GPRS通信、温度调控系统,可视倒车功能、车载SIP电话、移动终端音视频文件播放器、嵌入式web服务器在车载终端的实现等。22ppt课件
GPRS无线通信模块G20内嵌了TCP/IP协议栈,处理器使用AT指令集,可方便与监控中心服务器建立TCP/IP或UDP/IP连接。因此,系统的软件设计无需考虑链路层PPP控制脚本程序和网络层TCP/UDP套接字程序的设计,进而降低了系统软件设计的复杂度,提高了系统的可靠性。11.3.1GPRS通信模块23ppt课件为在车载终端和监控中心之间建立数据传输链路,G20需要经历两个主要过程,具体如下:1、初始化过程图11-4描述了G20初始化的过程。上电后,G20首先进行硬件初始化设置,如配置数据的传输波特率,设置线路工作参数等。初始化完成之后G20将打开SIM卡,并进行校验SIM卡的操作,如判断SIM卡是否被更换等。这一切完成后,G20就进入就绪状态,开始登录网络,与监控中心进行“握手”应答。24ppt课件图11-4G20初始化过程25ppt课件2、“握手”过程车载终端的G20登录GPRS网络成功并获到一个动态分配的IP地址后,开始准备接收监控中心发送的带监控中心服务器IP地址的短信。一旦得到服务器IP地址,先创建socket进行连接,连接成功后给监控中心发送带己方IP地址的短信,并开始等待接收启动命令标志头。如果在预定的等待时间内没有收到监控中心发送的启动命令,则说明监控中心此时没有收取到车载终端的IP地址,则发送第二条带终端IP地址的短信给服务端,重复以上过程三次后结束。“握手”应答成功以后,车载终端与监控中心的数据链路建立,即可进行数据的可靠传输。26ppt课件温度自动调节系统,是车载信息采集的一部分,是对车内温度的实时监控。如果温度小于人体的舒适值,会自动开启车内空调的取暖系统,同理,如下大于人体舒适值,则会开启空调的制冷系统。本设计采用一线制温度数据采集。一线制温度网络的温度信号特点是数值不高,多在-10~85℃范围内,温度信号变化较慢,实时性要求不高,精度要求不高。一线制的优点在于硬件接口少所有的通信都通过一线协议,而与被测的具体量无关。11.3.2温度自动调节系统27ppt课件DS18B20是美国DALLAS公司生产的单总线数字温度传感器,可把温度信号直接转换成串行数字信号供微机处理,在一条总线上可挂接多个DS18B20芯片。主机或从机通过一个漏极开路或三态端口连至该单总线,以允许设备在不发送数据时能够释放总线,而让其他设备使用总线。DS18B20数字温度传感器可提供9~12位温度读数。读取或写入DS18B20的信息仅需一根总线,总线本身可以向所有挂接的DS18B20芯片提供电源,而不需额外的电源。由于DS18B20这一特点,非常适合于多点温度检测系统,硬件结构简单。28ppt课件DS18B20具有以下功能特点:(1)适应宽的电压范围(3.0V~5.5V)在寄生电源方式下可由数据线供电。(2)独特的单线接口方式,DS18B20在与微处理器连接时仅需要1条GPIO口线即可实现微处理器与DS18B20的双向通信。(3)温度范围适合车内应用可测量-55~+125℃,在-10~+85℃时精度为±0.5℃。29ppt课件DS18B20驱动程序DS18B20.c如下所示:#ifndef
_KERNEL_#define
_KERNEL_#endif
#ifndef
MODULE#define
MODULE#endif#include
<linux/kernel.h>#include
<linux/module.h>#include
<linux/init.h>#include
<linux/fs.h>#include
<linux/types.h>#include
<linux/slab.h>#include
<linux/errno.h>#include
<linux/ioctl.h>30ppt课件#include
<linux/version.h>#include
<asm/arch-S3C2440A/S3C2440A.h>#include
<asm/uaccess.h>#include
<linux/delay.h>#include
<linux/unistd.h>#include
<stdio.h>#include
<math.h>#include
<float.h>#define
MAJOR_NUM
98
/*主设备号*/#definedat_1820_hignGPGDAT|=1<<7;GPGCON&=~(3<<14)#definedat_1820_lowGPGDAT&=~(1<<7);GPGCON=(GPGCON&(~(3<<14)))|(1<<14)unsigned
char
DS18B20_Reset(void){unsigned
char
dr=0;31ppt课件dat_1820_low;udelay(600);//delay
600uSdat_1820_hign;udelay(80);//delay
80uSif(!(GPGDAT&(1<<7)))dr=1;udelay(500);//delay
400uSreturn
dr;}void
DS18B20_Write(unsigned
char
dw){unsigned
char
wr;for(wr=0;wr<8;wr++){dat_1820_low;if(dw&0x01)32ppt课件{udelay(5);dat_1820_hign;udelay(60);}else{udelay(75);}dat_1820_hign;dw>>=1;udelay(3);}udelay(5);}33ppt课件unsigned
char
DS18B20_Read(void){unsigned
char
dr,dr1=0;for(dr=0;dr<8;dr++){dr1>>=1;dat_1820_low;udelay(2);dat_1820_hign;udelay(10);if(GPGDAT&(1<<7))dr1|=0x80;udelay(60);}return
dr1;34ppt课件}/*read
the
temperature*/short
DS18B20_ReadTemp(void){float
dt3;short
dt;unsigned
char
dt1,dt2;DS18B20_Reset();DS18B20_Write(0xcc);DS18B20_Write(0x44);GPGDAT|=1<<7;GPGCON=(GPGCON&(~(3<<14)))
|
(1<<14
);mdelay(1000);/*延时
1s*/dat_1820_hign;DS18B20_Reset();DS18B20_Write(0xcc);35ppt课件DS18B20_Write(0xbe);dt1=DS18B20_Read();dt2=DS18B20_Read();dt=dt2*0x100+dt1;DS18B20_Reset();if(dt&(1<<15)){dt=0xffff-dt+1;dt3=dt*0.0625*10;dt=0x8000+dt3;}else{dt3=(float)dt*0.0625*10;dt=dt3;}36ppt课件dt3=((float)dt)*0.0625;return
dt;}static
ssize_t
DS18B20_read(struct
file
*file,
char
*buff,
size_t
size,
loff_t
*loff_t){short
tp;tp=DS18B20_ReadTemp();copy_to_user(buff,
&tp,
sizeof(short));return
sizeof(short);}struct
file_operations
DS18B20_fops={read:DS18B20_read,};static
int
__init
DS18B20_init(void)37ppt课件{int
ret=0;short
tp=0;dat_1820_hign;GPGUP&=~(1<<7);mdelay(1000);tp=DS18B20_ReadTemp();printk("temperature
is
%i\n",tp);ret=register_chrdev(MAJOR_NUM,"DS18B20",&DS18B20_fops);if(ret){printk("DS18B20
register
failure");}else{38ppt课件printk("DS18B20
register
success\n");}return
ret;}static
void
__exit
DS18B20_exit(void){int
ret=0;dat_1820_hign;ret=unregister_chrdev(MAJOR_NUM,"DS18B20");if(ret){printk("DS18B20
unregister
failure");}else39ppt课件{printk("DS18B20
unregister
success\n");}}MODULE_LICENSE("GPL");module_init(DS18B20_init);module_exit(DS18B20_exit);在终端里运行编译命令:
arm-linux-gcc
-D__KERNEL__
-D
MODULE
-I
/usr/src/S3C2440A_2.4.20/include
-c
DS18B20.c编译成功会生成文件
DS18B20.o
,
这个文件就是需要的驱动模块。接着把DS18B20.o
拷贝到S3C2440A开发板上,运行加载模块命令:
insmod
DS18B20.o就完成DS18B20的驱动模块的加载。40ppt课件可视倒车功能是嵌入式车载终端的一个重要功能。系统通过装在汽车尾部的摄像头采集汽车后方实时图像,并将图像显示在驾驶员旁边终端的上。嵌入式智能车载终端设置了专用按键来开启和关闭该功能,也可以在换档手柄处安装检测装置,当处于倒车档位时将信号传到系统,使该功能开启。驾驶员根据图像可以更好的掌握汽车后方的环境,从而提高倒车的安全性和效率。
11.3.3可视倒车功能的实现41ppt课件图11-5为可视倒车系统工作示意图。图11-5可视倒车系统工作示意图42ppt课件本设计采用基于ZC301P芯片的摄像头,具有高质量的VGA感光器(35万像素),传输接口:USB1.1,最大分辨率为640*480,支持30fps最大帧频,支持动态与静态视频采集。在Linux下常用的摄像头驱动是spca5xx,这是一个通用驱动,该驱动的下载网站为http://mxhaard.free.fr/download.html。这个网站还给出了这款驱动支持的摄像头的种类。针对嵌入式环境,有专门的patch,使用usb-2.6.12LE06.patch.gz驱动摄像头的过程如下:43ppt课件下载ZC301P驱动usb-2.6.12LE06.patch,下载后将其复制到/kernel/driver/usb目录下下解压、打补丁,就会在此目录下看到spca5xx文件夹。配置内核:makemenuconfig,配置选项中选择(*)Multimediadevice->Videoforlinux,加载Video4Linux模块,为视频采集设备提供编程接口。选择模块USBsupport->USBMultimediadevices->USBSPCA5XXSunplus
Vimicro
SonixCameras。编译内核,makedep;makezImage;makemodules,在/kernel/arch/arm/boot下生成内核映像zImage,将内核烧写到开发板中,并启动新内核。通过编译后在/kernel/driver/usb/spca5xx下生成目标文件spca5xx.o、spcadecoder.o、spca_core.o,这就是所需要的驱动。新内核启动,insmod三个.o文件(可以不用加载spcadecoder.o),摄像头就加载成功了。44ppt课件使用Video4Linux操作摄像头的流程如图11-6所示。图11-6摄像头操作流程45ppt课件打开摄像头设备后,首先是获取摄像头的设备信息,包括备名称、支持的最大最小分辨率、信号源信息等。获得摄像头的信息后,对摄像头进行参数设置。根据系统使用的LCD显示器的特点,图像色彩模式设置为VIDEO_PALETTE_RGB565格式,图像分辨率设置为640*480,图像位深设置为16位。46ppt课件每采集一帧数据后调用ioct1(fd,DIDIOCSYNC,&frame)函数等待采集结束,然后根据需要继续采集下一帧图像或关闭摄像头。在程序设计中,与摄像头相关的操作和数据结构都被封装在VideoCapture类中。其成员函数通过Video4Linux提供的接口完成对摄像头的具体操作。VideoCapture类设计如下:classVideoCapture{public:
VideoCapture();~VideoCapture();
boolhasCamera()const;/*判断是否有可用的摄像头*/voidgetCameraImage(QImage&img);/*获取摄像头的图像数据*/
QSize
captureSize()const;/*返回摄像头的分辨率*/
47ppt课件voidsetCapturesize(QSizesize);/*设置摄像头的分辨率*/
int
minimumFramePeriod()const;private;
int
fd;/*摄像头设备*/
intwidth,height;/*摄像头摄像时使用的分辨率*/
struct
video_capabilitycaps;/*摄像头信息的数据结构*/
struct
video_mbuf
mbuf;/*进行内存映射的帧信息*/unsignedchar*frames;/*内存映射的帧地址*/
int
setupCamera(QSizesize);/*摄像头初始化及参数设置*/voidshutdown();/*关闭摄像头*/};48ppt课件
VideoCapture类的voidsetupCamera(QSizesize)成员函数用于初始化摄像头,其主要工作包括打开摄像头设备,获取摄像头基本信息,设置图像色彩模式,获取图像窗口参数,设置图像窗口参数,设置图像数据获取方式等。为了方便调整图像的输出分辨率,函数使用size参数传递图像分辨率,在初始化摄像头时将按照size参数设置图像输出分辨率。在设备的初始化过程中,要判断每次设备访问是否成功,如果失败必须进行错误处理。49ppt课件用Video4Linux接口获取图像数据有两种方式,一种是用系统调用read,另一种是用内存映射输入输出。第一种方式使用较为简单,但不是所有的设备都支持这种获取图像数据的方式,大多数设备支持的是用内存映射方式获取图像数据。视频采集关键步骤介绍如下:1.打开视频USB摄像头在系统中对应的设备文件为/dev/video0,采用系统调用函数open()实现。intv4l_open(char*dev,v4l_device*vd){if(!dev)dev=”/dev/video0”;if((vd->fd=open(dev,O_RDWR))<0){50ppt课件perror("v4l_open:");return-1;}if(v4l_get_capability(vd))return-1;if(v4l_get_picture(vd))retu
rn-1;return0;}51ppt课件2.读取设备信息intv4l_get_capability(v4l_device*vd){if(ioctl(vd->fd,VIDIOCGCAP,&(vd->capability))<0){perror("v4l_get_capability:");return-1;}return0;}52ppt课件成功后可读取video_capability
中的信息。其中VIDIOCGCAP是videodev.h中定义的宏,具体定义为:#defineVIDIOCGCAPioctl(‘v’,1,struct
video_capability)ioctl(int
fd,int
cmd,…)函数的作用是在驱动程序中对设备的I/O通道进行管理,即对设备的一些特性进行控制。其中fd是用户打开设备时使用open()函数返回的文件标识符;cmd是用户程序对设备的控制命令;省略部分是一些补充参数,一般情况下最多有一个参数,与cmd的意义相关。53ppt课件3.读video_picture中信息intv4l_get_picture(v4l_device*vd){if(ioctl(vd->fd,VIDIOCGPICT,&(vd->picture))<0){perror("v4l_get_picture:");return-1;}return0;}成功后可读取图像的属性。54ppt课件4.改变video_picture中分量的值先为分量赋新值,再调用VIDIOCSPICT。vd->picture.colour=65535;if(ioctl(vd->fd,VIDIOCSPICT,&(vd->picture))<0){ perror("VIDIOCSPICT");return-1;}55ppt课件5.初始化channelintv4l_get_channels(v4l_device*vd){inti;for(i=0;i<vd->capability.channels;i++){vd->channel[i].channel=i;if(ioctl(vd->fd,VIDIOCGCHAN,&(vd->channel[i]))<0){perror("v4l_get_channel:");return-1;}}return0;}56ppt课件通过映射得到视频驱动的数据缓冲,用mmap(内存映射)方式截取视频。mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以象访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。其过程包括:[1]设置picture的属性。[2]初始化video_mbuf,以得到所映射的buffer的信息。if(ioct1(fd,VIDIOCGMBUF,&vm)<0){
printf("VIDIOCGMBUFfail\n");
mmap_camera=0;}else{
57ppt课件printf("currentcamerabuffersize%d,totalframes%d\n",vm.size,vm.frames);/*内存映射*/buf=(_u8*)mmap(0,vm.size,PROT_READ,MAP_SHARED,fd,0);if((int)buf==-1){
printf("mmapcamerafail!\n");
mmap_camera=0;}elseputs("mmapcameraok.\n");58ppt课件[3]修改video_mmap和帧状态的当前设置,例如重新设置图像帧的垂直及水平分辨率、彩色显示格式等,可利用如下语句:mmap.frames=0;mmap.height=256;mmap.width=256;mmap.format=VIDEO_PALETTE_JPEG;/*图像的调色板格式,JPEG*/59ppt课件[4]将mmap与video_mbuf绑定。系统调用void*mmap(void*addr,size_t
len,int
prot,intflags,int
fd,off_toffset)进行绑定。其中:len:映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起,offset是一个缓冲区的大小。prot:指定共享内存的访问权限,PROT_READ(可读),PROT_WRITE(可写),PROT_EXEC(可执行)。flags:MAP_SHARED和MAP_PRIVATE中必选一个,MAP_FIXED不推荐使用。addr:共内存享的起始地址,一般设0,表示由系统分配。mmap()返回值是系统实际分配的起始地址。60ppt课件[5]mmap方式下捕捉流程就是调用VIDIOCMCAPTURE做视频截取。fd_set
rfds;FD_ZERO(&rfds);while(1){if(ioct1(fd,VIDIOCMCAPTURE,STILL_IMAGE)<0){
printf("VIDIOCMCAPTUREfail\n");break;}FD_SET(0,&rfds);FD_SET(fd,&rfds);tv.tv_sec=3;tv.tv_usec=0;61ppt课件select(fd+1,&rfds,NULL,NULL,&tv);if(FD_ISSEF(fd,&rfdf)){if(mmap_camera){i=read(fd,buf,0);
if(i<0){
printf("read
fail!%d\n",i);break;}}else{62ppt课件prints("waittimeout\n");break;}display(buf);}munmap(buf,vm.size);free(buf);close(fd);63ppt课件[6]调用VIDIOCSYNC等待一帧截取结束。if(ioctl(vd->fd,VIDIOCSYNC,&frame)<0){perror("v4l_sync:VIDIOCSYNC");return-1;}若成功,表明一帧截取已完成。可以开始做下一次VIDIOCMCAPTURE,frame是当前截取的帧的序号。视频截取的第二种方法:直接读设备,调用read()函数。64ppt课件buf=malloc(image_width*image_height*2);if(!buf){printf("failtoallocatememoryforcamera!\n");close(fd);munmap(fb_buf,screensize);close(fbfd);return-1;}i=read(fd,buf,image_width*image_height*2);if(i<0){fprintf(stderr,"readfail!%d\n",i);break;}65ppt课件6.关闭设备完成视频采集后,需要清理内存和关闭视频设备。intv4l_close(v4l_device*vd){free(mmaps);munmap(map,mbuf,size);/*解除内存映射*/close("/dev/video0",vd->fd);/*关闭视频设备*/return0;}图像数据的连续采集和显示是通过定时器实现的。QTimer类提供了定时器信号和单触发定时器。设置定时启动触发周期,每当定时器时间到就触发一个定时器事件,在事件中调用getCameraImage()函数完成对图像的采集并将图像显示到LCD上。66ppt课件11.3.4车载语音电话1、串口通信在Linux下对串口设备的操作和操作文件是相同的,使用标准的系统调用来打开、关闭和读写。串口的设置主要是通过设置struct
termios结构体的各成员值来实现的。其中常用的关键设置是控制模式和本地模式的设置。struct
termio{unsignedshortc_iflag;/*输入模式标志*/unsignedshortc_oflag;/*输出模式标志*/unsignedshortc_cflag;/*控制模式标志*/unsignedshortc_lflag;/*本地模式标志*/unsignedcharc_line;/*行控制*/unsignedcharc_cc[NCC];/*控制特征*/}67ppt课件串口的控制模式设置是最基本的设置,包括波特率、校验位、停止位各项设置。本设计中MC35i使用的控制模式为波特率115200bps、8位数据位,1位停止位,无奇偶校验。语音合成芯片使用的控制模式波特率为9600bps。本地模式的设置使用默认设置。对于本地模式的设置,Linux下串行设备有三种不同的传输方式,可以根据实际应用中数据的传输特点选择合适的传输方式。下面对串行设备的三种传输方式进行介绍。68ppt课件(1)标准输入模式这是终端设备的标准处理模式。这种方式中,read会传回一整行完整的输入。一行的结束,默认是以NL文件结束符,或是一个行结束字符。默认设置中,CR(DOS/Windows中的默认行结束符)并不是行结束标志,可以通过设置自动将CR转换为NL。69ppt课件(2)非标准输入模式非标准输入处理可以用于需要每次读取固定数量字符的情况下,并允许使用字符接收时间定时器。这种模式可以用在每次读取固定长度字符串的程序中,或者所连接的设备会突然送出大量字符的情况下。70ppt课件(3)异步输入模式在异步模式下,read的状态会立即返回并送出一个信号到所调用的函数直到完成工作。这个信号可以由信号处理函数handler()来接收。对于无线通信模块MC35i,串口接收的数据格式与数量是不固定的,在读取消息时串口可能会接收大量字符。根据这种情况,与MC35i通信的串口设置为非标准输入模式,由程序来判断串口是否接收数据完毕。71ppt课件与MC35i的通信的串口初始化程序如下:int
opentty(){if((modemfd=open(COM1,O_RDWR))<0)/*打开串口设备,失败返回*/{
printf(“cannotopenthedevice\n”);returnfalse;}tcdrain(modemfd);/*等待数据传输完毕*/tcflush(modemfd,TCIOFLUSH);/*清空输入输出缓冲区*/if(tcgetattr(modemfd,&tty)<0/*获取原始串口设置参数*/{
printf(“Thephoneisbusy!\n”);
close(modemfd);
modemfd=-1;
72ppt课件returnflase;}memset(&initial_tty,‘\0’,sizeof(initial_tty));/*保存原始串口设置参数*/initial_tty=tty;tty.c_cc[VMIN]=0;/*设计read函数立即返回*/tty.c_cc[VTIME]=0;tty.c_oflag=0;/*设置输出模式为原始模式*/tty.c_lflag=0;/*设置串口为非标准输入模式*/tty.c_cflag=CS8|CREAD|CLOCAL;/*设置控制模式*/tty.c_iflag=IGNBRK|IGNPAR;/*设置输入模式*/73ppt课件cfsetoispeed(&tty,modemSpeed);/*设置波特率*/cfsetispeed(&tty,modemSpeed);tcdrain(modemfd);if(tcsetattr(modemfd,TCSANOW,&tty)<0){
printf(“Themodemisbusy!\n”);
close(modemfd);
modemfd=-1;returnfalse;}printf(“Modemready”);returntrue;}74ppt课件2、MC35i控制程序模块设计MC35i控制程序模块主要负责把上层应用的请求转化为MC35i可以识别的控制指令,并把Mc35i返回的数据进行解析和处理后提供给上层应用。所有对MC35i模块的操作都是通过AT指令完成的。AT指令集是计算机和调制解调器之间进行通信的标准语言,用来控制调制解调器进行拨号、应答等操作。用户从终端设备向终端适配器发送AT指令,进行呼叫、短信、电话本、数据业务、传真等方面的控制。起初的AT指令并不完善,后来主要的移动电话生产厂商诺基亚、爱立信、摩托罗拉和HP共同为GSM研制了一整套AT指令,其中包括了对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电力行业助理的工作职责简述
- 高校人才培养方案的更新
- 2025年全球及中国石油和天然气行业用有机缓蚀剂行业头部企业市场占有率及排名调研报告
- 2025-2030全球桶形立铣刀行业调研及趋势分析报告
- 2025年全球及中国医疗推车液晶显示器行业头部企业市场占有率及排名调研报告
- 2025-2030全球轮胎式破碎机行业调研及趋势分析报告
- 2025年全球及中国剧场动作自动化设备行业头部企业市场占有率及排名调研报告
- 2025年全球及中国单线金刚石线切割机行业头部企业市场占有率及排名调研报告
- 2025-2030全球履带调节器行业调研及趋势分析报告
- 2025-2030全球防水低光双筒望远镜行业调研及趋势分析报告
- 安全生产网格员培训
- 小学数学分数四则混合运算300题带答案
- 林下野鸡养殖建设项目可行性研究报告
- 心肺复苏术课件2024新版
- 2024年内蒙古呼和浩特市中考文科综合试题卷(含答案)
- 大型商场招商招租方案(2篇)
- 会阴擦洗课件
- 2024年山东泰安市泰山财金投资集团有限公司招聘笔试参考题库含答案解析
- 近五年重庆中考物理试题及答案2023
- 全科医医师的临床诊疗思维
- (七圣)七圣娘娘签诗
评论
0/150
提交评论