Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 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



© KERNELCHIP 2006 - 2017