Общая проблема
У Javacomm и RXTX есть разные вещи при установке. Настоятельно рекомендуется установить небольшую установку в соответствии с инструкциями по установке. Если инструкции по установке требуют файла JAR или общей библиотеки, должны находиться под определенной папкой, что означает, что его необходимо воспринимать всерьез. Если конкретный файл или устройство должно иметь конкретное право собственности или доступа правильно, это также означает, что с ним нужно серьезно относиться к ним. Многие проблемы с установкой вызваны не в соответствии с требованиями инструкций по установке.
Следует отметить, что в некоторых версиях Javacomm будет две инструкции по установке. Один используется для Java 1.2, а затем - один для версии Java 1.1. Использование неправильных инструкций по установке вызовет результат установки, который не может быть обработан. С другой стороны, некоторые версии/компоненты/пакеты TXTX будут содержать неполные описания. В этом случае необходимо получить исходный код, опубликованный RXTX, который содержит полные инструкции по установке.
Кроме того, следует отметить, что программа установки Windows JDK будет содержать три виртуальные машины Java, поэтому будет три расширенные папки.
Более того, даже четвертый JRE, который существует в структуре каталогов/Windows. Javacomm должен быть установлен в JDK и во всем публичном JRE в качестве расширений.
WebStart
Javacomm
Распространенная проблема в Javacomm и RXTX заключается в том, что они не поддерживают установку через Java WebStart: Infamous Javacomm - это потому, что вам нужно вызвать файл под названием Javax.com.properties в JDK LIB Directory, и это не может быть завершено через Java WebStart. Очень расстраивает, что необходимость в этом файле представляет собой ненужные дизайны в Javacomm, и дизайнеры Javacomm могут легко избежать этого. Солнце упорно отверг эту ошибку, и они подчеркнули, что этот механизм необходим. Они говорили о глупости, особенно когда упомянули Javacomm, потому что у Java была архитектура поставщика услуг, которая долгое время специализируется на таких намерениях.
В содержании этого атрибута есть только одна строка, которая содержит локальное имя класса Java, управляемое.
Driver = com.sun.win.win32driver
Ниже приведен методика, которая может развернуть Javacomm с помощью веб -начала игнорировать файл атрибутов, который наносит ущерб мозгу. Но у него есть серьезные дефекты и могут потерпеть неудачу при развертывании более новой Javacomm -если Sun сделает новую версию.
Сначала выключите менеджера по безопасности. Некоторые глупые программисты Солнца чувствовали, что существование ужасных файлов javax.comm.properties снова и снова было круто, особенно когда оно было впервые загружено. Это просто проверяет, существует ли файл без других причин.
System.seTecurityManager (null);
Затем, когда изначально начался Javacomm API, вручную инициализировал водителя.
String drivename = "com.sun.comm.win32driver";
Rxtx
RXTX должен изменить право собственности и доступа к последовательному устройству на некоторых платформах. Это также вещь, которая не может быть сделана через WebStart.
Когда программа запускается, вы должны попросить пользователей выполнить необходимые настройки в качестве супер пользователей. В частности, RXTX имеет алгоритм соответствующего режима для проверки «законного» названия серийного оборудования. Когда кто-то хочет использовать нестандартные устройства, такие как конвертер USB-серии, это часто портит вещи. Этот механизм может быть заблокирован атрибутами системы. Для получения подробной информации обратитесь к инструкциям по установке RXTX.
Javacomm Api
введение
Официальная серийная коммуникация Java - Javacomm Api. Этот API не является частью стандартной версии Java 2, поэтому реализация этого API должна быть загружена отдельно. К сожалению, Javacomm не привлекло достаточно внимания к солнцу, и фактическое время обслуживания было не очень долго. Солнце время от времени отремонтировало некоторые неважные ошибки, но не делал какого -то важного технического обслуживания, которое давно истек.
В этом разделе объясняется основная работа Javacomm API. Предоставленный исходный код упрощен для отображения фокуса, и его необходимо улучшить в практических приложениях.
Исходный код этой главы не является единственным доступным примером кода. Многие примеры содержат загрузки Javacomm. Эти примеры включают в себя больше информации о том, как его использовать, чем его документы API. К сожалению, у Sun нет реального учебника или некоторых объяснений. Поэтому, чтобы понять механизм этого API, изучение этих примеров того стоит, и вам все еще нужно изучить этот документ API. Но лучший способ - выучить эти примеры и использовать их. Из -за отсутствия легких приложений и понимания модели программирования этих API, как правило, атакуют. По сравнению с его репутацией и функцией, этот API лучше, но это просто.
API использует механизм обратного вызова, чтобы уведомить новые данные программиста. Это также хорошая идея, чтобы выучить этот механизм, а не полагаться на порт запросов. В отличие от других интерфейсов обратного вызова в Java (например: в графическом интерфейсе), этот интерфейс позволяет прослушать только один монитор. Если несколько слушателей запрашивают несколько инцидентов, основное устройство мониторинга должно быть реализовано путем распространения информации другим вторичным слушателям.
Загрузите и установку
скачать
Sun's Javacomm Web -страница указывает на адрес загрузки. В соответствии с этим адресом Sun в настоящее время (2007) предоставляет версию Javacom 3.0, которая поддерживает Solaris/Sparc, Solaris/x86 уже имеет Linux x86. Загрузки требуют учетной записи компании Sun. Страница загрузки предоставляет ссылку на страницу регистрации. Цель регистрации не ясна. При регистрации пользователи могут скачать JDK и JRES, но для этих почти тривиальных Javacomm, Sun Company цитирует юридические положения и государственные ограничения на распределение и экспорт программного обеспечения.
Чиновник больше не предоставляет Windows версию Javacomm, а Sun нарушил свою собственную стратегию смерти продукта -Cannot будет загружена в продуктах Java. Но вы все равно можете загрузить версию 2.0 Windows (Javacom 2.0).
Установить
Установка с инструкциями по установке с загрузкой. Некоторые версии Javacomm 2.0 будут включать две инструкции по установке. Наиболее очевидное различие между этими двумя описаниями заключается в том, что неправильный используется в древней среде Java1.1, и то, что подходит для Java 1.2 (JDK1.2.html), является правильным.
Пользователи Windows могут не понимать, что они установили копию одной и той же виртуальной машины в разных местах (обычно от 3 до 4). Некоторые заявки на IDE и Java также могут принести свои собственные частные JRE/JDK. Следовательно, Javacomm должен быть установлен многократно для этих виртуальных машин (JDK и JRE), чтобы для разработки и выполнения последовательных приложений.
У IDE есть представительный способ изучения новой библиотеки (класс и документ). Обычно библиотека, которую Javacommm не только должна быть идентифицирована IDE, но и каждый проект, использующий библиотеку, также должна быть идентифицирована. Читая документ IDE, вы должны обратить внимание на старую версию старой Javacomm 2.0, а документация Javadoc API Используйте макет Java 1.0 Java Doc. Некоторые современные IDE больше не знают эти структуры и не могут интегрировать документы Javacomm2.0 в свои системы помощи. В этом случае для чтения документов необходим внешний браузер (рекомендуемые мероприятия)
После установки программного обеспечения рекомендуется протестировать образцы и каталог Javadoc. Имеет смысл создавать и запустить образцы приложений, чтобы подтвердить, является ли установка правильной. Образец программы обычно требует небольших корректировок для работы на специальной платформе (например, идентификатор COM -порта, который переписал жесткие коды). При запуске программы образца лучше всего иметь серийное оборудование.
Serial_Programming: RS-232 Соединения и Serial_Programming: Модемы и в командах предоставляют некоторую информацию о том, как создать среду разработки последовательных приложений.
Найдите ожидаемый серийный порт
Первые три вещи, которые нужно сделать при использовании серийного программирования Javacomm
Логотип порта перечисления и ожиданий выбора завершается в том же цикле:
Импорт javax.comm.*; Как "com1" ... "comx" тоже, а не // их имена устройств Unix "/dev/tty ...". Вместо этого пользователь настраивается .//String WantportName = "/dev/ttya"; Идентификатор, если // (a) он указывает на последовательный (не параллельный) порт и // (b) соответствует имени дизайна .//commportidentifier portid = null; CommptionIdifier pid = (comptionIdifier) portablentifiers.nextelement (); ) {System.err.println ("Не удалось найти последовательный порт" + tantportname); Доступный список последовательных логотипов по умолчанию в драйвере, связанной с конкретной платформой, которая связана. Этот список не может быть настроен через Javacomm. Методы comptidifier.addportname () вводят в заблуждение, потому что класс водителя связан с платформой, а их реализация не является частью публичного API. Полагаясь на драйвер, этот список портов может быть настроен/расширен в драйвере. Поэтому, если Javacomm не найдет определенный порт, иногда некоторые изменения в драйвере помогают. После того, как определенный идентификатор порта будет найден, вы можете использовать его для получения ожидаемого порта: ///////////////////////////// 0 Использовать идентификатор порта идентификатор порта для учетной записи // serialport port = null; E);
Инициализация серийный порт
Инициализация последовательного порта очень интуитивно понятна. Вы можете установить параметры связи (скорость поттера, бит данных, стоп -бит и проверка марионеток) один за другим.
В рамках инициализации входной и выходной поток связи может быть настроен в следующем примере.
Импорт java.io.*; ; NULL; Поток Tenput: только написать "); новые системы Linux полагаются Unicode, поэтому это может быть необходимо для // указать схему кодирования, которая будет использоваться.) Или ISO Latin 1 (8-бит // коммуникация), так как, вероятно, нет никакого модели там принимают // Unicode для его коммита. Случай здесь // exectionReadWriteCode (); Порт.
Простая передача данных просто напишите данные
Написание данных в последовательный порт так же проста, как и базовая Java IO. Но есть еще некоторые меры предосторожности, когда вы используете протокол AT Hayes:
Буфер обмена
Делать:
Объясните, как смешать ввод и вывод бинарного и символов в том же потоке
Измените образец программы для использования потока
// Написать в Opture OS.Print ("AT"); OS.PRINT ("/r/n"); Команда, которую вы отправили в это.Простое чтение данных (вращение)
Если вы правильно используете операцию написания (как описано выше), вам нужна только простая команда.
// Читать ответ ответ = is.readline ();
Простые вопросы чтения и письма
Простое последовательное чтение и письмо, продемонстрированные в предыдущем разделе, имеют очень серьезные дефекты. Все операции выполняются путем блокировки ввода -вывода. Это означает, что когда нет читаемых данных, или выходной буфер заполнен (устройство не может принять больше данных):
Метод чтения и написания (в предыдущем примере os.print () или is.readline ()) не вернется, что приведет к приостановке приложения. Точнее, темы чтения и письма заблокированы. Если этот поток является основным потоком приложения, приложение остановится до тех пор, пока условия блокировки не будут выпущены (то есть для считываемых данных для достижения или устройства будет повторно зарегистрировано).
Если приложение не является наиболее примитивным, программа заблокирована. Например, по крайней мере, это должно позволить пользователям отменить операции связи. Это требует использования не -блокирующего ввода -вывода или асинхронного ввода -вывода. Тем не менее, Javacomm основан на стандартной системе ввода/вывода (InputStream, OutputStream), но он может использовать метод деформации, отображаемый позже.
Такой называемая «методика деформации» является ограниченной поддержкой, предоставляемой Javacomm для асинхронного ввода -вывода с помощью механизма уведомления об инциденте. Тем не менее, общими решениями для реализации не -блокирующего ввода -вывода в Java для блокировки ввода -вывода являются потоками. Это решение для операции по написанию последовательного порта является практичным и возможным.
Операции чтения также должны обрабатываться в отдельном потоке, но нет необходимости использовать механизм уведомления о инциденте Javacomm. Суммировать:
Прочтите работу и используйте уведомление о событии и/или отдельный поток;
Используйте отдельные потоки для написания операций, и можно выбрать механизм уведомления о событии.
Следующая часть представит некоторые другие детали.
Событие Drive Serial Communication Введение
Javacomm API предоставляет механизм уведомления о событии для преодоления проблем, вызванных блокированием ввода -вывода. Но этот механизм также проблематичен в этом типичном солнечном методе.
В принципе, приложение может зарегистрировать монитор событий в конкретный последовательный порт для получения уведомлений для получения важных событий в этом порту. Два наиболее интересных события данных чтения и письма - это
javax.comm.serialportevent.data_available и javax.comm.serialportevent.output_buffer_empty.
Но это также приносит два вопроса:
Перед проведением подробных обсуждений в следующем разделе будет продемонстрировать основной метод реализации и регистрации процессора последовательного события. Помните, что в серийном порте есть только один процессор событий, и он должен иметь дело со всеми возможными событиями.
Установить процессор серийного события
Импорт Javax.comm. Информация * о связи, например, когда необходимо следовать конкретному сообщению *. Метод. Event.getEventType ()) {case serialportevent.output_empty: outputbuferempty (Event); ; Break; / ** * Обработка вывода буфера пустые события. / Реализовать данные здесь}/ ** * Обработка данных доступных. Как только слушатель реализован, его можно использовать для мониторинга конкретных последовательных инцидентов. Для этого вам нужно добавить экземпляр прослушивания последовательного порта. Кроме того, для получения каждого типа события требуется отдельные приложения.
Serialport Port = ...; //// Настройка параметров порта здесь. ИЗОБРАЖЕНИЯ Интерфейс ServiceStister // Один вызовет ///port.addeventristener (это); e); ;
Написание данных
Написание данных с отдельным разделением - это только одна цель: избегать всего блока приложения, потому что последовательный порт не готов писать данные.
Простая реализация кольцевого буфера потока
Используйте поток, независимую от основной программы для записи операций, указывая на то, что данные, которые необходимо записать каким -то образом, отправляются в поток записи из основного потока приложения (основной поток). Это может использовать общий асинхронный буфер событий, такой как байт -массив. Кроме того, основная программа также требует некоторого способа определения того, можно ли записано данные или буфер данных в буфере данных. Если буфер данных заполнен, он указывает на то, что последовательный порт не готов к написанию операций, а данные для вывода выводят очередь. Основная программа должна узнать новое свободное пространство, доступное в общем буфере данных. Тем не менее, в разрыве между основной программой вы можете сделать что -то еще, например, обновление пользовательского интерфейса (GUI), предоставление командной строки, которая может выйти из данных, и так далее.
На первый взгляд, PipedInputStream/PipedOutputStream - хорошая идея для этого общения. Но если поток трубопровода действительно полезен, то солнце не солнце. Если соответствующий PipedoutStream не очищается во времени, PipedInputStream будет блокировать, что заблокирует резьбу применения. Даже если вы используете независимые потоки, вы не можете избежать этого. Java.nio.pipe также имеет такую же проблему, что и эта. Его препятствие связано с платформой. Не очень хорошо изменить традиционный ввод -вывод, используя Javacomm на Nio.
В этой статье используется очень простая область синхронного кольцевого буфера для передачи данных потока. Приложения в реальном мире, вероятно, будут использовать более сложный буфер. Например, реализация реального мира требует операционного буфера с точки зрения входного и выходного потока.
Такой кольцевой буфер не особенный, и нет особого атрибута в обработке потоков. Это просто простая структура данных, используемая здесь для обеспечения буфера данных. Буфер был реализован здесь, чтобы обеспечить доступ к структуре данных безопасности.
/*** Синхронизированный буфер RAIN ** Размер буфера ** / защищенный размер Int; размер 1K. clear ();} / ** * Очистить содержимое буфера. Будьте переписаны во время нормальной работы. , Он не является в следующий раз, когда данные считываются из * буфера или написать буфер. Data () {return Start <= end? . Данные как власть. Параметры, хранящие данные, которые будут записаны * @param off Официально данных в массиве * @param n Количество данных для записи, начиная с. int n) {if (n <= 0) return 0; -end); End> = старт: 0); / ** * Читать столько данных, как и из буфера. );} /** * Прочитайте столько данных, как и из буфера. / int read (byte data [], int Office Lid: 0 = <= off <data.length; бросить исключение, если не int i = math.min (остаться, (end <start? Buffer.length: end) -Start) ; ;} i = math.min (остаться, end> = start? 0: end); ;} Return n -Remain;}}}}}Используя этот кольцевой буфер, теперь вы можете отправить данные из одного потока в другой поток. Конечно, другие темы являются безопасными и не блокирующими методами. Ключевым моментом здесь является то, что когда буфер заполнен или буфер пуст, чтение и запись данных не вызовет блокировки.
Согласно схеме демонстрации процессора события демонстрации раздела в «Создании последовательного корпоративного процессора», вы можете использовать общий кольцевой буфер, введенный в «простой буфер с безопасным кольцами потока» для поддержки события output_buffer_empty. Не вся реализация Javacomm поддерживает это событие, поэтому этот код никогда не может быть вызван. Но если это возможно, это является частью обеспечения наилучшей пропускной способности данных, потому что он может долгое время сделать последовательный порт в состоянии бездействия в течение длительного времени.
Схема монитора событий должен обеспечить метод outputBuffrempty ().
Ringbuffer Databuffer = ...; / ** * outputBuff on (serialPortEvent Event) {}В следующем примере предполагается, что пункт назначения данных является файлом. Когда данные прибывают, он будет удален из последовательного порта и записан в файл назначения. Это всего лишь утонченное представление, потому что на самом деле вам нужно проверить логотип EOF данных, чтобы регулировать модем (обычно называемый «кошка») в качестве командного режима.
Импорт javax.comm. *; ** * Обработка серийного события. Serialportevent.data_available: // // Все доступные в настоящее время данные в файл // try {int c; Catch (ioException ex) {...} break; );}
Изменить управление демодуляторами
Javacomm в основном обеспокоен последовательной обработкой и передачей данных на последовательном порту. Он не понимает и не обеспечивает поддержку протоколов с высоким уровнем уровня, таких как инструкции по модуляции и демодуляции Хейса, обычно используются для управления кошками на уровне клиентов. Это не задача Javacomm, и это не ошибка.
Как и другие специальные серийные устройства, если вы хотите контролировать кошку с помощью Javacomm, вы должны написать необходимый код на Javacomm. Страница «Модемы Hayes-Commposition и в командах» предоставляет необходимую базовую информацию для обработки Hayes Cats.
Некоторые операционные системы, такие как Windows или команда управления Linux для настройки специального типа или марки команд управления CAT, обеспечивают более или менее стандарты. Например, «драйвер» Windows Cats, как правило, только что зарегистрированные входы, описывая отдельных кошек (настоящий драйвер - универсальный драйвер последовательной модуляции). Javacomm не может получить конкретные данные таких операционных систем. Следовательно, либо отдельный инструмент Java должен быть предоставлен, чтобы позволить пользователям настроить приложение для использования отдельных кошек, либо добавить какой -то соответствующий код платформы (локальный).
Rxtx
Обзор и версия
Поскольку Sun не предоставила Javacomm справочную реализацию для Linux, люди разработали RXTX для Java и Linux. Позже RXTX был пересажен на другие платформы. Известно, что последняя версия RXTX запускает более 100 платформ, включая Linux, Windows, Mac OS, Solaris и другие операционные системы.
RXTX может использоваться независимо от API Javacomm, или его также можно использовать в качестве таковой службы Java Commum API. Если последний использует упаковочный пакет под названием JCL. JCL и RXTX обычно упаковываются с Linux/Java, или JCL полностью интегрирована с кодом. Поэтому, прежде чем загружать их один за другим, посмотрите на компакт -диск дистрибьюторской версии CD Linux.
Из -за ограниченной поддержки Sun и неуместной документации Javacomm он отказался от API Javacomm и обратился непосредственно, чтобы использовать RXTX вместо упаковки JCL. Тем не менее, документы RXTX очень редки. В частности, разработчикам RXTX нравится делать свои версии и контент сумки в беспорядке (например, использование или неиспользованный интегрированный JCL). Начиная с версии 1.5, RXTX включает в себя альтернативный класс публичного класса Javacomm. По юридическим причинам они не были в пакете Java.pomm, а под gui.io. Тем не менее, две существующие версии упаковочного контента очень отличаются.
Поэтому, если вы хотите запрограммировать оригинальный API Javacomm
Sun Javacomm General Edition. При написании этой статьи на самом деле является пакет UNIX (включая поддержку различных типов систем UNIX, таких как Linux или Solaris), даже в Windows, этот пакет UNIX также должен использоваться для обеспечения универсальной реализации Java.comm. Будет использоваться только использование Java для реализации этой части, но локальная библиотека Unix будет проигнорирована.
RXTX 2.0, чтобы иметь разных поставщиков в универсальной версии Javacomm, в отличие от той, которая в пакете Javacomm. Однако, если вы просто хотите заменить пакет на GNU.io, вам нужно только преобразовать приложение Javacomm в приложение RXTX.
Если вы бросите одного из многих членов многих участников, которые делают Javacomm, который разочарован поведением поддержки Windows, вам следует перевести свой Javacomm в RXTX. Как вы можете видеть выше, есть два способа завершить это.
上面的第一项在前面已经解释,第二项也相当简单。对于需要将JavaComm应用移植到RxTx 2.1上来的人,只需要将应用源代码中所有对“java.comm”包的引用换成“gnu.io”包,如果原始的JavaComm应用编写恰当,这里就没有其他的事情需要去做。
在Unix平台上,RxTx 2.1甚至提供了工具“contrib/ChangePackage.sh”去在源代码树形结构中执行全局的替换,这样的替换在其他的平台很容易使用支持重构功能的IDE(集成开发环境)来完成。