1 引言
随着信息技术的发展,电子收款机正广泛地应用到商业自动化过程中,它起到提高企业管理、加强财务监督的作用。税务机关也可利用电子收款机的特点,在原有的基础上增加税控功能,使税控收款机既满足商业自动化管理的要求,又能满足税源总控的需求。
目前,正值税控机标准颁布的前夕,各税控机生产厂家都在积极准备使用32位mcu开发符合新规范的税控机。
2 系统功能及其实现方案
本税控收款机除了实现普通电子收款机的所有功能外,还能够实现税控功能,有利于国家税务部门进行税务监督,减少偷税和漏税。
2.1 硬件方案
(1) mcu的选择
mcu是整个方案的核心,由它来处理各种中断(键盘中断、条形码扫描枪中断、方式锁中断),控制整个税控收款机的各个部件能和谐的运行;由于税控机的功能非常强大而且需要存储很多数据,包括销售前需要录入到系统的成千上万种商品的信息,还包括各种报表信息(财务报表、部类报表、收款员报表、营业员报表、条形码商品销售报表、套餐报表、库存报表等),同时考虑到联机工作。因此选用了功能强大,处理性能高的苏州国芯公司的32位mcu-mmc2107。
mmc2107是基于32位c*core c210 中央处理器(cpu)的微控制器(mcu)系列的成员之一。
(2) 税控机组成
a) 电源开关:接通/断开收款机电源。
b) 方式锁:方式锁有六个档位:l、r、x、z、p、t,每个档位的功能都不一样。(在后面的软件方案中销售任务对应r档, x报表任务对应x档,z档应z报表任务对应p档,功编程任务对应p档,税控任务对应t档)
每台收款机中都配有方式锁的钥匙,分别有收款员钥匙和经理钥匙。收款员钥匙,只能扭到l、r、x档;普通经理钥匙可扭到l、r、x、z、p档;税控专用经理钥匙可扭到任意档位。如果收款机设置了收款员密码,在r和x档必须输入收款员密码再按“收款员”键,才能在r和x档操作;如果设置了经理密码,在z和p档必须输入经理密码再按“收款员”键,才能在z和p档操作。
c) 钱箱:存放钱币,钱箱内部划分有纸币格和硬币格,且配备钱箱锁。每次销售结束时,钱箱可自动打开;在r档且不销售的状态下,按“开钱箱”键也可打开钱箱;当电源断开后,可以通过钱箱底部的机械开关打开钱箱。
d) 键盘:收款机的键盘有88个键,排布成6行,15列
e) 前显:面向收款员,采用15行,40列蓝背光液晶显示,同时可根据收款台的实际高度及不同收款员的视觉,对显示的对比度和翻起角度进行调整。
f) 后显:面向顾客,采用8位超高亮led数码管显示,可拉起,根据前显液晶翻盖翻起情况可任意角度旋转以满足不同位置下的观察。同时本机还可外接客显。
g) 打印机:打印发票,用的是针式打印机,每行可以打印20个汉字。
h) 条形码阅读器:用来扫描商品的plu代码。
(3) 税控机的接口
a) com1(9针串口):用来连接条形码阅读器;
b) com1(9针串口):用于rs232通讯;
c) com3(9针串口):用于联接厨房打印机及电子秤;
d) 25针(并口):用于链接并行外设;
e) rs485接口:用于rs485通讯。
3 软件方案
3.1 税控机的软件
在正常运行下,μc/os-ii系统中一共有11个任务,他们分别是上电任务,方式锁任务,键盘任务,扫描任务, 总控任务,系统初始化任务,功能编程任务,销售任务,x报表任务,z报表任务,税控任务(按优先级降低的顺序排)。各任务之间的关系见图1。

(1) 各个中断的说明
a) 当有键盘按下时,产生键盘中断。该中断服务子程序调用ossempost(sem_int_keyboard)来唤醒键盘任务;
b) 当方式锁发生旋转时或上电时,产生中断。在该中断子程序中调用ossempost(sem_int_methodlock)来唤醒方式锁任务;
c) 当扫描枪对准条形码时,产生中断。在该中断子程序中调用ossempost(sem_int_scan)来唤醒扫描任务;
(2) 各个任务的说明:注意:{}括起来的内容是在一个无限循环中
a) 上电任务
调用ossempend(sem_start,0,&err)来获得信号量。
b) 方式锁任务
{调用ossempend(sem_int_methodlock,0,err)来获得信号量,当获得信号量后,它就设法获得方式锁目前所在的档位的编码。
c) 键盘任务
{调用ossempend(sem_int_keyboard,0,&err)来获得信号量,当获得信号量后,它就设法获得按下的键的键码,然后将键盘任务的任务号3放在msg_keyCODe[0]中,将键码放在msg_keycode [1]中,然后调用osqpost(q_contol,msg_keycode)来唤醒总控任务}
d) 扫描任务
{调用 ossempend(sem_int_scan,0,&err)来获得信号量,当获得信号量后,它就设法获得扫进来的条形码,然后将扫描任务任务的任务号4放在msg_plucode[0]中,将条形码从msg_plucode [1]开始放,然后调用osqpost(q_contol,msg_plucode)来唤醒总控任务}
e) 总控任务
{调用osqpend(q_contol,0,&err)来获得消息.当获消息后继续往下执行}
根据传来的消息的第一个字节的任务号可以判定是什么任务来的信息。
如果是方式锁任务来的信息,则将传来的方式锁所在档位的编码用一个全局量(方式锁全局量)保存下来。然后接着执行a.b.c.d.e.f.g( a.b.c.d.e.f.g用if...else if 来互斥地);
如果是键盘任务来的信息(a.b.c.d.e.f.g用if...else if来互斥)。
如果是扫描任务来的信息(a.b用if...else if来互斥)
f) 系统初始化任务
该任务主要完成高级参数的设置,装载默认的初始设置,设置高级密码和设置经理密码。
g) 功能编程任务
{调用osmboxpend(mbox_program,0,&err)来获得邮箱,当获得邮箱后,根据传来的第一个字节的任务号知道传来是键码了还是扫描码,然后根据传来的码值和当前该任务所处的状态(该状态用全局变量来保存,不同的值表示不同的状态)来做相应的处理}
该任务主要是在销售之前,将商品的信息录入进来,包括部类录入、套餐录入、plu录入。还会录入收款员和营业员的信息、收据头信息、各种付款方式的汇率。
h) 销售任务
{调用osmboxpend(mbox_sell,0,&err)来获得邮箱,当获得邮箱后,根据传来的第一个字节的任务号知道传来是键码了还是扫描码,然后根据传来的码值和当前该任务所处的状态(该状态用全局变量来保存,不同的值表示不同的状态)来做相应的处理}
该任务顾名思义就是销售商品。包括按部类销售、按plu销售、按套餐销售、按台号销售。还可以收取服务费、可以打折、有多种付款方式。
l) x报表任务
{调用osmboxpend(mbox_xreportform,0,&err)来获得邮箱,当获得邮箱后,根据传来的第二个字节的键码和当前该任务所处的状态(该状态用全局变量来保存,不同的值表示不同的状态)来做相应的处理}
该任务打印有关的数据报表,包括部类、套餐的销售报表,各个收款员和营业员的业绩报表等
m) z报表任务
{调用osmboxpend(mbox_zreportform,0,&err)来获得邮箱,当获得邮箱后,根据传来的第二个字节的键码和当前该任务所处的状态(该状态用全局变量来保存,不同的值表示不同的状态)来做相应的处理}
该任务和x报表任务差不多,只是普通的收款员钥匙是无法进入该任务。
n) 税控任务
{调用osmboxpend(mbox_tax,0,&err)来获得邮箱,当获得邮箱后,根据传来的第二个字节的键码和当前该任务所处的状态(该状态用全局变量来保存,不同的值表示不同的状态)来做相应的处理}
该任务是来完成税收控制的。方便有关部门查账。
3.2 软件分析
上电后首先发信号量sem_start =ossemcreat(1);sem_int_methodlock= ossemcreate(1);当执行到osstart()来调度各个任务时。
(1) 根据任务的优先级,先是执行上电任务,上电任务调用ossempend(sem_start,0,&err)函数,且必然获得信号量,那么该任务必然因为延时而被挂起;
(2) 然后方式锁任务将被激活,它获得上电时方式锁所在档位的编码后将编码传给总控任务,后来它因为循环等待邮箱而被挂起;
(3) 如果此时有键按下,键盘任务将被激活,否则将跳到④执行;键盘任务将获得键码后将将键码传给总控任务, 后来它因为循环等待邮箱而被挂起;
(4) 如果此时有条形码扫描中断,则扫描任务被激活,否则将跳到⑤执行;扫描任务获得条形码后将条形码传给总控任务,后来它因为循环等待邮箱而被挂起;
(5) 在执行这步时候,必须保证上电任务的延迟时间到现在还没有结束,这时候startflg为1(有这个限制是为了可以进入系统初始化任务――要进入该任务必须是上电的时候,方式锁全局量是p档的编码,而且按了.键,进入系统初始化任务后,方式锁全局量变为i档的编码;如果不符合上诉条件,那将进入与方式锁全局量相对应的任务中操作)。
请参考总控任务的具体操作细节
(6) 之后,上电任务的延时必然结束。然后它可能显示功能编程任务/系统初始化任务的界面。然后将删除自己以节省系统资源。
4 调试环境
此程序用的是metrowerks codewarrior ide来调试的。
参考文献
[1] (英)jean j.labrosse著,邵贝贝译. μc/os-ii-源代码公开的实时嵌入式操作系统[m].北京:中国电力出版社,2001.
[2] 谭浩强. c程序设计[m]. 北京:清华大学出版社, 1991.
[3] 苏州国芯科技有限公司 mmc2107 device driver reference manual,国芯科技公司网站,2003.




