§ 40. Программирование на Java для Ke-USB24A / Ke-USB24R
|
Никитенко Алексей Константинович (г. Днепропетровск), 09 Апреля 2014
|
|
Файлы к статье скачать
|
Имя: KA040.zip (ZIP архив) |
Размер: 98 КБ |
|
Уважаемые читатели, предлагаю вашему вниманию статью о том, как писать программы управления для модулей Ke-USB24A / Ke-USB24R на языке Java.
|
Пример ниже будет приведен для модуля Ke-USB24A, однако в виду одинаковых принципов командного интерфейса и зачастую однотипных команд управления, используемых в модуле Ke-USB24R данная статья с равным успехом может быть использована и для модуля Ke-USB24R.
|
Напишем класс «KeUsb24A» на языке программирования Java для управления модулем Ke-USB24A. Поскольку модуль определяется, как виртуальный COM-порт, нам необходимо выполнить несколько предварительных шагов до того, как приступим к непосредственному описанию тела класса:
Для начала следует импортировать ряд пакетов для работы с виртуальным COM-портом:
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.InputStream;
import java.io.OutputStream;
Далее добавить зависимость Maven в файл «pom.xml» проекта:
<dependency>
<groupId>org.rxtx
<artifactId>rxtx
<version>2.1.7
</dependency>
Скопировать файл «RXTXcomm.jar» из файлов к статье в папку «lib» виртуальной машини Java (например: «C:\Program Files\jre6\lib\» или «C:\Program Files\Java\jdk1.7.0_45\lib\»).
Затем скопировать файлы «rxtxParallel.dll» и «rxtxserial.dll» из приведенного архива в папку «bin» виртуальнойй машины Java (например: «C:\Program Files\jre6\bin\» или «C:\Program Files\Java\jdk1.7.0_45\bin\»).
После выполнения всех вышеприведенных пунктов можно приступить непосредственно к реализации класса «KeUsb24A». Объявим два члена класса – потоки ввода и вывода: один для чтения виртуального COM-порта, другой – для записи в него:
private InputStream in;
private OutputStream out;
После этого напишем private-метод для открытия виртуального COM-порта, а затем используем его в конструкторе класса:
private int open( String portName ) throws Exception {
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
if (!portIdentifier.isCurrentlyOwned()) {
return openNotCurrentlyOwnedPort(portIdentifier);
}
else {
return 1;
}
}
private int openNotCurrentlyOwnedPort(CommPortIdentifier portIdentifier)
throws Exception {
CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000);
if (commPort instanceof SerialPort) {
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(57600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
setStreams(serialPort);
return 0;
} else {
return -1;
}
}
private void setStreams(SerialPort serialPort) throws Exception {
in = serialPort.getInputStream();
out = serialPort.getOutputStream();
}
Реализация конструктора класса:
public KeUsb24A(String portName) {
try {
open(portName);
} catch (Exception ex) {
System.out.println("Не удалось найти устройство Ke-USB24A");
}
}
Затем реализуем метод записи строки в виртуальный COM-порт, а также метод считывания ответа.
private void write(String S) throws Exception {
byte[] b = new byte[100];
char[] s = S.toCharArray();
for( int i = 0; i < s.length; i++ ) {
b[i] = (byte)s[i];
}
out.write( b, 0, s.length );
byte bb[] = {'\r', '\n'};
out.write( bb, 0, 2 );
}
Реализация метода для считывания ответа модуля Ke-USB24A:
private String getAnswer() throws Exception {
byte[] buf = new byte[100];
char[] text = new char[100];
int i = 0;
while (buf[0] != '\n') {
in.read(buf, 0, 1);
text[i++] = (char) buf[0];
}
return new String(text, 0, i);
}
Для получения информации от модуля о том, успешно ли выполнена команда, напишем соответствующий метод класса, который будет возвращать 0, если команда выполнена успешно, 1 – при синтаксической ошибке в команде.
private int setCommand(String S) throws Exception {
write(S);
String s = getAnswer();
if (s.equals("#ERR\r\n")) {
return 1;
} else {
return 0;
}
}
Реализуем другие методы, в соответствии с описанием команд управления модулем Ke-USB24A. Одним из таких методов является установление высокго или низкого уровня напряжения для линий ввода/вывода модуля, приведенным в листинге ниже:
public int setLineValue(int line, boolean value) {
try {
if (value) {
return setCommand("$KE,WR," + line + "," + 1);
} else {
return setCommand("$KE,WR," + line + "," + 0);
}
} catch (Exception ex) {
return -1;
}
}
После того, как реализованы необходимые для работы с модулем методы, можно начинать с ним работу. Вашему вниманию представляется листинг ниже, в котором приведен краткий пример использования написанного нами класса «KeUsb24A».
KeUsb24A module = new KeUsb24A("COM3");
module.setLineValue(10, true);
© Никитенко Алексей Константинович (г. Днепропетровск)
09 Апреля 2014 года
http://www.kernelchip.ru