2015-10-28 4 views
0

Заранее спасибо за это!Печать от малины pi через usb4java

Я использую Java приложение для отправки байт через интерфейс USB к чекового принтера EPSON TM-T88V с помощью ESC/POS команды

поведение отличается при выполнении на Raspberry Pi по сравнению с тем, когда выполняется на моем DEV ноутбук (! что супер странно)

Когда байты печатаются с Raspberry Pi - он останавливается до завершения

код, как показано ниже:

public void sendToPrinter(byte[] message) throws UsbException { 
    UsbDevice device = getPrinterDevice(); //find the usb using usb4java 

    UsbConfiguration configuration = device.getActiveUsbConfiguration(); 
    UsbInterface iface = configuration.getUsbInterfaces().get(0); //There was only 1 

    if (!iface.isClaimed()) { 
     iface.claim(usbInterface -> true); 
    } 

    UsbEndpoint endpoint = (UsbEndpoint) iface.getUsbEndpoints().get(0); 
    UsbPipe pipe = endpoint.getUsbPipe(); 

    pipe.open(); 

    try { 
     LOG.info(Arrays.toString(message)); 
     int sent = pipe.syncSubmit(message); 
     LOG.info("Bytes Sent: " + sent); 
    } finally { 
     pipe.close(); 
    } 

    iface.release(); 
} 

Вещи я исследованные:

  1. Я читал о java8, что во время тяжелой обработки, пи может потерять власть USB устройств, и я модернизировал источник питания к пи, так что она получает 2A
  2. Я попытался сравнить байты, отправленные на принтер, с моей машины dev и pi, и они идентичны (отправленные байты и количество отправленных байт идентичны)

Я могу предоставить дополнительную информацию о байтах, которые я отправил к принтеру, хотя команды esc/pos, отправленные с моего ноутбука, работают так, как ожидалось, поэтому я не верю это может быть причиной, но может быть и неправильным!

Еще раз спасибо за вашу помощь!

ответ

0

Я, кажется, нашел решение

Нарезка массив и отправка 8 байт в то время, позволил принтер/пи успешно общаться без принтера случайно остановки:

public static void sendAsBatch(int batchSize, byte[] payload, UsbPipe pipe) throws UsbException { 

    int offset = 0; 
    for (int multiplier = 1; offset < payload.length; multiplier++) { 

     byte[] batch = offset + batchSize < payload.length ? 
      Arrays.copyOfRange(payload, offset, offset + batchSize) : 
      Arrays.copyOfRange(payload, offset, payload.length); 

     pipe.syncSubmit(batch); 
     offset = multiplier * batchSize; 
    } 
} 

Я до сих пор дон Не знаю, какова реальная проблема, и если кто-то может пролить какой-нибудь свет, было бы удивительно.

Но для кого-то, кто сталкивался с тем же вопросом, похоже, он его решил :)

-1

Попробуйте отправить больше байт (один, два тысячи ?!) на принтер после того, как вы отправили те, которые вы хотите. Попробуйте с 0x00 или 0xFF.

+0

Что это поможет? И есть ли какие-нибудь источники, которые это помогут? –

+0

Это способ убедиться, что все, что находится во внутреннем буфере принтера, выходит на другом конце. Я видел, что он упоминается на принтере с меткой Brother или Zebra, чтобы убедиться, что внутренний буфер пуст. Я столкнулся с подобной ситуацией ... приложение работало при печати нескольких меток, но это не сработало при печати только одного - передача большего количества байт помогла. –

+0

@LOUTUSMS - Я только что попробовал отправить на принтер лишнюю тысячу 0x00 байт, но, тем не менее, он все еще не печатает правильно. По-прежнему возникает проблема, когда принтер прекращает печать примерно наполовину до окончания Любая помощь приветствуется! Заранее спасибо! – spxcxlxxs

Смежные вопросы