usb打印机驱动调试记录

来源:互联网 发布:mac照片图库占用空间 编辑:程序博客网 时间:2024/04/28 15:28

USB打印机驱动调试总结

主流的操作系统里面都会支持usb打印机驱动,比如linuxwindowsvxworks等,但是这里指的驱动是指的打印机最底层的驱动,而不是指特定打印机的 驱动。打印机驱动相对于其它驱动而言,比如说键盘,鼠标等的驱动有很大区别,键盘鼠标驱动的类型比较统一,但打印机不一样,各个厂家打印机使用的驱动不一样,甚至同一个厂家,不同型号的打印机驱动都不一样。操作系统支持的打印机驱动是在这样一个层面,它给你搭建一个usb传输数据的通道,只要你系统上的usb口能够正常的传输数据到打印机,那么这层的程序功能也就完了。

至于你要传输什么字节流给打印机,打印机是否识别这种字节流,这就和打印机有关了,不同打印机在这方面是不一样的。就像你windows下买了一个打印机,插到windows下,你会发现操作系统识别了打印机,但任然需要安装它打印机驱动是一个道理。那如何验证某个操作系统下的usb打印机端口是没问题的呢?有一个办法,就是用一个usb抓包工具,在windows下抓取usb端口发往打印机的数据流,把这个数据流原封不动的在我的系统下发往打印机,如果打印机打印东西了,那说明我操作系统的打印机驱动是没问题的,这个工具在windows下可以用USBTrace,它是一个很强大的usb抓包工具。

操作系统自带usb打印机驱动没问题后,插上打印机后会在显示终端上有反应。Vxworkslinux下会在相应的设备节点上生成相应的设备节点,如果我要往打印机发东西,只需要用write函数往该节点发东西就行了。那打印机厂家有没有开源他们打印机驱动的代码呢?答案是有的,打印机厂家在linux中开放了一些打印机的源代码,这个集成包叫做FOO2ZJS,里面包含了一些类型的打印机驱动。如果打印机厂家没有给你提供这个打印机的源码,你个人是不可能写出他打印机的驱动的。因为你可以查看发往打印机的字节流,这种字节流不是以你要打印对象的方式(比如ASCII码“abc”或者汉字流)发往打印机的,它是一种图像流,如果是激光打印机,他的编码还跟激光工作的方式有关,如果你不是这个打印机的生产厂家,你没法做到。Foo2zjs集成包包含了三星的,以惠普的打印机居多,可以把它的源码下载下来,在linux上安装。安装后会在linux上生成很多打印命令,我用的打印机HP1020是在foo2zjs.c文件中你其实可以把这文件单独拿出来编译,它文件中的main函数就是foo2zjs命令的入口。你可以把它移植到任何操作系统下,这个文件的功能是什么呢?它的功能是把一个pbm的文件转化为打印机(这种打印机是它代码里面支持的)能够打印的格式。

linux下一般的方式是把一个你需要打印的文件转化为pdf文件(这种工具在window下很多),再把pdf文件用linux下的ghostscript工具转化为pbm文件,再将这种文件交给foo2zjs一开始我想不通它怎么会这么麻烦?这种方式且不说我在linux程序里面不能打印我想打印的字符串,就是我用这种方式转化了以后打印,我在windows下转化为pdf,那我直接在windous下打印不就得了么,何必我要绕这么一个弯来打印呢?

之前忽略了一点,就是这种pbm文件,这种pbm文件到底是种什么文件,用二进制工具打开它,会发现其实它是一种最原始简单的位图文件。

这种文件以P4.#开头,后面是一堆没用的注释以十六进制数0A结束,其中的8261169很关键,这个代表了这个位图的宽和高,也就是这张图宽有826个点,高有1169个点,这其实就是图片的像素。在pbm这种图片中是以01来表示颜色,0表示白,1表示黑。可以用高级的图片查看器打开它,比如说ACDSee软件。这样一看就明白了当时的程序员为什么要这么设计了,因为打印机要支持汉字,又要支持图片,甚至其它国家的语言。最简单的方式是不管你是什么,只要给它转化为图片格式就行,你这图像是什么样,我就给你打印成什么样。

也就是说如果我要打印一个东西,只要我能把它转化为pbm格式(应该还有其它图片格式,比如说彩色图片,我的打印机是黑白的)。然后调用这个foo2zjs就可以把它打印出来,如何把字体从程序中打印出来?思路是有的,看懂pbm的格式后,我们可以把字体点阵的形式写在pbm中,因为任何字体,都是以点阵的形式保存的。把字体转化为图形这不是难事。