PDA

Просмотр полной версии : Java (JSSC) подключение к ТРМ101



Pushchin
27.03.2018, 09:55
Есть необходимость снимать показания ТРМ101.
Используется конвертор АС3. Программа на Java (хотя конечно библиотека на С).
Сниффером получена команда (последовательность байтов) для ТРМ101 и она работает будучи отослана не из Java.
Java программа отсылает команду с СОМ-порт и ничего не происходит.

У меня сложилось впечатление, что байты помещены в буфер, но их не читает ТРМ101. В конце концов JSSC работает с RS232, а у нас RS485.

Я не нашел за полчаса серфинга никаких полезных сведений на тему Java+продукция ОВЕН.
Поэтому взываю о помощи, что я не так делаю?

public class SerialApp {
private static SerialPort serialPort;
public static void main(String[] args) {
serialPort = new SerialPort("COM1");
try {
//Открываем порт
serialPort.openPort();
//Выставляем параметры
serialPort.setParams(SerialPort.BAUDRATE_9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
//Включаем аппаратное управление потоком
serialPort.setFlowControlMode(SerialPort.FLOWCONTR OL_RTSCTS_IN |
SerialPort.FLOWCONTROL_RTSCTS_OUT);
//Устанавливаем ивент лисенер и маску
serialPort.addEventListener(new PortReader(), SerialPort.MASK_RXCHAR);
//Отправляем запрос устройству
byte[] hexRequest = {0x23,0x50,0x4F,0x48,0x47,0x52,0x4F,0x54,0x56,0x4B ,0x54,0x47,0x56,0x0D};
serialPort.setRTS(true);
serialPort.writeBytes(hexRequest);
serialPort.setDTR(true);
}
catch (SerialPortException ex) {
System.out.println(ex.getPortName());
}
}
private static class PortReader implements SerialPortEventListener {

public void serialEvent(SerialPortEvent event) {
if(event.isRXCHAR() && event.getEventValue() > 0){
try {
//Получаем ответ от устройства, обрабатываем данные и т.д.
String data = serialPort.readString(event.getEventValue());
//И снова отправляем запрос
serialPort.writeString("Get data");
}
catch (SerialPortException ex) {
System.out.println(ex);
}}}}}

capzap
27.03.2018, 10:15
смотря какие ключевые слова вводили в поиск
http://www.owen.ru/forum/showthread.php?t=232&p=250558&viewfull=1#post250558

Pushchin
27.03.2018, 11:10
Спасибо за ссылку, но она не помогла разобраться в тонкостях обращения к RS485 из JSSC.

melky
27.03.2018, 11:41
не все ли равно что там у вас на обратной стороне АС3 или подобного ? RS485, RS232 или что еще ? вы работаете с COM портом, а какой на хвосте преобразователь совершенно не важно. Я вот с MBus сижу работаю и не вижу разницы....

Начните с прослушки порта утилитами для начала, может у вас в него ничего не улетает. Если что-то уходит подключайте осцилограф на физическую линию и смотрите. У меня только раз пришлось осцилу подключать, когда с MBus разбирался. В остальных случаях даже не потребовалось, так как затык был раньше.

capzap
27.03.2018, 12:23
Спасибо за ссылку, но она не помогла разобраться в тонкостях обращения к RS485 из JSSC.

что тут скажешь, значит так хотите разобраться

Pushchin
29.03.2018, 15:57
не все ли равно что там у вас на обратной стороне АС3 или подобного ? RS485, RS232 или что еще ? вы работаете с COM портом, а какой на хвосте преобразователь совершенно не важно. Я вот с MBus сижу работаю и не вижу разницы....

Начните с прослушки порта утилитами для начала, может у вас в него ничего не улетает. Если что-то уходит подключайте осцилограф на физическую линию и смотрите. У меня только раз пришлось осцилу подключать, когда с MBus разбирался. В остальных случаях даже не потребовалось, так как затык был раньше.

Спасибо за совет с прослушкой, но я с прослушки начал. Оттуда взял последовательность байтов для команды. Если посылать "подслушанные" команды через сторонние программы, все работает, ответы приходят. В случае с JSSC в порт пишется, но ТРМ не отвечает, похоже есть какой-то нюанс чтобы ТРМ принял.

melky
29.03.2018, 16:15
//Включаем аппаратное управление потоком
serialPort.setFlowControlMode(SerialPort.FLOWCONTR OL_RTSCTS_IN |
SerialPort.FLOWCONTROL_RTSCTS_OUT);

А вот это надо ? что сторонние программы включают аппаратное управление ?

Pushchin
29.03.2018, 16:43
//Включаем аппаратное управление потоком
serialPort.setFlowControlMode(SerialPort.FLOWCONTR OL_RTSCTS_IN |
SerialPort.FLOWCONTROL_RTSCTS_OUT);

А вот это надо ? что сторонние программы включают аппаратное управление ?

Да, верно, я уже и сам serialPort.setFlowControlMode(SerialPort.FLOWCONTR OL_NONE) написал, как и стоит в настройках порта.
Реально стал ответ приходить, спасибо. Правда ответ какой-то избыточный, но это лучше чем вообще никакого.

Теперь разбираюсь почему обработчик ответа не запускается.

P.S. Впечатление, что весь и-нет репостит один и тот же нерабочий код...

Pushchin
29.03.2018, 16:48
Все понятно, обработчик в ответ тупо записывает в порт стринг (не команду), поэтому ничего не происходит.