Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
В ходе моей недавней разработки я столкнулся с необходимостью отправлять инструкции по управлению устройством на последовательный порт, поэтому я провел небольшое углубленное исследование программирования последовательного порта. Здесь я суммирую некоторые свои мысли и опыт для вашего ознакомления и обмена. # введение в последовательный порт # Полное имя последовательного порта — последовательный. интерфейс,Обычно относится к COM-интерфейсу.,Это интерфейс расширения, использующий последовательную связь.。Его характеристикиданныеБиты передаются в битовом порядке,Может комплектоваться хотя бы одной линией передачи.,Низкая стоимость, но медленная скорость доставки. Поскольку последовательный порт (COM) не поддерживает горячее подключение и скорость передачи низкая.,В настоящее время в некоторых новых материнских платах и большинстве портативных компьютеров этот интерфейс отменен.。В настоящее время последовательные порты в основном используются в промышленном контрольно-измерительном оборудовании и в некотором коммуникационном оборудовании.。 По данным Ассоциации электронной промышленности (EIA): Electronic Industry Согласно стандартам, установленным Ассоциацией, последовательные порты можно разделить на RS-232, RS-422 и RS-485. Среди них интерфейс типа RS-232 является наиболее типичным и распространенным. типа 9-контактный последовательный порт (у типа RS-232 было 25 разъемов, но они уже почти не используются). Как показано на картинке 1 представляет собой физическую схему 9-контактного последовательного порта типа RS-232. Функция каждого контакта 9-контактного последовательного порта типа RS-232 поясняется, как показано на рисунке. 2 показано.
Рисунок 1. Физическая схема 9-контактного последовательного порта RS232.
Рисунок 2. Схема контактов 9-контактного последовательного порта RS232.
Читатели, которые хотят узнать больше о знаниях последовательного порта, могут обратиться к следующему контенту.:последовательный интерфейс、RS-232、RS-422、rs485
В настоящее время существует три распространенных источника пакетов последовательного порта для Java: во-первых, API связи последовательного порта, выпущенный SUN в 1998 году: comm2.0.jar (в среде Windows) и comm3.0.jar (в среде Linux/Solaris). ; во-вторых, это API последовательной связи IBM, в-третьих, некоторые API с открытым исходным кодом. В этой статье описывается использование языка Java для программирования последовательного порта в среде Windows, поэтому выбран официальный API SUN (comm2.0.jar). Адреса загрузки comm2.0.jar и comm3.0.jar следующие: comm2.0.jar:скачать comm.jar:скачать
на момент написания,Среда разработки программного обеспечения, которую я использую: Windows7.,Jdk1.6.0_10,Eclipse3.4.1。JavaНастройка среды для программирования последовательного Порт делится на следующие этапы: 1. Загрузите и установите jdk. Корневой каталог моего jdk — «D:\ProgramFiles\Java\jdk1.6.0_10». В следующей статье будет использоваться путь «D:\ProgramFiles\Java\jdk1.6.0_10». «%JAVA_HOME%» вместо этого; 2. Загрузите comm2.0.jar (ссылку для скачивания см. выше) и скопируйте три файла, необходимые для программирования последовательного порта, в папку, соответствующую jdk: 2.1. Скопируйте файл win32com.dll в каталоги «%JAVA_HOME%\bin» и «%JAVA_HOME%\jre\bin». 2.2 Скопируйте файл comm.jar в каталоги «%JAVA_HOME%\lib» и «%JAVA_HOME%\jre\lib\ext». 2.3 Скопируйте файл javax.comm.properties в «%JAVA_HOME%\lib» и «%JAVA_HOME%\jre\lib». 3 Создайте новый проект и добавьте comm.jar в файл проекта: 3.1 Создайте новый Java-проект SerialPortProgramming и укажите среду выполнения (JRE) проекта в качестве вновь установленного jdk на шаге 1. 3.2 Создайте в проекте новую папку «lib», скопируйте в нее файл comm.jar, щелкните файл правой кнопкой мыши и выберите [Build Path】—【Add to Build Path】。 ##"аппаратное обеспечение" Экологическая подготовка ## Для программирования последовательного порта на Java, прежде всего, устройство должно иметь последовательный порт (разве это не нонсенс?), но большинство материнских плат сегодня не имеют последовательного порта, поэтому я использую Virtual Serial Port Программное обеспечение драйвера виртуализирует пару последовательных портов COM11 и COM21, чтобы облегчить написание статей и экспериментирование. скачать Virtual Serial Port Driver7.1 При установке используйте файл «vspdctl.dll» в сжатом пакете, чтобы заменить файл «vspdctl.dll» в корневом каталоге установки программного обеспечения, чтобы завершить руководство по успешной активации. Установить Виртуальный Serial Port Затем драйвер использует программное обеспечение для создания пары портов (COM11 и COM21). Созданная здесь пара последовательных портов будет снова использоваться в последующих экспериментах. Поскольку последовательные порты COM11 и COM21 представляют собой пару последовательных портов, соединенных друг с другом посредством программной виртуализации, данные, отправленные с COM11, будут получены COM21, и наоборот. Конечно, если на вашем устройстве есть последовательный порт, вам не нужно создавать виртуальный последовательный порт. Вам нужно только отправить данные последовательного порта на контакт (контакт 3, как показано на рисунке). 2) и контакт приема данных (контакт 2) другого последовательного порта соединены медным проводом для реализации отправки и получения данных. Если на устройстве имеется только один последовательный порт, для отправки и получения данных последовательного порта вы можете соединить контакты 2 и 3 последовательного порта медным проводом, чтобы данные, отправленные из этого последовательного порта, были получены через этот порт. последовательный порт.
Создайте новый пакет «com.serialPort.writer» в проекте, созданном выше, и создайте новый класс OpenerAndCloser, который реализует получение, открытие и закрытие последовательного порта.
OpenerAndCloser.java
package com.serialPort.writer;
import java.util.Enumeration;
import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.UnsupportedCommOperationException;
/**
* Этот класс реализует 3 функции
* 1. Перечислите все локальные последовательные порты;
* 2. Откройте все последовательные порты (но не записывайте данные в последовательные порты);
* 3. Закройте открытый последовательный порт.
*/
public class OpenerAndCloser {
public static void main(String[] args){
//1. Получите все локальные порты и выведите их имена:
//1.1. Переменные, используемые для идентификации портов.
CommPortIdentifier portIdentifier = null;
//1.2. Записываем переменные всех портов
Enumeration<?> allPorts
= CommPortIdentifier.getPortIdentifiers();
//1.3. Вывод каждого порта
while(allPorts.hasMoreElements()){
portIdentifier
= (CommPortIdentifier) allPorts.nextElement();
System.out.println("Последовательный порт:" + portIdentifier.getName());
}
//2. Открыть порты COM11 и COM21.
//2.1. Получаем два порта
CommPortIdentifier com11 = null;
CommPortIdentifier com21 = null;
try {
com11 = CommPortIdentifier.getPortIdentifier("COM11");
com21 = CommPortIdentifier.getPortIdentifier("COM21");
} catch (NoSuchPortException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//2.2.Открываем два порта, но ничего не делаем
SerialPort serialCom11 = null;
SerialPort serialCom21 = null;
try {
//Первый параметр метода open указывает имя владельца последовательного порта после его открытия.
//Второй параметр указывает максимальное время ожидания этой программы, если последовательный порт занят, в миллисекундах.
serialCom11
= (SerialPort)com11.open("OpenerAndCloser", 1000);
serialCom21
= (SerialPort)com21.open("OpenerAndCloser", 1000);
} catch (PortInUseException e) {
//Это исключение выдается, когда открываемый порт занят
e.printStackTrace();
}
//2.3. Устанавливаем параметры двух портов
try {
serialCom11.setSerialPortParams(
9600, //скорость передачи данных
SerialPort.DATABITS_8,//данные Количество цифр
SerialPort.STOPBITS_1,//Стоповые биты
SerialPort.PARITY_NONE//Бит четности
);
serialCom21.setSerialPortParams(
9600, //скорость передачи данных
SerialPort.DATABITS_8,//данные Количество цифр
SerialPort.STOPBITS_1,//Стоповые биты
SerialPort.PARITY_NONE//Бит четности
);
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
}
//3. Закрываем порты COM11 и COM21.
//Метод закрытия порта находится в классе SerialPort
serialCom11.close();
serialCom21.close();
}
}
В приведенном выше коде есть еще два важных класса, которые описаны здесь. Это класс CommPortIdentifier и класс SerialPort. Оба класса взяты из comm.jar. Класс CommPortIdentifier представляет локальный последовательный порт. Вы можете получить локальный последовательный порт с помощью статического метода getPortIdentifier или getPortIdentifiers этого класса. Метод экземпляра open этого класса используется для открытия последовательного порта. Класс SerialPort также представляет локальный последовательный порт, но он представляет собой открытый последовательный порт. Вы можете закрыть открытый последовательный порт с помощью метода экземпляра close этого класса или получить входной и выходной поток последовательного порта через экземпляр. метод этого класса для реализации передачи данных в последовательный порт операций чтения и записи. Выполните основной метод класса Com11Writer, и вы обнаружите, что консоль выводит все последовательные порты локальной машины (включая виртуальные последовательные порты и физические последовательные порты).
Создайте новый класс Com11Writer в пакете «com.serialPort.writer». Этот класс реализует функцию записи данных «Hello World!» в COM11. Данные, записанные в последовательный порт COM11, будут отправлены на другой последовательный порт COM21, подключенный к нему. это и будет Метод получения данных из последовательного порта, полученных COM21, будет рассмотрен ниже. Ниже приведен исходный код Com11Writer:
Com11Writer.java
package com.serialPort.writer;
import java.io.IOException;
import java.io.OutputStream;
import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
/**
* Функция класса Com11Writer — отправить строку «Hello» в последовательный порт COM11. World!”
*/
public class Com11Writer {
public static void main(String[] args) {
//1. Определим переменные.
CommPortIdentifier com11 = null;//Используется для записи локального последовательного порта
SerialPort serialCom11 = null;//Используется для идентификации открытого последовательного порта
try {
//2. Получить порт COM11.
com11 = CommPortIdentifier.getPortIdentifier("COM11");
//3.Открываем COM11
serialCom11 = (SerialPort) com11.open("Com11Writer", 1000);
//4. Запись данных в последовательный порт (используйте объект выходного потока, соответствующий последовательному порту)
//4.1. Получаем объект выходного потока последовательного порта
OutputStream outputStream = serialCom11.getOutputStream();
//4.2. Запись данных «Привет» через поток вывода последовательного порта в последовательный порт World!”:
//При использовании выходного потока для записи данных в последовательный порт данные должны быть преобразованы в формат массива байтов или формат int.
//Когда другой последовательный порт получит данные, они будут декодированы в соответствии с правилами, согласованными обеими сторонами.
outputStream.write(new byte[]{'H','e','l','l','o',
' ','W','o','r','l','d','!'});
outputStream.flush();
//4.3. Закрываем выходной поток
outputStream.close();
//5. Закрываем последовательный порт.
serialCom11.close();
} catch (NoSuchPortException e) {
//Выдаем это исключение, если последовательный порт не найден
e.printStackTrace();
} catch (PortInUseException e) {
//Если открытие не удалось из-за того, что порт занят, выдать это исключение
e.printStackTrace();
} catch (IOException e) {
//Если получить выходной поток не удалось, выдайте это исключение
e.printStackTrace();
}
}
}
Данные, отправленные из последовательного порта COM11, в конечном итоге достигнут подключенного к нему последовательного порта COM21. Если COM21 доступен, поступающие данные будут кэшироваться и ожидать чтения программой. Существует множество режимов чтения данных из последовательного порта. В этой статье будут представлены «режим опроса» и режим прослушивания событий. «Режим опроса» означает, что программа (поток) сканирует последовательный порт каждый фиксированный раз. Если сканирование обнаруживает, что в последовательном порту есть доступные данные, они будут прочитаны. Класс Com21PollingListener использует «режим прослушивания событий» для чтения данных, полученных последовательным портом COM21:
Com21PollingListener.java
package com.serialPort.listener;
import java.io.IOException;
import java.io.InputStream;
import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
/**
* Класс прослушивателя Com21Polling использует метод опроса для мониторинга последовательного порта COM21.
* И получить данные, полученные портом, через объект входного потока COM21 (в этой статье данные поступают из последовательного порта COM11).
*/
public class Com21PollingListener {
public static void main(String[] args){
//1. Определим переменные.
CommPortIdentifier com21 = null;//Непроверенный порт
SerialPort serialCom21 = ноль;//открыть порт
InputStream inputStream = null;//Входной поток порта
try{
//2. Получите и откройте последовательный порт COM21.
com21 = CommPortIdentifier.getPortIdentifier("COM21");
serialCom21 = (SerialPort) com21.open("Com21Listener", 1000);
//3. Получаем объект входного потока последовательного порта.
inputStream = serialCom21.getInputStream();
//4. Чтение данных из последовательного порта.
//Определяем массив, используемый для кэширования считанных данных
byte[] cache = new byte[1024];
//Запишите количество байтов (Byte) данных, поступивших на последовательный порт COM21 и не прочитанных.
int availableBytes = 0;
//Бесконечный цикл, сканируйте последовательный порт COM21 каждые 20 миллисекунд, чтобы проверить, поступили ли какие-либо данные
while(true){
//Получаем количество доступных байт, полученных последовательным портом COM21
availableBytes = inputStream.available();
//Если количество доступных байтов больше нуля, начинаем цикл и получаем данные
while(availableBytes > 0){
//Читаем данные из объекта входного потока последовательного порта и сохраняем данные в массив кэша
inputStream.read(cache);
//Перекодируем полученные данные и выводим их
for(int j = 0;j < cache.length && j < availableBytes; j++){
//Поскольку порт COM11 отправляет строку, представленную массивом байтов,
//Итак, каждый полученный байт данных принудительно преобразуется в символьный объект.
//Это простое преобразование кодировки. При необходимости читатели могут выполнять более сложные преобразования кодировки.
System.out.print((char)cache[j]);
}
System.out.println();
//Обновляем условия цикла
availableBytes = inputStream.available();
}
//Пусть поток приостанавливает 20 миллисекунд
Thread.sleep(20);
}
}catch(InterruptedException e){
e.printStackTrace();
}catch (NoSuchPortException e) {
//Выдаем это исключение, если последовательный порт не найден
e.printStackTrace();
} catch (PortInUseException e) {
//Если открытие не удалось из-за того, что порт занят, выдать это исключение
e.printStackTrace();
} catch (IOException e) {
//Если получить выходной поток не удалось, выдайте это исключение
e.printStackTrace();
}
}
}
«Режим прослушивания событий» предназначен для регистрации класса прослушивания событий для последовательного порта. Когда данные поступают на последовательный порт, будет вызвано событие, и данные, полученные последовательным портом, будут считаны в методе ответа на событие. Класс Com21EventListener использует «режим прослушивания событий» для чтения данных, полученных последовательным портом COM21: Com21EventListener.java
package com.serialPort.listener;
import java.io.IOException;
import java.io.InputStream;
import java.util.TooManyListenersException;
import javax.comm.CommPortIdentifier;
import javax.comm.NoSuchPortException;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
/**
* Класс Com21EventListener использует «режим прослушивания событий» для мониторинга последовательного порта COM21.
* И получить данные, полученные портом, через объект входного потока COM21 (в этой статье данные поступают из последовательного порта COM11).
* Чтобы использовать «режим прослушивания событий» для мониторинга последовательного порта, необходимо определить класс прослушивания событий, реализующий SerialPortEventListener.
* Интерфейс и переопределение метода SerialEvent, а также запись логики прослушивания в методе SerialEvent.
*/
public class Com21EventListener implements SerialPortEventListener {
//1. Определим переменные.
CommPortIdentifier com21 = null;//Непроверенный порт
SerialPort serialCom21 = ноль;//открыть порт
InputStream inputStream = ноль;//входной поток
//2. Конструктор:
//Реализовать действия по инициализации: получить последовательный порт COM21, открыть последовательный порт, получить объект входного потока последовательного порта и добавить объекты прослушивания событий в последовательный порт
public Com21EventListener(){
try {
//Получаем последовательный порт, открываем окно последовательного порта и получаем входной поток последовательного порта.
com21 = CommPortIdentifier.getPortIdentifier("COM21");
serialCom21 = (SerialPort) com21.open("Com21EventListener", 1000);
inputStream = serialCom21.getInputStream();
//Добавляем объект прослушивания событий в последовательный порт.
serialCom21.addEventListener(this);
//Установите событие, которое будет срабатывать, когда на порту появятся доступные данные. Этот параметр важен.
serialCom21.notifyOnDataAvailable(true);
} catch (NoSuchPortException e) {
e.printStackTrace();
} catch (PortInUseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (TooManyListenersException e) {
e.printStackTrace();
}
}
//Переопределить унаследованные методы прослушивателя
@Override
public void serialEvent(SerialPortEvent event) {
//Определяем массив, используемый для кэширования считанных данных
byte[] cache = new byte[1024];
//Запишите количество байтов (Byte) данных, поступивших на последовательный порт COM21 и не прочитанных.
int availableBytes = 0;
//Если данные доступны для отправки, чтения и записи данных
if(event.getEventType() == SerialPortEvent.DATA_AVAILABLE){
try {
availableBytes = inputStream.available();
while(availableBytes > 0){
inputStream.read(cache);
for(int i = 0; i < cache.length && i < availableBytes; i++){
//Декодируем и выводим данные
System.out.print((char)cache[i]);
}
availableBytes = inputStream.available();
}
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//Создаем экземпляр класса в основном методе
public static void main(String[] args) {
new Com21EventListener();
}
}
Обязательным условием для получения данных через последовательный порт является то, что последовательный порт открыт (доступен). Если последовательный порт закрыт, данные, отправленные на последовательный порт, будут потеряны. Поэтому во время эксперимента, если вы используете медные провода для соединения контактов 2 и 3 одного и того же последовательного порта, вы должны быть осторожны, чтобы не закрыть последовательный порт после отправки данных в последовательный порт, а затем снова открыть последовательный порт для чтения. .данные, обязательно оставляйте последовательный порт открытым до завершения работы программы. Основываясь на приведенном выше описании, в примерах, приведенных в этой статье, сначала запустите основной метод класса Com21PollingListener (или класса Com21EventListener), чтобы открыть программу прослушивания порта, а затем запустите основной метод класса Com11Writer для отправки данных в COM21. через COM11, чтобы программа могла читать данные из COM21.
В процессе написания этой статьи я обращался ко многим интернет-ресурсам, в том числе в следующих статьях хотелось бы выразить сердечную благодарность всем авторам за их самоотверженный труд. http://blog.csdn.net/luoduyu/article/details/2182321 http://www.cnblogs.com/dyufei/archive/2010/09/19/2573913.html http://www.cnblogs.com/dyufei/archive/2010/09/19/2573912.html http://www.cnblogs.com/dyufei/archive/2010/09/19/2573911.html
Исходные файлы проектов примеров в этой статье можно получить по следующей ссылке.
x5xw
Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Этот сайт предоставляет только услуги по хранению информации, не имеет никаких прав собственности и не принимает на себя соответствующие юридические обязательства. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/234266.html Исходная ссылка: https://javaforall.cn