Чтение и запись одновременно на одном последовательном порту JAVA RXTX в одной и той же теме - PullRequest
0 голосов
/ 02 февраля 2020

Чтение и запись одновременно на одном и том же JAVA Последовательный порт RXTX в одном потоке

Возможно ли чтение и запись с одного и того же последовательного порта в одном и том же потоке Java в режиме реального времени. На самом деле я читаю данные от Arduino и мне нужно отправить те же данные в Arduino в режиме реального времени. Я использую условие true в моем Runnable, поэтому не могу получить данные в EventListner.

Фрагмент кода

 public void initialize() 
{
        CommPortIdentifier portId = null;
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

        //First, Find an instance of serial port as set in PORT_NAMES.
        while (portEnum.hasMoreElements()) {
            CommPortIdentifier currPortId
                    = (CommPortIdentifier) portEnum.nextElement();
            for (String portName : PORT_NAMES) {
                if (currPortId.getName().equals(portName)) {
                    portId = currPortId;
                    break;
                }
            }
        }
        if (portId == null) {
            System.out.println("Could not find COM port.");
            logText="Could not find COM Port. Please Change your device port to COM3.";
            isconnected=false;
            return;
        } else {
            System.out.println("Port Name: " + portId.getName() + "\n"
                    + "Current Owner: " + portId.getCurrentOwner() + "\n"
                    + "Port Type: " + portId.getPortType());
            logText = portId.getName()+ " Successfully Connected!";
            isconnected=true;
            isRunning=true;
            //Controller.labelStatus.setText(" Successfully Connected!");
        }

        try {
            // open serial port, and use class name for the appName.
            serialPort = (SerialPort) portId.open(this.getClass().getName(),
                    TIMEOUT);

            // set port parameters
            serialPort.setSerialPortParams(DATA_RATE,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);

            // open the streams
            inputstream = serialPort.getInputStream();
            output = serialPort.getOutputStream();
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
             thread = new Thread(){
                public void run(){
                    while(isRunning) {
                        System.out.println("Thread Running "+bytesToHexString(BtnHexData.getInstance().getSendingPack()));

                        try {
                            output.write(BtnHexData.getInstance().getSendingPack());

                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        try {
                            Thread.sleep(200);
                            //System.out.println("\t\t Thread Receiving "+bytesToHexString(input.readAllBytes()));
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };

            thread.start();

        } catch (Exception e) {
            serialPort.close();
            System.err.println(e.toString());
            logText="Error: "+e.toString();
        }
    }

1 Ответ

0 голосов
/ 30 апреля 2020

У меня была такая же проблема, но наконец-то я нашел решение!

Есть еще одна JAVA библиотека библиотеки "com.fazecast.jSerialComm", которая является окончательным решением для операций чтения и записи в реальном времени на последовательном порту. порт одновременно. Я публикую свои выводы, если кому-то понадобится помощь по этой проблеме ...

Класс SerialPort с использованием jSerialComm

import com.fazecast.jSerialComm.SerialPort;
import com.fazecast.jSerialComm.SerialPortDataListener;
import com.fazecast.jSerialComm.SerialPortEvent;

public class MySerialPort {
    public static SerialPort arduinoPort = null;
    public static InputStream arduinoStream = null;
    static String logText="";
    private static boolean isRunning=false;
    private   byte[] sendingPack;
    private   byte[] receivingPack;
    public static boolean isRunning() {
        return isRunning;
    }

    public static void setRunning(boolean running) {
        sendingPack = new byte[6];
        receivingPack= new byte[36];
        isRunning = running;

    }
   public static void connectPort(String port) {
        devicePortName = port;

        int len = SerialPort.getCommPorts().length;
        SerialPort serialPorts[] = new SerialPort[len];
        serialPorts = SerialPort.getCommPorts();

        for (int i = 0; i < len; i++) {

            String portName = serialPorts[i].getDescriptivePortName();
            System.out.println(serialPorts[i].getSystemPortName() + ": " + portName + ": " 
             + i);

            if (portName.contains(devicePortName)) {
                try {
                    arduinoPort = serialPorts[i];
                    arduinoPort.setBaudRate(115200);
                    arduinoPort.openPort();
                    setRunning(true);
                    System.out.println("connected to: " + portName + "[" + i + "]");
                    logText="Connected to: " + portName ;

                    break;
                } catch (Exception e) {
                    e.printStackTrace();
                    loogger.stop();
                    arduinoPort.closePort();
                }
           } }

      (new Thread(new SerialReader(receivingPack))).start();
      (new Thread(new SerialWriter(sendingPack))).start();
     }
    public static class SerialReader implements Runnable
      {
        byte[] buffer;

        public SerialReader ( byte[] buffer )
        {
            this.buffer = buffer;
            System.out.println("Reader");

        }

        public void run () {

            readData(buffer,isRunning());
        }
    }
  public static class SerialWriter implements Runnable
    {
        byte[] buffer;

        public SerialWriter ( byte[] buffer )
        {
            this.buffer = buffer;

        }

        public void run () {

            sendData(buffer);

        }
    }
   public static void sendData(byte[] buffer){

        while (isRunning){

            arduinoPort.writeBytes(sendingPack,6,0);

     System.out.println("Sending"+bytesToHexString(sendingPack));
            try {
                Thread.sleep(200);
            } catch (Exception e) {
                e.printStackTrace();
            }
            }
       }

  public static void readData(byte[] buffer,boolean loopStatus){
        while (isRunning()){

            arduinoPort.readBytes(receivingPack,36,0);

            if(receivingPack()[0] & 0xff)==144 ){           

         String bufferD=bytesToHexString(receivingPack);
                    System.out.println(bufferD);

            }
            try {
                Thread.sleep(50);
            } catch (Exception e) {
                e.printStackTrace();
        }    }


  public static String bytesToHexString(byte[] bytes){
          StringBuilder sb = new StringBuilder();
        for (byte b : bytes){
            sb.append(String.format("%02x", b&0xff));
        }
        return sb.toString();
    }
    }

Основной класс

   public static void main(String[] args) {
            MySerialPort.setRunning(true);
            MySerialPort.connectPort("COM3");
    }
...