公司需要纸币器开发,参考纸币器文档和网上的一篇vb版本,代码如下:

# -*- coding:utf-8 -*-
# Author: Pete Yim<xpHook@gmail.com>
# Date : 13-7-31 import threading
import serial
from time import sleep GLOBAL_COUNT = 0 GLOBAL_OUT_INIT_NUM = 0
GLOBAL_OUT_CHECK_NUM = 0
COMMAND_INIT_FLAG = False
COMMAND_CHECK_FLAG = False
COMMAND_OUTPUT = ''
GLOBAL_CASH_1 = 0
GLOBAL_CASH_5 = 0
GLOBAL_CASH_10 = 0
GLOBAL_CASH_20 = 0
GLOBAL_CASH_50 = 0 SERIAL_SETTING = {
'PORT' : 4,
'BAUDRATE' : 9600,
'BYTESIZE' : serial.EIGHTBITS,
'PARITY' : serial.PARITY_NONE,
'STOPBITS' : serial.STOPBITS_TWO
} DATA_OUT_DIC = {
'DATA_OUT_1' : '7F8001116582',
'DATA_OUT_2' : '7F000123C988',
'DATA_OUT_3' : '7F800226FC3B56',
'DATA_OUT_4' : '7F000125DD88',
'DATA_OUT_5' : '7F0004240301126757',
'DATA_OUT_6' : '7F0001051E08',
'DATA_OUT_7' : '7F8001195602',
'DATA_OUT_8' : '7F0001093608',
'DATA_OUT_9' : '7F8001071202',
'DATA_OUT_10' : '7F0003029F0021DA',
'DATA_OUT_11' : '7F80010A3F82',
'DATA_OUT_12' : '7F0001071188',
'DATA_OUT_13' : '7F8003029F002266',
'DATA_OUT_14' : '7F00010A3C08'
} class CashSerial(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.__terminate = False def open(self, settings):
try:
self.serial = serial.Serial(port=SERIAL_SETTING['PORT'],
baudrate=SERIAL_SETTING['BAUDRATE'],
bytesize=SERIAL_SETTING['BYTESIZE'],
parity=SERIAL_SETTING['PARITY'],
stopbits=SERIAL_SETTING['STOPBITS'])
self.serial.flushInput()
self.serial.flushOutput()
global COMMAND_INIT_FLAG
COMMAND_INIT_FLAG = True
except Exception, msg:
return False, msg.message.decode("gbk") return True, "success" def resetArduino(self):
self.serial.setDTR(0)
sleep(0.1)
self.serial.setDTR(1) def terminate(self):
self.__terminate = True def send(self, data):
self.serial.write(data) def recv(self):
data, quit = '', False
while not self.__terminate:
try:
n = self.serial.inWaiting()
if n:
data += self.serial.read(n)
# for l in xrange(len(data)):
# print '%02X' % ord(data[l])
return data.encode('hex') except Exception as ex:
print str(ex) return data def close(self):
if self.serial.isOpen():
self.serial.close() def run(self):
running = True
i = 0
while running:
sleep(0.5)
# print '*******>> ' + str(i)
GLOBAL_COUNT = i
i = i + 1
#---------------------- self.exec_command_init()
sleep(0.02)
self.exec_command_check() global COMMAND_CHECK_FLAG
if COMMAND_CHECK_FLAG:
recvdata = self.recv()
# print "received data >>> " + str(recvdata)
self.exec_count_cash(recvdata) def exec_command_init(self):
global COMMAND_INIT_FLAG, GLOBAL_OUT_INIT_NUM, COMMAND_CHECK_FLAG
if COMMAND_INIT_FLAG:
GLOBAL_OUT_INIT_NUM += 1 if GLOBAL_OUT_INIT_NUM == 1:
send_data = str(DATA_OUT_DIC['DATA_OUT_1']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 2:
send_data = str(DATA_OUT_DIC['DATA_OUT_1']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 3:
send_data = str(DATA_OUT_DIC['DATA_OUT_1']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 4:
send_data = str(DATA_OUT_DIC['DATA_OUT_2']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 5:
send_data = str(DATA_OUT_DIC['DATA_OUT_3']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 6:
send_data = str(DATA_OUT_DIC['DATA_OUT_4']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 7:
send_data = str(DATA_OUT_DIC['DATA_OUT_1']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 8:
send_data = str(DATA_OUT_DIC['DATA_OUT_5']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 9:
send_data = str(DATA_OUT_DIC['DATA_OUT_1']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 10:
send_data = str(DATA_OUT_DIC['DATA_OUT_6']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 11:
send_data = str(DATA_OUT_DIC['DATA_OUT_7']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 12:
send_data = str(DATA_OUT_DIC['DATA_OUT_1']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 13:
send_data = str(DATA_OUT_DIC['DATA_OUT_8']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 14:
send_data = str(DATA_OUT_DIC['DATA_OUT_9']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 15:
send_data = str(DATA_OUT_DIC['DATA_OUT_10']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 16:
send_data = str(DATA_OUT_DIC['DATA_OUT_11']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 17:
send_data = str(DATA_OUT_DIC['DATA_OUT_12']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 18:
send_data = str(DATA_OUT_DIC['DATA_OUT_13']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 19:
send_data = str(DATA_OUT_DIC['DATA_OUT_14']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 20:
send_data = str(DATA_OUT_DIC['DATA_OUT_9']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 21:
send_data = str(DATA_OUT_DIC['DATA_OUT_12']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_INIT_NUM == 22:
send_data = str(DATA_OUT_DIC['DATA_OUT_9']).decode('hex')
GLOBAL_OUT_INIT_NUM = 0
COMMAND_INIT_FLAG = False
COMMAND_CHECK_FLAG = True
self.send(send_data) def exec_command_check(self):
global COMMAND_CHECK_FLAG, GLOBAL_OUT_CHECK_NUM
if COMMAND_CHECK_FLAG:
GLOBAL_OUT_CHECK_NUM += 1 if GLOBAL_OUT_CHECK_NUM == 1:
send_data = str(DATA_OUT_DIC['DATA_OUT_12']).decode('hex')
self.send(send_data)
elif GLOBAL_OUT_CHECK_NUM == 2:
send_data = str(DATA_OUT_DIC['DATA_OUT_9']).decode('hex')
GLOBAL_OUT_CHECK_NUM = 0
self.send(send_data) def exec_count_cash(self, recvdata=''):
if recvdata:
cach_data = recvdata[8:12]
if cach_data == 'ef01':
global GLOBAL_CASH_1
GLOBAL_CASH_1 += 1
print '1块钱:' + str(GLOBAL_CASH_1) + '张。'
if cach_data == 'ef02':
global GLOBAL_CASH_5
GLOBAL_CASH_5 += 1
print '5块钱:' + str(GLOBAL_CASH_5) + '张。'
if cach_data == 'ef03':
global GLOBAL_CASH_10
GLOBAL_CASH_10 += 1
print '10块钱:' + str(GLOBAL_CASH_10) + '张。'
if cach_data == 'ef04':
global GLOBAL_CASH_20
GLOBAL_CASH_20 += 1
print '20块钱:' + str(GLOBAL_CASH_20) + '张。'
if cach_data == 'ef05':
global GLOBAL_CASH_50
GLOBAL_CASH_50 += 1
print '50块钱:' + str(GLOBAL_CASH_50) + '张。' if __name__ == '__main__':
cserial = CashSerial()
result_status = cserial.open(SERIAL_SETTING) if result_status:
cserial.start() # data = "7F8001116582"
# hexdata = data.decode("hex")
#
# myserial.send(hexdata, _type=None)
#

  插入1元、5元纸币,识别结果为:

1块钱:1张。
5块钱:1张。

Python串口操作纸币器1的更多相关文章

  1. 面向切面编程AOP——加锁、cache、logging、trace、同步等这些较通用的操作,如果都写一个类,则每个用到这些功能的类使用多继承非常难看,AOP就是解决这个问题的,python AOP就是装饰器

    面向切面编程(AOP)是一种编程思想,与OOP并不矛盾,只是它们的关注点相同.面向对象的目的在于抽象和管理,而面向切面的目的在于解耦和复用. 举两个大家都接触过的AOP的例子: 1)java中myba ...

  2. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  3. [python基础]关于装饰器

    在面试的时候,被问到装饰器,在用的最多的时候就@classmethod ,@staticmethod,开口胡乱回答想这和C#的static public 关键字是不是一样的,等面试回来一看,哇,原来是 ...

  4. Day04 - Python 迭代器、装饰器、软件开发规范

    1. 列表生成式 实现对列表中每个数值都加一 第一种,使用for循环,取列表中的值,值加一后,添加到一空列表中,并将新列表赋值给原列表 >>> a = [0, 1, 2, 3, 4, ...

  5. python基础—函数装饰器

    python基础-函数装饰器 1.什么是装饰器 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能. 装饰器的返回值是也是一个函数对象. 装饰器经常用于有切 ...

  6. Python文件操作与函数目录

    文件操作 python文件操作 函数 Python函数学习——初步认识 Python函数学习——作用域与嵌套函数 Python函数学习——匿名函数 python内置函数 Python函数学习——递归 ...

  7. 初学Python——文件操作第二篇

    前言:为什么需要第二篇文件操作?因为第一篇的知识根本不足以支撑基本的需求.下面来一一分析. 一.Python文件操作的特点 首先来类比一下,作为高级编程语言的始祖,C语言如何对文件进行操作? 字符(串 ...

  8. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

  9. (转)Python中操作mysql的pymysql模块详解

    原文:https://www.cnblogs.com/wt11/p/6141225.html https://shockerli.net/post/python3-pymysql/----Python ...

随机推荐

  1. 关于Hibernate框架的面试题

    1.Hibernate的工作原理及为什么要用? 原理: 1读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持 ...

  2. SQL Trigger(触发器)

    1.触发器对表进行插入.更新.删除的时候会自动执行的特殊存储过程. 2.触发器一般用在check约束更加复杂的约束上面. 3.触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作. 4.upd ...

  3. demo_08webStroage案例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. 对 HTTP 304 的理解(转)

    最近和同事一起看Web的Cache问题,又进一步理解了 HTTP 中的 304 又有了一些了解. 304 的标准解释是:Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供 ...

  5. 转载的在DOS下操作mysql

    转载原文地址:http://www.server110.com/mysql/201309/1070.html 一.连接MYSQL. 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1 ...

  6. htm、html、shtml区别

    htm.html.shtml都是静态网页的后缀,三者也可以说都是只是扩展名不同,其他一样,都是静态的网页. htm和html是完全静态的网页不通过服务器编译解释直接送出给浏览器读取的静态网页,以htm ...

  7. [JavaScript] js 复制到剪切板

    zeroclipboard官网:https://github.com/zeroclipboard/ZeroClipboard 下载压缩包,得到两个“ZeroClipboard.js”和“ZeroCli ...

  8. bzoj 2806: [Ctsc2012]Cheat 后缀自动机DP

    2806: [Ctsc2012]Cheat Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 583  Solved: 330[Submit][Statu ...

  9. ECMall系统请求跳转分析

    ecmall是一个基于mvc模式框架系统,跟thinkphp有点像.先从ecmall的入口开始,ecmall入口文件upload/index.php.admin.php: index.php启动ecm ...

  10. 【网络流24题】No.8 机器人路径规划问题

    [题意] 机器人 Rob 可在一个树状路径上自由移动. 给定树状路径 T 上的起点 s 和终点 t, 机器人 Rob 要从 s 运动到 t. 树状路径 T 上有若干可移动的障碍物. 由于路径狭窄, 任 ...