這個程序主要是使用超市掃碼儀掃商品的條形碼,讀取商品信息,實現計費功能。主要用到的技術是串口通信,數據庫的操作,需要的環境包括:python環境,mysql,python庫(serial,MySQLdb)等等。
這個程序的主要過程是:使用掃碼儀掃描商品條形碼,通過串口通信獲取商品條形碼,通過該條形碼獲取商品信息,顯示該商品信息並統計總費用。其中商品信息保存在數據庫中,可事先導入或者手動導入商品信息,而我的在這裏是事先導入的(也可以邊掃邊倒入信息),導入到數據庫中的信息如下:
程序代碼如下:
#coding:utf8
import serial
import MySQLdb
ser = serial.Serial('COM5',9600)
#獲取一行信息
def recv(serial):
data = ''
while serial.inWaiting() > 0:
data += serial.read(1)
return data
def GetInfo(db,data):
data = data[0:-1] #最後面有一個空格,需要去掉,否則會影響讀數據庫
print data
ret = 0.0
try:
cur = db.cursor()
sql="set names utf8" #這一條語句是告訴數據庫編碼方式爲 utf8
cur.execute(sql)
sql = "select * from productinfo where code=%s"%(data)
#print sql
cur.execute(sql)
#sql = "select * from productinfo where(code=%s)"
#cur.execute(sql,data)
results = cur.fetchall()
#print results
for row in results:
code = row[0]
#print code
price = row[1]
#print price
info = row[2]
#print info
ret = price
#解析出來的信息可能爲中文,直接print肯定是不行的,需要轉化爲windows下的GBK編碼
print 'coding=',row[0],'price=',row[1],'info=',info.decode('UTF-8').encode('GBK')
except:
print 'it has no infomation about %s'%(data)
return ret
db = MySQLdb.connect('localhost','root','',"zou",3306,'utf8')
cursor = db.cursor()
#cursor.execute("DROP TABLE IF EXISTS productinfo")
'''
sql="""CREATE TABLE productinfo(
code CHAR(18),
price double(9,2),
info CHAR(25))"""
cursor.execute(sql)
'''
sum = 0.0
while True:
data = recv(ser)
if data != '':
#print data
sum += GetInfo(db,data)
print '總付款:',sum
db.close()
ser.close()
由於剛剛開始學習python,所以代碼規範上做的還不是很好,希望大家多多指出,最後程序的運行如下:
其中我的程序中可以使用中文(剛剛開始不是顯示?就是顯示亂碼),這個問題我在前面的博客中談論過,需要處理數據庫以及從數據庫讀取的數據的編碼方式。若是大家看出什麼錯誤或是有意見的話,歡飲大家留言。