公司需要纸币器开发,参考纸币器文档和网上的一篇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. 新浪微博 iOS SDK获得用户信息

    代码 - (void)getUserInfo { NSMutableDictionary *params = [NSMutableDictionary dictionaryWithCapacity:2 ...

  2. 管理员把我的admin权限去掉了,那么如何获得jdk zip安装呢?这篇可以帮你。

    JDK is not available as a portable zip unfortunately. However, you can: Create working JDK directory ...

  3. LINUX开机启动过程

    LINUX开机启动过程 启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息 ...

  4. 高效线程池之无锁化实现(Linux C)

    from:http://blog.csdn.net/xhjcehust/article/details/45844901 笔者之前练手写过一个小的线程池版本(已上传至https://github.co ...

  5. SimpleXML解析xml文件

    SimpleXML 扩展提供了一种获取 XML 元素的名称和文本的简单方式. 与 DOM 或 Expat 解析器相比,SimpleXML 仅仅用几行代码就可以从 XML 元素中读取文本数据. Simp ...

  6. Qt之json解析

    Jsoner::Jsoner(QObject *parent) : QObject(parent){    QJsonObject json;    json.insert("loginna ...

  7. C语言-04函数

    1.参数 参数注意点 1.形式参数:定义函数时函数名后面中的参数,简称形参 2.实际参数:调用函数式传入的具体数据,简称实参 3.实参个数必须等于形参个数 4.函数体内部不能定义和形参一样的变量 5. ...

  8. ios 网络字节顺序的转换HTOS

    最近用socket发送data遇到个问题,字节高地位和服务器不匹配,搞了好久才找到解决的方案,主要用到两个函数HTOL HTOS STOH LTOL 故写此博文 什么是字节序 采用维基百科的解释如下: ...

  9. Tekla Structures 使用类库概览

    Tekla Structures 2016 已经发布了,使用了 Ribbon 的全新 UI 风格,比以前要漂亮许多. 不过功能方面貌似没啥大的改进,感觉天宝的主要精力都投入到了混凝土模块上,忙着和别人 ...

  10. NET笔记——Delegate

    对于初学者,委托是很容易让人晕的,一是晕它如何起作用,二是晕它有什么用. 最近回过头来又看了下委托,又有些不同的感觉,写之自用. 声明方面,委托可以被声明在类内,也可以与类同级,并且声明时没有方法体: ...