以前一直用的LPT1端口控制小票打印,现在笔记本都没有并口了,如何打印呢?
请给详细说明,最好有例子。找了好长时间了,一直没能解决。谢谢! 回复讨论(解决方案)
买个USB转并口的连接线
买个USB转并口的连接线
这个方法根本不行,小票打印是想端口发送字符串。默认是向并口发送字符串,你这样转换连接线,其实程序还是向usb发送字符串,不能用。现在困惑的就是如何向usb发送字符串?
我也用过usb转com口的转接口啊.连接com设备一点问题都没..
重要的是软件能不能设置com口.
引用 1 楼 wintergoes 的回复:
买个USB转并口的连接线 这个方法根本不行,小票打印是想端口发送字符串。默认是向并口发送字符串,你这样转换连接线,其实程序还是向usb发送字符串,不能用。现在困惑的就是如何向usb发送字符串? 你原来的代码是如何打开LPT1:端口的?
给你我写的一个函数吧, 可以直接往打印机写数据:
uses Printers, WinSpool; function SendDataToPrinter(sDeviceName, sDocName, sData: String): Boolean; //功能描述: 发送数据到打印机 (Powered by Jadeluo) //入口参数: // sDeviceName - 打印机名称 // sDocName - 打印文档名称 // sData - 发送的数据 //出口参数: // 返回值 - True表示成功, False表示失败 var bResult : Boolean; hPrinter : Cardinal; tDocInfo : _DOC_INFO_1A; iWrited : Cardinal; begin bResult := OpenPrinter(PChar(sDeviceName), hPrinter, nil); if bResult then begin tDocInfo.pDocName := PChar(sDocName); tDocInfo.pOutputFile := nil; tDocInfo.pDatatype := nil; bResult := StartDocPrinter(hPrinter, 1, @tDocInfo) <> 0; if bResult then begin bResult := StartPagePrinter(hPrinter); bResult := bResult and WritePrinter(hPrinter, @sData[1], Length(sData), iWrited); bResult := bResult and EndPagePrinter(hPrinter); EndDocPrinter(hPrinter); end; ClosePrinter(hPrinter); end; Result := bResult; end; 打印机名称即在Windows里安装好打印机后, 显示在"打印机和传真"里的打印机名称。 比如,打印机名称为"EPSON LQ-1600K",要发送的数据为 #27#78'1'#0(进纸指令),则调用形式为: SendDataToPrinter('EPSON LQ-1600K', 'PaperFeed', #27#78'1'#0); //'PaperFeed'内容是可以任意的
路过。
给你我写的一个函数吧, 可以直接往打印机写数据:
Delphi(Pascal) code uses Printers, WinSpool;function SendDataToPrinter(sDeviceName, sDocName, sData: String): Boolean;//功能描述: 发送数据到打印机 (Powered by Jadeluo)//入口参数:// sDeviceName- 打印机名称// sDocName- 打印文档名称// sData- 发送的数据//出口参数:// 返回值- True表示成功, False表示失败var bResult : Boolean; hPrinter : Cardinal; tDocInfo : _DOC_INFO_1A; iWrited : Cardinal;begin bResult := OpenPrinter(PChar(sDeviceName), hPrinter,nil);if bResultthenbegin tDocInfo.pDocName := PChar(sDocName); tDocInfo.pOutputFile :=nil; tDocInfo.pDatatype :=nil; bResult := StartDocPrinter(hPrinter,1, @tDocInfo)<>0;if bResultthenbegin bResult := StartPagePrinter(hPrinter); bResult := bResultand WritePrinter(hPrinter, @sData[1], Length(sData), iWrited); bResult := bResultand EndPagePrinter(hPrinter); EndDocPrinter(hPrinter);end; ClosePrinter(hPrinter);end; Result := bResult;end; 打印机名称即在Windows里安装好打印机后, 显示在"打印机和传真"里的打印机名称。 比如,打印机名称为"EPSON LQ-1600K",要发送的数据为 #27#78'1'#0(进纸指令),则调用形式为: SendDataToPrinter('EPSON LQ-1600K', 'PaperFeed', #27#78'1'#0); //'PaperFeed'内容是可以任意的 谢谢这位大侠,但是我按照你上面说的调试,结果打印机一点反应都没有,请指教。用的USB端口,POS58热敏打印机。 我用LPT1端口的时候,使用 的是ASSIGNFILE(F,'LPT1')方法输出字符串;
谢谢这位大侠,但是我按照你上面说的调试,结果打印机一点反应都没有,请指教。用的USB端口,POS58热敏打印机。
我用LPT1端口的时候,使用 的是ASSIGNFILE(F,'LPT1')方法输出字符串; 调用这个函数时一定要正确填写打印机的名称(例子中的''EPSON LQ-1600K'部分)。
用过USB转COM的 没用过并口
去网上找一个读取USB的代码
引用 7 楼 linlingwei 的回复:
谢谢这位大侠,但是我按照你上面说的调试,结果打印机一点反应都没有,请指教。用的USB端口,POS58热敏打印机。 我用LPT1端口的时候,使用 的是ASSIGNFILE(F,'LPT1')方法输出字符串; 调用这个函数时一定要正确填写打印机的名称(例子中的''EPSON LQ-1600K'部分)。 打印机的名字也没错,就是控制面板里显示的名字。打印机也设置为默认打印机了。
uses printers;
printer.BeginDoc; printer.Canvas.TextOut(10,10,'要打印的内容'); printer.EndDoc;
你可以找?家要?DEMO?看看呢
路过。
思路有问题!
不需要直接操作USB,那样相当于自己写驱动,麻烦。 一般现在都是有USB转串口,USB转并口,之类的线。而且买线的时候会带驱动程序光盘。正确安装驱动以后显示在电脑上的就是COM口了,再操作串口就可以了。
思路有问题!
不需要直接操作USB,那样相当于自己写驱动,麻烦。 一般现在都是有USB转串口,USB转并口,之类的线。而且买线的时候会带驱动程序光盘。正确安装驱动以后显示在电脑上的就是COM口了,再操作串口就可以了。 问题是,用USB转并口之类的线,发送字符串的时候还是要发送到USB口呀,原来发送到并口的代码还是不能用呀。
用网络,控制支持的LPT1终端,打印。
使用驱动程序,添加打印机,设置端口
引用 16 楼 ziseliuxingzh 的回复:
思路有问题! 不需要直接操作USB,那样相当于自己写驱动,麻烦。 一般现在都是有USB转串口,USB转并口,之类的线。而且买线的时候会带驱动程序光盘。正确安装驱动以后显示在电脑上的就是COM口了,再操作串口就可以了。 问题是,用USB转并口之类的线,发送字符串的时候还是要发送到USB口呀,原来发送到并口的代码还是不能用呀。 驱动后电脑上显示的就不是USB端口了,COM口或者是并口,但是操作都一样了,ASSIGNFILE(F,'LPT1')或者ASSIGNFILE(F,'COM1')。你试试就明白了。
这个问题到现在还没解决,请求高手出现。
这个需要硬件驱动支持,有了驱动,依据它提供的DLL或者OCX来编程控制就是了。
http://zhidao.baidu.com/question/126575298.html?fr=newQuestion
很久没搞过这个了!
共享驱动就可以了!
安装打印机驱动,选择USB端口,然后共享,在程序中通过文件写入的方式,通过USB端口送出去
安装打印机驱动,选择USB端口,然后共享,在程序中通过文件写入的方式,通过USB端口送出去
case Combobox1.ItemIndex of 0 : assignfile(Fprt,'LPT1'); 1 : assignfile(Fprt,'LPT2'); 2 : assignfile(Fprt,'COM1'); 3 : assignfile(Fprt,'COM2'); 4 : assignfile(Fprt,'PrintOut.txt'); 5 : assignfile(Fprt,'\\S4\HPLaserJ\HP LaserJet 2100'); end; 格式:\\电脑名称+\+共享名称+\打印机驱动
关键是打印机是USB接口的,如果不是并口的,可用转换头。但要有驱动程序。
给你我写的一个函数吧, 可以直接往打印机写数据:
Delphi(Pascal) code uses Printers, WinSpool;function SendDataToPrinter(sDeviceName, sDocName, sData: String): Boolean;//功能描述: 发送数据到打印机 (Powered by Jadeluo)//入口参数:// sDeviceName- 打印机名称// sDocName- 打印文档名称// sData- 发送的数据//出口参数:// 返回值- True表示成功, False表示失败var bResult : Boolean; hPrinter : Cardinal; tDocInfo : _DOC_INFO_1A; iWrited : Cardinal;begin bResult := OpenPrinter(PChar(sDeviceName), hPrinter,nil);if bResultthenbegin tDocInfo.pDocName := PChar(sDocName); tDocInfo.pOutputFile :=nil; tDocInfo.pDatatype :=nil; bResult := StartDocPrinter(hPrinter,1, @tDocInfo)<>0;if bResultthenbegin bResult := StartPagePrinter(hPrinter); bResult := bResultand WritePrinter(hPrinter, @sData[1], Length(sData), iWrited); bResult := bResultand EndPagePrinter(hPrinter); EndDocPrinter(hPrinter);end; ClosePrinter(hPrinter);end; Result := bResult;end; 我也是按这位高手的代码来控制USB打印机打印,数据确实存入了打印机的打印列表,但打印机无任何反应(打印机名字无误)...超级郁闷,盼更高的高手解决!
我目前也遇到楼主一样的问题,,
呵呵,,以上各位虽然解答很热心,但是却全部无效答案。呵呵,, 在串口,LPT打印口,,我们可以直接通过 CreateFile("LPT1",,,,,,,) 这种方式,打开打印口,然后发送对应的数据以及指令,, 可是在USB的时候,这个函数却无效。不管是你"\\\\usb001"管道,还别的方式,, 查看MSDN只有一句话,USB打印机,IO端口设置查询指令 IOCTL_USBPRINT_VENDOR_GET_COMMAND IOCTL_USBPRINT_VENDOR_SET_COMMAND 通过 DeviceIoControl,来取得设置字符, 一直都没闹清楚,,这个USB设置字符串怎么取得,所有例程都是HID设备的。没有打印设备的。
对了,,我们这个打印机是不需要装驱动程序的,呵呵,,
我们软件直接操作打印机,,如果安装驱动的话,就会调用windows打印服务, 那么所有的打印内容就会被windows自动转化成图形模式打印,打印速度超级慢, 我们只需要打印文字,不需要图形。
procedure TForm1.Button1Click(Sender: TObject);
var f : TextFile; i : Integer; begin AssignPrn(f); Rewrite(f); Printer.Canvas.Font.Name := '宋体'; Printer.Canvas.Font.Size := 8; for i := 0 to Memo1.Lines.Count - 1 do Writeln(f,memo1.Lines[i]); CloseFile(f); end; //上面的方法是没有问题了,呵呵。Memo1中是要打印的文本。
某些系统或软件只支持LPT接口的打印机,如果打印机刚好没有LPT口,这就需要我们用USB接口来虚拟LPT口,实现打印
第一步,配置网卡的IP地址,指定一个固定IP与子网掩码; 第二步,共享USB接口的条码打印机,记得起一个简单易记的名字,我的打印机起名叫Zebra888; 第三步,映射出刚才共享的打印机到LPT1端口,在命令行端口运行NET USE LPT1: \\计算机名或IP\打印机名 /Persistent:YES,回车;(把计算机名或IP和打印机名改成你自己的) 第四步,电脑重启后需要重新执行一下四步的命令,我们可以建立一个批处理文件,放到启动项中 这样可以,我试了! |
|