Команда Epson ESC/POS DLE EOT n не возвращает ответ

Я делаю программу, которая общается с принтером Epson TM-T88IV, используя команды ESC/POS через сокет в C#. Когда я посылаю команду 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 ответа

Принтер находится в состоянии готовности, когда открыта крышка или нет бумаги. Я думаю, что метод (или драйвер принтера) просто не может отправить DLE EOT X на принтер, который не имеет состояния готовности.

Принтер будет отвечать только на DLE EOT если он в сети, если вы не используете старый последовательный интерфейс.

Я не смог найти такую ​​информацию в онлайн-документах Epson, но вы можете прочитать об этом в документе, доступном на w3m Escpos Guide, слайд 414.

Пожалуйста, смотрите также mike42 прокомментировал 2 августа 2015:

Я думаю, что DLE EOT имеет ограниченную полезность: он возвращает символы объектов, содержащие все правильные флаги состояния, если принтер только что был перезагружен (и еще не выводил какой-либо вывод). Для принтера, который печатал, он работал правильно только в том случае, если принтер находился в режиме онлайн. В противном случае ответы зависали до тех пор, пока принтер не подключился (т. Е. Пользователь закрыл крышку или заменил бумагу).

Если вы используете современный интерфейс, такой как Ethernet или USB, вы можете дать ASB попытка


НОТА:

Я знаю, что этот вопрос несколько устарел, но так как я столкнулся с той же проблемой, и Google сказал мне, что несколько других людей тоже, я думаю, что стоит поделиться тем, что я узнал.

Скопировано из этого комментария:

Относительно DLE EOT (в режиме реального времени): на TM-T20II (хотя я уверен, что это работает для многих Epsons), если вы включите переключатель памяти 1-3 (который устанавливает "состояние BUSY" в "приемный буфер заполнен" из "приемный буфер заполнен или отключен"), принтер будет реагировать на DLE EOT все время, в том числе когда крышка открыта или на ней нет бумаги.

Согласно инструкции, принтер переходит в автономный режим в следующих случаях:

  • Во время включения, пока принтер не будет готов
  • Во время самопроверки
  • Пока рулонная бумага подается с помощью кнопки подачи
  • Когда крышка рулонной бумаги открыта
  • Когда принтер прекращает печать из-за конца бумаги
  • В режиме ожидания выполнения макроса
  • Когда произошла ошибка

Таким образом, изменение настроек выше делает его "не занятым", когда в этих состояниях.

Другие вопросы по тегам