使用Windows PowerShell发送ESC/POS命令至Epson TM20ii打印异常求助
解决ESC/POS指令通过Out-Printer发送被打印成文本的问题
问题根源
Out-Printer的作用是将文本内容传递给打印机驱动,驱动会负责把文本转换成打印机能识别的格式(比如处理字体、换行、页边距等)。但ESC/POS是打印机的二进制控制指令(比如LF对应的是ASCII码0x0A),直接发送字符串"LF"会被驱动当成普通文本,自然就打印出这两个字符了——不管是Epson官方驱动还是通用文本驱动,都是为处理普通文本设计的,不会解析这类字符串形式的指令。
正确解决方案:绕过驱动,直接发送二进制指令
要让打印机执行ESC/POS命令,必须直接把指令对应的二进制字节发送到打印机的硬件端口(串口、USB转串口、网络端口),完全绕过驱动的文本处理逻辑。下面是几种常见场景的实现方式:
1. 串口/USB转串口打印机
先在设备管理器里确认打印机对应的串口(比如COM3),然后用PowerShell直接操作串口发送字节:
# 定义LF指令对应的二进制字节(0x0A) $lfCommand = [byte]0x0A # 初始化串口连接(参数根据打印机设置调整,波特率一般是9600) $serialPort = New-Object System.IO.Ports.SerialPort("COM3", 9600, "None", 8, "One") $serialPort.Open() # 发送指令 $serialPort.Write([byte[]]($lfCommand), 0, 1) # 关闭连接 $serialPort.Close()
2. 网络打印机(IP连接)
大多数网络打印机支持通过9100端口接收原始ESC/POS指令,用Socket直接发送:
# 打印机的IP和端口(默认9100) $printerIp = "192.168.1.100" $printerPort = 9100 # 定义LF指令的二进制字节 $lfCommand = [byte]0x0A # 建立TCP连接并发送指令 $tcpClient = New-Object System.Net.Sockets.TcpClient($printerIp, $printerPort) $stream = $tcpClient.GetStream() $stream.Write([byte[]]($lfCommand), 0, 1) # 关闭连接 $stream.Close() $tcpClient.Close()
3. 组合文本与控制指令
如果需要打印文本同时执行控制命令(比如打印完内容后走纸两行),可以把文本转换成ASCII字节,再和控制指令的字节拼接后发送:
# 要打印的文本(转成ASCII字节) $receiptText = "感谢您的购买!`r`n订单号:20240520001" $textBytes = [System.Text.Encoding]::ASCII.GetBytes($receiptText) # 控制指令:走纸两行(两个0x0A字节) $feedLines = [byte[]](0x0A, 0x0A) # 拼接完整指令 $fullCommand = $textBytes + $feedLines # 发送到网络打印机 $tcpClient = New-Object System.Net.Sockets.TcpClient("192.168.1.100", 9100) $stream = $tcpClient.GetStream() $stream.Write($fullCommand, 0, $fullCommand.Length) $stream.Close() $tcpClient.Close()
额外注意事项
- 确认打印机的端口参数(波特率、奇偶校验等)和代码里的设置一致,否则可能出现指令不执行或乱码。
- 如果你用的是USB直连打印机,有些型号需要先安装虚拟串口驱动,才能用串口方式发送指令;或者可以使用Windows的
RawPrinterHelper类(需要调用.NET API)直接发送到USB打印机的原始队列。
内容的提问来源于stack exchange,提问作者Ibber Chochem
相关产品推荐
相关产品推荐

