Java / RXTX проблема Windows XP - PullRequest
       5

Java / RXTX проблема Windows XP

2 голосов
/ 22 сентября 2010

В настоящее время я тестирую POS-систему Java / MySQL, которую я написал для небольшого бара, и у меня проблемы с получением наличных денег.

Денежный ящик имеет штекер RJ11, подключенный через USB-> последовательный блок, и запись любых данных на устройство приводит к открытию розыгрыша.

У меня проблемы с RXTX, и я не был уверен, был ли это мой код, библиотека или драйверы для устройства?

В идеале, я бы хотел, чтобы соединение создавалось, когда пользователь входит в систему, и закрывалось, когда они выходили из системы, но на данный момент код просто открывает соединение, записывает данные и закрывается при продаже звонит (между нажатием кнопки «Сохранить» и открытием выдвижного ящика задерживается 1-2 секунды.

Когда приложение запускается впервые, ящик работает нормально в течение нескольких продаж (не определили шаблон), но затем перестает работать. Он показывает диапазон возникающих исключений, смешивая либо NoSuchPort, PortInUse, либо просто простое сообщение AccessDenied. Как правило, перезапуск приложения и отключение / повторное подключение USB приводит к тому, что оно снова начинает работать для еще нескольких продаж.

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

Java-код:

public static void openTill() {
    try {
    portId = (CommPortIdentifier) CommPortIdentifier.getPortIdentifier("COM3");
    serialPort = (SerialPort) portId.open("DRAWER_PORT", 2000);

    outputStream = serialPort.getOutputStream();

    serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8,
        SerialPort.STOPBITS_1,
        SerialPort.PARITY_NONE);

    serialPort.setRTS(false);
    serialPort.setInputBufferSize(8192);
    serialPort.setOutputBufferSize(8192);
    serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_XONXOFF_IN |     
        SerialPort.FLOWCONTROL_XONXOFF_OUT);

    outputStream.write("k".getBytes());
    outputStream.close();
    outputStream = null;

    serialPort.close();
    serialPort = null;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

Я пробовал несколько разных настроек, пытаясь имитировать как можно ближе настройки, которые использует HyperTerminal (проверив PortMon), но все еще не работает.

Любые предложения будут с благодарностью!

Спасибо, Райан.

Ответы [ 2 ]

1 голос
/ 05 октября 2012

Вы должны попробовать jSSC: http://code.google.com/p/java-simple-serial-connector/ (это бесплатно в отличие от SerialIO).

У меня было много проблем ( это был один из тех ) с последовательным конвертером rxtx и usb-serial, так что я просто перешел с rxtx на этот, он работает очень хорошо! Интегрированные библиотеки DLL в .jar для Windows, Linux, Mac и Solaris с автоматическим определением системы.

Последняя официальная версия не поддерживает тайм-ауты, но я связался с разработчиком, и он прислал мне версию jar с очень быстрыми тайм-аутами!

Миграция была действительно простой, теперь она работает намного лучше (:

1 голос
/ 23 сентября 2010

Не могу найти ничего плохого в коде, но я могу предложить некоторые отправные точки для отладки:

  • Попробуйте использовать тот же код с реализацией javax.comm от Sun (errr .. Oracle).Версия для Windows больше недоступна для загрузки с их сайта, но ее все еще можно найти в других местах.Даже если вы не хотите использовать эту реализацию в окончательной настройке, это может помочь вам найти проблему.Есть и другие альтернативы, такие как SerialIO .

  • . Используйте com0com для установки виртуального com-порта.Включите ведение журнала (см. Последний вопрос в файле README.txt ).Сравните журналы, когда вы используете свой код, с журналами, которые вы получаете при использовании HyperTerminal, и найдите любые различия.

  • Попробуйте другой последовательный -> USB-конвертер.По моему опыту, многие из них не реализуют RS232 должным образом или имеют много ошибок.

Редактировать:

Если вы обнаружите, чтона самом деле это ошибка rxtx, но по какой-то причине я не хочу переключаться на другую реализацию javax.comm (я видел, как это произошло :-) вот несколько дополнительных советов, которые могут быть полезны (сначала я попробую приведенные выше предложения)в любом случае):

  • Требуются ли звонки на номера setInputBufferSize, setOutputBufferSize?Попробуйте удалить их.Действительно ли устройство использует управление потоком XON / XOFF?Если нет, попробуйте установить управление потоком в none.Требуется ли на устройстве отключение RTS?Если нет, удалите и эту строку.Также попробуйте установить параметры последовательного порта перед открытием выходного потока.Конечно, ничего из этого не должно иметь никакого значения, но вы можете вызывать некоторую ошибку rxtx.

  • Связана ли проблема с последовательным открытием и закрытием порта несколько раз?Вы можете попытаться сохранить порт всегда открытым.При каждой продаже просто сделайте:

    outputStream.write("k".getBytes());
    outputStream.flush();
    

    и посмотрите, воспроизводится ли проблема по-прежнему.

...