爱普生ESC/POS命令DLE EOT n没有返回响应。

3
我正在制作一个程序,使用C#通过套接字与Epson TM-T88IV打印机进行ESCP/POS命令通信。当我发送带有关闭盖子和纸张充足的DLE EOT n命令时,它会立即以字节数组返回正确的代码。然而,当我打开盖子或取出纸张尝试模拟错误时,没有DLE EOT命令(1、2、3或4)会返回任何内容。Socket.receive方法一直处于挂起状态直到超时。我能够向这台打印机打印并进行换行、切割等操作。
以下是我的代码:
public class clsPrinter
{
  TcpListener server;
  MemoryStream ms = new MemoryStream();
  BinaryWriter bw;
  Socket clientSock = new Socket(AddressFamily.InterNetwork,
                                 SocketType.Stream, 
                                 ProtocolType.Tcp);
  string printerIP;
  Encoding enc = Encoding.ASCII;


  public clsPrinter(string printerIP)
  {
    this.printerIP = printerIP;
    bw = new BinaryWriter(ms);
    clientSock.NoDelay = true;
    clientSock = new Socket(AddressFamily.InterNetwork,
                            SocketType.Stream, 
                            ProtocolType.Tcp);
    IPAddress ip = IPAddress.Parse(printerIP);
    IPEndPoint remoteEP = new IPEndPoint(ip, 9100);
    clientSock.Connect(remoteEP);
  }

  public void getPrinterStatus()
  {
    try
    {
      byte[] byData = new byte[] { 16, 4, 1 }; // DLE EOT 1
      sendToPrinter(byData);

      byte[] bytes = new byte[1024];
      int bytesReceived = clientSock.Receive(bytes);
    }
    catch (Exception ex)
    {
    }

  }

  public void sendToPrinter(byte[] byteStream)
  {
    clientSock.Send(byteStream);
  }

有什么想法吗?

3个回答

2
如果打印机处于在线状态,它只会在收到“DLE EOT”时回复,除非您使用旧的串行接口。我在爱普生的在线文档中找不到这样的信息,但是您可以在w3m Escpos Guide的第414页中阅读相关信息。请参见mike42 2015年8月2日的评论。如果您正在使用像以太网或USB这样的现代接口,可以尝试使用“ASB”。注意:虽然这个问题有点老,但由于我也遇到了同样的问题,而且谷歌告诉我还有其他几个人也遇到了这个问题,所以我认为值得分享一下我所学到的知识。

2
打印机处于未准备好状态,可能是因为盖子没关或者缺纸。我认为方法(或打印机驱动程序)无法向未准备好的打印机发送DLE EOT X。

1

this comment复制:

关于DLE EOT(实时状态):在TM-T20II上(尽管我确信这适用于许多爱普生产品),如果您打开内存开关1-3(将“忙状态”设置为“接收缓冲区已满”而不是“接收缓冲区已满或脱机”),则打印机将始终响应DLE EOT,即使盖子打开或缺纸。

根据手册,在以下情况下,打印机会进入“离线”模式:

  • 在通电后,直到打印机准备就绪
  • 在自检期间
  • 使用进纸按钮馈送卷纸时
  • 当滚动纸盖打开时
  • 当打印机因纸张结束而停止打印时
  • 在宏执行待机状态期间
  • 发生错误时

因此,上述设置更改使其在这些状态下“非忙碌”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接