Как избежать перезагрузки Bluetooth-принтера после печати?

Я разработал приложение для Windows Mobile 6.1, которое ищет близлежащие устройства Bluetooth и отправляет файлы. Также я сделал функцию печати для печати документа на принтере Bluetooth.

Функция печати в первый раз работает отлично, но когда я снова печатаю документ, мне нужно перезапустить принтер, а затем он будет печатать.

Есть ли решение, чтобы избежать перезагрузки принтера??

Ниже приведен мой код печати из ссылки https://32feet.codeplex.com/discussions/355451.

private void btPrint_Click(object sender, EventArgs e)
    {            
        // Activate BT
        BluetoothRadio.PrimaryRadio.Mode = RadioMode.Connectable;
        System.Threading.Thread.Sleep(1000);
        // Connect  
        BluetoothAddress btAddress;
        btAddress = BluetoothAddress.Parse("0022583165F7");            
        BluetoothClient btClient = new BluetoothClient();
        try
        {
            btClient.Connect(new BluetoothEndPoint(btAddress, BluetoothService.SerialPort));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return;
        }
        // Send data
        string CPCLStr1 =
            "! 0 200 200 210 1" + Environment.NewLine +
            "ML 25" + Environment.NewLine +
            "TEXT 7 0 10 20" + Environment.NewLine +
            "Just" + Environment.NewLine +
            "Testing" + Environment.NewLine +
            "ENDML" + Environment.NewLine +
            "FORM" + Environment.NewLine +
            "PRINT" + Environment.NewLine;

        // Convert CPCL String to byte array
        byte[] CPCLbytes1 = ASCIIEncoding.ASCII.GetBytes(CPCLStr1);

        NetworkStream ns = btClient.GetStream();
        ns.Write(CPCLbytes1, 0, CPCLbytes1.Length);

        btClient.Close();
    }

person Harsh    schedule 03.06.2014    source источник


Ответы (1)


Хотя вы закрываете клиентский поток, принтер, похоже, ждет некоторое время, прежде чем сбросить сеанс.

Попробуйте отправить байт EOF или EOT в конце.

Согласно справочнику CPCL, нет простой команды сброса, как, например, с ESC/p ({esc}@).

Выполнение сброса устройства после каждой печати кажется излишним.

РЕДАКТИРОВАТЬ: образец SDK для sendFile:

                Byte[] cpclLabel = Encoding.Default.GetBytes("! 0 200 200 406 1\r\n" + "ON-FEED IGNORE\r\n"
                + "BOX 20 20 380 380 8\r\n"
                + "T 0 6 137 177 TEST\r\n"
                + "PRINT\r\n");

Вышеописанное отлично работает на моем RW420 без необходимости перезагрузки между отпечатками.

person josef    schedule 03.06.2014
comment
Спасибо за ответ, josef. Но как отправить байт EOT в конце? Я имею в виду, что я искал это в Google, но не смог найти конкретного решения для отправки тега EOT. Я также прочитал справочное руководство CPCL для этого, но они не объяснили подробно. - person Harsh; 04.06.2014
comment
вы добавляете 0x04 (EOT char, он же EOF, это одно и то же) в конце вашего байтового буфера. Например, завершив последнюю строку PRINT\r\n словами PRINT + Environment.NewLine + \x04; - person josef; 04.06.2014
comment
Все та же проблема, josef. Не работает PRINT + Environment.NewLine + \x04. У вас есть другое решение или источник?? - person Harsh; 05.06.2014
comment
Попробуйте (сбросить и) закрыть NetworkStream перед закрытием клиента. Кажется, что принтер BT все еще ожидает дополнительных данных и не считает задание завершенным. Также в руководстве указано, что принтеру ВСЕГДА требуется ПЕЧАТЬ‹0x0D›‹0x0A› в конце команды управления заданием (ПЕЧАТЬ + CR + LF). Возможно, Environment.NewLine не отправляет CR+LF в конце, попробуйте закодировать его напрямую, используя \x0d\x0a. - person josef; 05.06.2014
comment
Тем не менее, это не работает, josef. У вас есть другое решение? - person Harsh; 09.06.2014
comment
Извините, больше нет идей. Используете ли вы правильные средства массовой информации? Пробовали ли вы демо-версию ZebraSDK для SendFile? - person josef; 10.06.2014
comment
В строке btClient.Connect появляется ошибка. - person Harsh; 20.06.2014
comment
Эта ошибка означает, что принтер не принимает соединение, т. е. он может поддерживать только одно соединение, но все еще занят... Вы корректно закрыли соединение после использования? Я предлагаю сначала закрыть поток (ns.Close), затем соединение (btClient.Disconnect(), btClient.Close()), затем удалить клиента (bt.Dispose()), а затем установить его в NULL (btClient=null ). Или вы создаете одноэлементный btClient, который используется и сохраняется на протяжении всего времени существования вашего приложения. - person josef; 22.06.2014
comment
Я сделал все, но все еще та же проблема. Ошибка возникает при подключении сокета. Вы можете увидеть код в этой ссылке. symbolsource.org/Public/Metadata/NuGet/Project/32feet.NET/. где вы можете найти функцию Connect(), где я получил ошибку. - person Harsh; 23.06.2014
comment
Ссылка представляет собой стандартный 32-футовый код. Но он не показывает, как вы устанавливаете, закрываете и удаляете соединение перед отправкой другого задания на печать. У меня никогда не было такой проблемы с портативными Bluetooth-принтерами. Но близко, утилизируйте и обнулите используемые объекты, прежде чем я начну другую печать. - person josef; 24.06.2014
comment
@Harsh Вы смогли решить проблему, у меня сейчас похожая проблема, я работаю здесь с библиотекой Printooth. github.com/mazenrashed/Printooth После успешной печати. Мне придется перезапустить принтер, прежде чем он снова сможет печатать. - person Otunba Tosyne Joseph; 28.12.2020