导语:网上有很多文章介绍树莓派不用驱动直接用USB接口的各类热敏打印机,但是由于硬件环境和Linux版本不同,很难有一篇文章能够完整地讲述如何无驱动打印(我就是因为网上的一篇文章方法有缺陷足足浪费了一天半的时间)。下面我将根据自己的经验详细地介绍如何利用树莓派完成POS58打印机的无驱动打印,让各位少走弯路。
1. 编程语言
在正式开工之前,我觉得有必要介绍一下接下来要用的语言——Python。
简单的‘HelloWorld!’
Python命令行
假设你已经安装好了Python,那么在Linux命令行输入:
$python
将直接进入python。然后在命令行提示符>>>后面输入:
>>>print('HelloWorld!')
可以看到,随后在屏幕上输出:
Hello World!
print是一个常用函数,其功能就是输出括号中得字符串。
(在Python 2.x中,print还可以是一个关键字,可写成print 'Hello World!',但这在3.x中行不通 )
另一个使用Python的方法,是写一个Python程序。用文本编辑器写一个.py结尾的
文件,比如说hello.py
在hello.py中写入如下,并保存:
print('HelloWorld!')
退出文本编辑器,然后在命令行输入:
$python hello.py
来运行hello.py。可以看到Python随后输出
Hello World!
另外还可以把Python程序hello.py改成一个可执行的脚本,直接执行,在这里就不做过多的赘述。
程序模式: 写一段Python程序并运行。python-escpos是一个可以让用户来访问那些支持ESC/POS命令的打印机的Python库。因此利用它即可完成实现在树莓派下的无驱打印功能。
本文在Raspbian测试通过
2、需要安装的软件
进行下面操作之前要在Linux终端下sudo su,因为有些命令必须拥有权限才能执行。
Pyusb
为了连接打印机,你需要安装python-usb这个库,用于直接通过usb接口来操作usb设备。本文的第一个坑就出在这里,因为pip库里的版本有一个bug的方式在后面的库会用到,所以必须用从github里最新的去除了bug的代码里安装才不会出问题。所以只能用这样子的方式来安装才行。
>git clonehttps://github.com/walac/pyusb.git
>cd pyusb
>python setup.py install
setuptools
> wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py
> python ez_setup.py --user
Pip
Pip安装用的是很简单粗暴的方法,首先在pip的python官网上下载pip的压缩包。
然后直接把压缩包拷到树莓派的SD卡中,重新启动树莓派后直接将压缩包cp到/home/pi/下,接着:
>tar -xvf pip-6.1.1.tar.gz
>cd pip-6.1.1
> sudo python setup.py install
python-qrcode
> git clone https://github.com/lincolnloop/python-qrcode > cd python-qrcode > python setup.py build > sudo python setup.py install
escpos
上图是网上的方法,但是第一句就执行不下去了,是不是得翻墙才能下载呢?
所以再次简单粗暴了一回,具体方法和安装PIP时一样,先在浏览器中输入http://python-escpos.googlecode.com/files/python-escpos-1.0.tgz,输完直接会下载压缩包,按照之前讲的方法cp到/home/pi下后:
> tar zxvf python-escpos-1.0.tgz > cd python-escpos-1.0 > python setup.py build > sudo python setup.py install
当然安装escpos貌似还有一条捷径可走,就是在命令行中直接输入:
>sudo pip install python-escpos
(这也是前面我安装PIP的主要原因,不过我用这条语句没有安装成功)
以上的工作全部完成后,需要在命令行中在输入:
> apt-get install python-imaging python-usb python2.7-usbtc08 python-serial
添加一些接下来Python程序需要用的库
定义打印机
先把打印机用usb线接到树莓派上,然后在树莓派执行 lsusb 命令,这个时候会列表连接上的所有usb设备,如下:
这个时候不知道谁是打印机呢!不过不要紧,你拔掉打印机的usb线后再执行一次,看缺谁,谁就是打印机了。
ID后冒号隔开的两个数字就是usb设备的 vendor ID和productId了,记下来先。如上图所示,vendor ID:0x0416 product:0x5011
from escpos import *
pt = printer.Usb(0x0416, 0x5011, 0, out_ep=0x01)
此处要注意 out_ep 不能用默认值,默认的铁定打不了,所以下面给一段自动获取 out_ep 的代码:
importusb.core
importusb.util
importsys
dev =usb.core.find(idVendor= 0x0416, idProduct= 0x5011)
cfg =dev.get_active_configuration()
intf =cfg[(0,0)]
ep =usb.util.find_descriptor( intf,
#match the first OUT endpoint
custom_match= \
lambdae: \ u
sb.util.endpoint_direction(e.bEndpointAddress)== \
usb.util.ENDPOINT_OUT)
printep
dev.reset()
我手头的打印机获取到的out_ep是0x01,所以我就写的这个值。 另外ESCPOS压缩包README文件里有讲:
issue the following commandso you can get the "Interface" number and "End Point".
lsusb -vvv -dxxxx:xxxx | grep iInterface
lsusb -vvv -d xxxx:xxxx | grep bEndpointAddress| grep OUT
The first commandwill yields the "Interface" number that must
be handy to haveand the second yields the "Output Endpoint"
address.
By default the"Interface" number is "0" and the "OutputEndpoint"
address is"0x82", if you have other valuesthen you can define
with your instance.
所以在命令行里输入:
lsusb -vvv -d 0416:5011 | grep bEndpointAddress | grepOUT
定义打印机实例
# -*- coding: UTF-8 -*- 设置可以打印中文
from escpos import *
usb = printer.Usb(0x0416, 0x5011, 0, out_ep=0x01)
usb.text(u"树莓派\n\n\n\n\n".encode('gbk'))
usb.image(‘image path’) #打印图片
usb.barcode #打印条形码
usb.barcode('1324354657687','EAN13',64,2,'','')
usb.cut() #切纸
参考文献:
http://liming.me/post/usb
http://blog.csdn.net/Fashionxu/article/details/9000761
http://blog.csdn.net/my2010sam/article/details/18315687
http://tieba.baidu.com/p/3700342722