《嵌入式系统》设计方案_第1页
《嵌入式系统》设计方案_第2页
《嵌入式系统》设计方案_第3页
《嵌入式系统》设计方案_第4页
《嵌入式系统》设计方案_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、移动打印终端终嵌入式系统设计方案 阅读目录一 项目概述1二 系统总体架构22.1.1 各功能部件作用2221 手持式扫描仪3222 嵌入式开发板3223 微型打印机的选型4224远程服务器5三 软/硬件设计532 硬件设计6321 嵌入式开发板和扫描仪的连接6322嵌入式开发板和远程服务器的连接6323 嵌入式开发板和微型打印机的连接7四 各驱动程序的设计(软件设计)741 打印机驱动的设计7411定义设备号和设备名74.1.2 设备驱动初始化函数和清除函数74编译扫描仪制备驱动115.加载设备124.1.3 扫描仪驱动设计134.1.4 网络通信模块及服务器的开发134.1.5系统应用程序设

2、计14五 系统调试15一 项目概述 11 系统设计的必要性与PC终端的比较 在信息社会中,打印终端应用非常广泛,比如超市的收银系统、图书管的借还书系统、移动营业厅的话费打印系统等场合,我们都可以看到打印终端的身影。传统打印终端通常都是由PC加上一个微型打印机构成,这种架构的打印终端价格比较昂贵,体积庞大,移动笨拙,使用十分不方便。 随着嵌入式技术的发展,许多原来基于PC的应用都纷纷转向基于嵌入式技术来实现。基于嵌入式技术的产品具有非常明显的优势,如价格便宜、功耗低、体积小及移动方便等。具体到打印终端这个产品上来说,可以从下表看出基于PC的打印终端和基于嵌入式的打印终端在各个方面的差异性。基于P

3、C的打印终端基于嵌入式的打印终端价格几千元不等几百元左右体积很大非常小性能强较强开发方便性易较易移动方便 性难易12 系统的主要功能本项目实例中拟开发的嵌入式移动打印终端是解决从数据输入、数据处理和数据输出的一体化系统,它提供下列几个功能 数据录入功能:支持从扫描仪端录入数据; 通过网络到数据库查询; 数据打印功能二 系统总体架构 嵌入式移动终端是一套完整的嵌入式应用系统,包括和硬件和软件两部分,这一节先说一下硬件方面的设计。21 系统硬件组成的部件 数据输入部件(手持扫描仪)完成数据输入功能; 数据处理部件(嵌入式开发板和远程服务器)完成数据处理任务 数据输出部件(微型打印机)完成数据打印功

4、能;扫描仪嵌入式开发板各个部件之间的关系如图远程服务器打印机 图1 嵌入式移动打印终端架构2.1.1 各功能部件作用 数据输入部件 通常一个系统可以有很多种输入数据的途径,常用的输入设备有键盘鼠标等.在嵌入式移动打印终端中,只采用了扫描仪来完成数据的输入工作,当然系统如果想要实用化,应该再加上键盘等其它输入部件,但在这里就只用为个来设计了. 数据处理部件 数据处理部件是一整个应用系统的核心,它的主要任务是得到扫描仪传来的数据信息,然后连接远程服务器,将数据传送到远程服务器端,完成查询任务后,从远程服务器端得到结果,然后将结果送给微型打印机打印. 所以,数据处理部件包括嵌入式开发板和远程服务器两

5、个部分。嵌入式开发板和远程服务器之间通过网络线相连。 数据输出部件 在超市收银系统中,收银员最后的一个动作总是打印顾客的单据。同样,在嵌入式移动打印终端系统中,最后一个动作也是将查询到的结果通过一个微型打印机打印出来。22对硬件的选择 221 手持式扫描仪 该扫描仪主要完成的功能 其实是条码扫描的任务。条码扫描是用来扫描条形码的设备,利用光学原理,把条形码的内容解码后通过数据线或者无线的方式传输到电脑或者别的设备中。 根据实际情况,现在拟定了一个关于扫描仪的规格参数: 光学规格 光学系统:2048PixelCCD 扫描速度:每秒100次 光源:红色可见光LED 读取条码宽度:可读至90mm 扫

6、描距离:020mm接口类型 支持键盘和RS-232C接口 条码种类:WPC(EAN-13,EAN-8,UPC-A,UPC-E)Code 128 Code39Coda bar Code 11,Code39,Code39 extened,Interleaved 2of 5,Code 32,EAN-128,ChinIATA,ChinIATA,MSI/PLESSY,STD 2 of 4,Martix 2of 5,ItalianPhamacy Code ,Industrial 2 of5,BC-412,中国邮政码电气规格 电压:5V DC 操作规格: 6070 mA 待机电源:2030mA其它 操作法度

7、:0440度 传输线:1.75M 尺寸:长166mm宽90nm高32nm222 嵌入式开发板 嵌入式开发板是本系统的核心部件,它担负着整个系统中心枢纽的重担,同时,它的选型也直接影响到上层操作系统和其它部件的选型。所以,在选择这个部件时,要站在整个系统的高度来进行。 在设计嵌入式移动打印终端系统时,根据接口类型、所支持的操作系统、性价比这几个要素来选取开发的类型与参数,具体如下表所示:硬件参数 软件参数1、 采用三星公司的S3C2410,主频可达203MHz2、 64MB的SDRAM,由两片K4S组成,工作在32位模拟式下3、 64MB Nand Flash,采用的是K9F1208,可兼容16

8、MB,32MB或128MB;2MB的Nor Flash,采用的是SST39VF1601,工作在16位模式下4、 10Mbps以太网接口,采用的是CS8900Q3,带传输和连接指示灯5、 LCD和触摸屏接口6、 1个USN Host,S3C2410内置的,符合USB1.1;一个USB Device,S3C2410内置的,符合USB1.17、 支持音频输入和音频输出,音频模块由S3C2410的S音频总线接口和UDA1341音频编译解码器组成,模块还集成了一个MIC,用于音频输入8、 2路URART串行行口,波特率可高达bps,并具有RS-232电平转换电路9、 SD卡接口,兼容SDMemory C

9、ard Protocol 1.010、 蜂鸣器,4个LED灯,4个按键11、 Embedded-ICE(20脚标准JTAG)接口和并口式JTAG接口,支持ADS、SDT软件的下载和调试,以及FLASHf烧写 测试代码,启动引导源代码BIOS和下载烧写工具 Linux for 2410的内核源码包,以及内核交叉编译工具,可运行的根文件系统及根文件系统制作工具 Qt-embedded-2.3和qtopia-free-1.7.0源码,应用程序交叉编译器 winCE4.2NET板级支持包BSP for 2410,以及已编译好的WINCE镜像文件 ST2410底板和核心板电路原理图 ST2410开发板使

10、用手册 实用工具 ST2410 开发板相关参数 223 微型打印机的选型 微型打印机腹胀荣达科技RD-M系列微型打印机,该款采用独特的面板式嵌入结构,便可将整个打印机固定在仪表面板上,操作简单、方便。下面是它的一些参数指标 打印方式:针打,针式撞击点阵打印:热敏,热敏加热热点阵打印 打印速度:针打,1.0行/秒,0.7行/秒,0.4行/秒:热敏,35毫米/秒 分辩率:针打,8点/毫米,384点/行。 打印宽度:针打,16/24/40;热敏,32。 打印字符:全部448个字符及图块,包括96个ASCII字符,352个希腊文德文俄文法文等字母,日文片假名,部分中文汉字,数字符号,打印字符,块图符;

11、32个用户自定义字符。国标一二级汉字库中全部汉字和西文字、图符共有817个。 字符大小:西文,57;块图符,68点阵;用户自定义字符,汉字,2424,点阵,1616 控制板;采用模块化驱动控制电路,有效保护打印头的绝对安全;专门的复位控制电路、电源监测电路以及近乎完美的软硬件看门狗控制的电路,确保打印机不死机、不乱打。 控制命令:通用ESC/p打印命令。 打印缓存:32KB。224远程服务器 远程服务器用于存在放在型数据库,它通过网络接口接收嵌入式开发板发来的数据,然后进行查询、更新等处理操作,最后把结果再传给嵌入式开发板。所以,远程服务器必须具备较强的数据存储能力和网络通信能力。要本系统中我

12、们可以用一台普通PC来完成这个功能。三 软/硬件设计 31 设计的流程 嵌入式移动打印终端系统设计开发可以分为三5个模块: 开发环境的建立 硬件的设计; 扫描仪驱动的设计; 打印机驱动的设计 服务器数据库的设计及通信模块的开发。 设计思想是:从硬件到软件,从底层到上层的方法。流程图如下开始设计硬件的设计结束应用程序的编写网络通信及服务器的设计打印机驱动的设计32 硬件设计 由于本开发系统中的核心部件采用已有的开发板,硬件设计的任务就大为简单,其核心任务就转化为通过嵌入式开发板将各个部件连接在一起即可。321 嵌入式开发板和扫描仪的连接 这一步骤是要把电路设计的图给出的,但是由于现在的设计都是从

13、理论上做而已,没有真实的开发板,所以画不出来电路图。322嵌入式开发板和远程服务器的连接 这一步骤是要把电路设计的图给出的,但是由于现在的设计都是从理论上做而已,没有真实的开发板,所以画不出来电路图。323 嵌入式开发板和微型打印机的连接 这一步骤是要把电路设计的图给出的,但是由于现在的设计都是从理论上做而已,没有真实的开发板,所以画不出来电路图。四 各驱动程序的设计(软件设计)41 打印机驱动的设计按照编写嵌入式驱动 的方法,打印机驱动的编写可分为下列的几个环节: 定义设备号和设备名 实现设备驱动初始化函数和清除函数; 设计所要实现的文件操作,定义file_operation结构,实现所需的

14、底层接口调用函数; 将驱动编译到内核或编译成模块,用insmod命令加载; 生成设备节点文件。411定义设备号和设备名#define DEVICE_NAME “weida_printer”#define WEIDA_MAJOR2344.1.2 设备驱动初始化函数和清除函数Module_init(weida_printf_init);Module_exit(weida_print_exit);MODULE_LICNSE(“GPL”);其中,在初始化函数weida_printf_init中完成设备注册任务和微型打印机端口初始化任务,具体函数如下:static int_weida_print_ini

15、t(void)int ret;ret=register_chrdev(WEIDA_MAJOR,DEVICE_ANME,&weida_print_fops);if(tet0)printk(DEVICE_NAME cant register major numbern);return ret;weida_print_io_port_init();weida_init();printk(weida_printer_init!/n);return 0;ret=register_chrdev(WEIDA_MAJOR,DEVICE_ANME,&weida_print_fops);完成设备注册任务,其中WE

16、IDA_MAJOR为设备号,DEVICE_NAME为设备名,weida_printer_fops为struct file_oerations结构休变量,其内部每一个成员都 是函数指针,指向对应的微型打印机底层接口。初始化GPIO端口gpio_data_tab=GPIO_C8,GPIO_C10,GPIO_C11,GPIO_C12,GPIO_13,GPIO_14,GPIO_15;#define DATA_NUM(sizeof(gpio_data_tab/sizeof(gpio_data_tab0)#define WIDA_DATA_READY GPIO_D0#define WEIDA_ACK GP

17、IO_D1#define WEIDA_BUSY GPIO_D2#define WEIDA_BUSY GPIO_D3#define WEIDA_BUSY GPIO_D4 Weida_printf_io_init()函数将调用一睦设置GPIO的函数将GPIO初始化:static void weida_printer_io_port_init(void)int i;unsigned gpio;for(i=0;iDATA_NUM;i+)gpio = gpio_data_tabi;set_gpio_ctrl(gpio|GOP_PULLUIP_DIS|(GPIO_MODE_OUT);write_gpio_

18、bit(gpio,0);set_gpio_ctrl(gpio|GOP_PULLUIP_DIS|(GPIO_MODE_OUT);set_gpio_ctrl(gpio|GOP_PULLUIP_DIS|(GPIO_MODE_OUT);set_gpio_ctrl(gpio|GOP_PULLUIP_DIS|(GPIO_MODE_OUT);set_gpio_ctrl(gpio|GOP_PULLUIP_DIS|(GPIO_MODE_OUT);set_gpio_ctrl(gpio|GOP_PULLUIP_DIS|(GPIO_MODE_OUT); printk(init port!/n);set_gpio_ct

19、rl()函数用于设置GPIO口的相关属性,如set_gpio_ctrl(WEIDA_DATA_READYIGPIO_PULL_DISIGPIO_MODE_OUT)设置GPIO_D0口的一些属性,其中WEIDA_DATGA_READY为连接打印机的 ready 口的GPIOD0,GPIO-PULL-DS设置不需要上拉电阻,GPIOMODE-OUT设置口为输出口,同样可以定义其它几个GPIO口相应属性。(3)初始化打印机static void weda_init(void)INIT_WEIDA;SET_LANDSCAPE;SET_FONT_SPACE(2);SET_LINE_SPACE(2);DE

20、LETE_LINE; 这几个宏用来初始化打印机,它们的宏体中都用到TYPE_DATA(N)函数,该函数是嵌入式开发板向微型打印机发送ASCII数据n,其中具体实现代码如下:static void type_data(unsigned char data)int data_bit,j;mdelay(150);for(j =0;j8;j+)data_bit = (data&(1j)printk(%d,data_bit);write_gpio_bit(gpio_data_tabj,data_bit&0x01)udelay(2);DATA_READY(0);UDELAY(2);DATA_READY(1

21、); 每次发数据时都要延迟几毫秒,以防向打印机发送数据过快,打印机来不及处理而产生丢失数据现象,所以要设置。下面具体分析如何编写这些惛层接口操作函数。(1) weida_printer_open/weida_printer_close;打开/关闭打印机:该函数完成打印操作,在该函数中,首先判断打印机是否在张,是否忙。是否准备好,在打印机准备的情况下完成数据打印任务。函数的具体实现代码如下:static int weida_printer_write(struct file,const char *buffer,size_t cout,loff_t *ppos)unsigned char *kb

22、uf;int ready;ready = read_gpio_bit(WEIDA_BUSY);if(ready)return -EBUSY;ready = read_gpio_bit(WEIDA_SELECT);if(!ready)return -EAGAIN;ready = read_gpio_bit(WEIDA_ERROR);if(ready)return -EINVAL;kbuf = malloc(count+1,GPF_KERNEL);memeset(kbuf,0,count+1)if(copy_from_user(kbuf,buffer,count)printk(copy form

23、user wrong!);kfree(kbuf);return -EFAULT;while(*kbuf!=0)tyupe_data(*kbuf);while(read_gpio_bit(WEIDA_ACK);prinntk(%c,*kbuf);kbuf+;kfreee(kbuf);return count;打印时用函数copy_from_user(kbuf,buffer,count)将数据从用户态到核心态。weida_printer_ioctl通过该函数对打印机的字体、行距等属性进行设置,函数的具体实现代码如下:static int weida_printer_ioct(struct inod

24、e *inode,struct file *file,unsigned int cmd,unsigned long arg)int mum;switch(cmd)case WEIDA_IOCSFONTSPACE;copy_from_user(&num,&arg,sizeof num);SET_FONT_SPACE(num);break;case WEIDA_IOCSLINESPACE; COPY_from_user(&num,&arg,sizeof num);SET_LINE_SPACE(NUM);break;case WEIDA_IOCSLINESPACE; COPY_from_user(&

25、num,&arg,sizeof num); break; case WEIDA_IOCSUPLINE; copy_from_user(&num,&arg,sizeof num); SET_UPLINE(num); break; case WEIDA_IOCSCHARACTER1; select_character1; break;case WEIDA+IOCSDOT_MATR1X;COPY_FROM_USERT(NUM,&ARG,SIZEOF NUM);case WEIDA_IOCSLINESPACE; COPY_from_user(&num,&arg,sizeof num); break;

26、case WEIDA_IOCSUPLINE; copy_from_user(&num,&arg,sizeof num); SET_UPLINE(num); break; case WEIDA_IOCSCHARACTER1; select_character1; break;case WEIDA+IOCSDOT_MATR1X;COPY_FROM_USERT(NUM,&ARG,SIZEOF NUM);(2) weida_print_select 该函数用来选择打印机,函数的具体实现代码如下:static unsigned int weida_printer_select(struct file *

27、file,struct poll_table_struct *)int ready;ready = read_geipo_buf(WEIDA_BUSY);if(!ready)return l;poll_wait(file,&weida_printer_wait,wait);printk(select);return ;4编译扫描仪制备驱动 假设上述微型打印机驱动代码存放在weida_printer.c 和weida_printer.h中并且放在weida_printer目录下。在该目录 下编写Makefile文件,内容如下:CROSS = artmWeida-printer.0.weida_p

28、rinter.c weida_printer.h$CROSS gcc-d_kerner_DMODULE-I/home/lichao/2.4.18-rmk7/include-c o weida_printer weida_printer.cCleanM rf weida_printer 在/weida_printer目录下,执行下列命令编译: make在当前目录下就可以得到驱动模块文件weida_printer.o5.加载设备 编译好驱动模块后,可以通过网络将weida_printer.o文件传输到嵌入式开发板,在嵌入式开发板超级终端环境下执行下列命令将打印机设备运动模块加载内核: Inmsod

29、 weida_printer.o生成设备节点:Mknod/dev/weida_printer c23406.打印机驱动测试程序设计 通过上面的几个步骤,打印机驱动模块已经注册到内核,在/dev目录下可以打到weida_printer设备,那么编写的设备驱动模块是否正确,能否完成所要求的功能呢?这些必须编写测试程序来进行测试. 下面是一个简单的测试程序代码,详细的功能测试代码可以在该程序的基础之上进行扩充.int main(void)int weida_fd,ret;char *data = Hell, Welcome to use weida printer;weida_fd = open(/

30、dev/weida_printer.O_WRONLY);if(weida_fd0)perrof(open device buttons);exit(1);ret write(weda_fd,data,strien(data);if(ret!=strlen(data)perror(print worng/n);ioctl(weida_fd,WIDA_IOCSLNESPACE,1);sleep(1);ret = write(weida_fd,data,strlen(data);if(ret!= strlen(data)perror(printf wrongn);clsoe(weida_fd);re

31、turn 0;4.1.3 扫描仪驱动设计扫描仪直接接到嵌入式开发板串口上,对它的控制非常简单,只需要将串口1的波特率属性配置成和扫描仪一致,扫描仪扫描后直接可以从串口读出数据,读数据就为扫描仪扫到的条形码.1. 编写串口设置函数 Set_speed(int fd,int speed)用于设置串口速率,其中fd为打开设备文件,speed为速率,具体的函数代码如下;void set_speed(int fd,int speed)int i;int statis;struct termios opt;for(i =0;isizeof(speed_arr)/sizeof(int);i+)if(speed = name_arti)teflush(fd,TCIOFLUSH);cfetispeed(&Opt,speed_arri);cfsetospeed(&Opt,speed_armi);status = tcsetarr(fd,TCSANOW,&Opt);if(status != 0)perror(tesetarr fd1);return ;teflush(fd,TCIOFLUSH);4.1.4 网

温馨提示

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

评论

0/150

提交评论