Опрашивать несколько Com портов одновременно

 
 
 
Сообщения:21
Стоит задача опрашивать сразу 12 устройств по последовательному порту и отображение результата на главном экране. Опрос происходит путём отправки запроса( их 3 вида) и получение ответа от устройства. Хочется попробовать реализовать опрос каждого устройства в отдельном потоке. Для работы с последовательным портом использую JSSC библиотеку.
Каркас класса..
package sample.Communication;

import javafx.application.Platform;
import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

public class MySerialPorts extends SerialPort implements SerialPortEventListener, Runnable {
    boolean stopComPort;
     int[] data;

    public MySerialPorts(String portName) {
        super(portName);
        //Инициализируем последовательный порт
    }

    @Override
    public void serialEvent(SerialPortEvent serialPortEvent) {
       
        try {
            data = readIntArray();//
            System.out.println("Размер " + data.length);

        } catch (SerialPortException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        stopComPort = true;
        while(stopComPort){
            //Ждем данных..
            //Разбор принятых данных и отправка на GUI через Platform.runlate
        }
    }

    public void sendRequest(){
        //Отправлять запрос с периодом 5 сек.
    }

    public void stop(){
        stopComPort = false;
    }
}


1. Как правильно передать принятые данные на обработку из serialEvent?
2. Как организовать отправку запроса с периодичностью? И ожидать прием данных. Если время истекло, то считаем, что устройство не активно.
 
 
Сообщения:16
Quote:
Как организовать отправку запроса с периодичностью?


Использовать ScheduledThreadExecutor
 
 
Сообщения:21
1. Правильно ли я понимаю, ScheduledThreadExecutor создается в отдельном потоке!?
2. Как правильно передать значение принятое в serialEvent в другой поток(в метод run) в нашем классе, а то при передачи переменной как есть сейчас происходит ошибка NullPointerException и указывает на строку где используется переменная.
@Override
    public void run() {
        stopComPort = true;
        while(stopComPort){
            //Ждем данных..
            //Разбор принятых данных(переменная data) и отправка на GUI через Platform.runlate
            //
        }
    }

Хотелось сделать так: После принятия данных в serialEvent, передать их в отдельный поток, где происходит разбор и манипуляции данных и потом через Platform.runlate отображаем их в главном окне. И таких классов будет 12 шт.(12 COM портов). Правильно ли я думаю или лучше по другому организовать прием и передачу данных?
 
 
Сообщения:1518
Задаете новую переменную класса
private ScheduledExecutorService service;

в конструкторе пишете
service = Executors.newScheduledThreadPool(15);//создали сервис с 15 воркерами


теперь в event вы можете написать обработчик
 service.execute(new Runnable() {
            @Override
            public void run() {
                
            }
        });

если вам не нужен результат или метод submit если нужен

Quote:
Как организовать отправку запроса с периодичностью

       
        //создали периодичную таску, которая запустится через 500мс и будет запускаться каждую секунду
        //если вы хотите чтобы одновременно запускалось не более 1 такой задачи, то можете объявить сервис с 1 воркером
        ScheduledFuture task = service.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {

            }
        }, 500L, 1000L, TimeUnit.MILLISECONDS);
        //тут отменяем задачу
        task.cancel(true);


для вас скорее всего имеет смысл создать отдельный класс который имплементит Runnable и который обрабатывает запросы
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет