egorka39
Posts: 2
Joined: Wed Oct 07, 2015 8:24 am

2 COM порта по USB java

Wed Oct 07, 2015 9:04 am

Не могу заставить работать 2 СОМ порта подключенные по USB. Использую java.
Вопрос вот в чем.
Нужно из одного устройства по UART получить данные, проанализировать и выдать команду другому устройству по UART
Я написал небольшой код, точнее модифицировал существующий, и проблема возникает когда пытаюсь открыть 2 разных порта (/dev/ttyACM0 - это источник информации (для теста использовал Arduino Mega 2560) /dev/ttyUSB0 - это приемник команд (для теста использовал Arduino))
Если в коде сделать так чтобы только получать данные то программа запускается и работает, но если вернуть часть кода завязанную на передачу то получаю ошибку gnu.io.NoSuchPortException
Проанализировав ошибку, предположил что код отвечающий за передачу пытается открыть порт /dev/ttyACM0 который был ранее открыт.
Помогите исправить ошибку.

egorka39
Posts: 2
Joined: Wed Oct 07, 2015 8:24 am

2 COM порта по USB java

Wed Oct 07, 2015 9:47 am

Code: Select all

package TestSerialComm;
import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.File;
import java.io.InputStream;
import java.util.Properties;

public class TestSerialComm {
    //private CommPortIdentifier portIdentifier;
    //private SerialPort serialPort;
    private InputStream in;
    public static final boolean DEV_MODE = true;
    public static String msg = "";
    public static int numtelegrams = 0;
    public static int l = 0;

    public static SendCM send;

    void connect(String portName) throws Exception {
    	/*
    	Properties properties = System.getProperties();
    	String currentPorts = properties.getProperty("gnu.io.rxtx.SerialPorts", portName);
    	
    	if (currentPorts.equals(portName)) {
    	     properties.setProperty("gnu.io.rxtx.SerialPorts", portName);
    	  } else {
    	     properties.setProperty("gnu.io.rxtx.SerialPorts", currentPorts + File.pathSeparator + portName);
    	 } 
    	
    	System.out.println("In currentPorts " + currentPorts);
    	*/
    	System.out.println("In portName " + portName);
    	CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
        if(portIdentifier.isCurrentlyOwned()) {
            System.out.println("Error: Port is currently in use");
        } else {
            if(DEV_MODE) System.out.println("Starting...");
            int timeout = 2000;
            CommPort commPort = portIdentifier.open(getClass().getName(), timeout);
            if(commPort instanceof SerialPort) {
            	SerialPort serialPort = (SerialPort)commPort;
                serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.FLOWCONTROL_NONE );
                in = serialPort.getInputStream();
            } else {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }
    }

    public void fetchTelegrams() throws Exception {
        int b = -1;
        byte lb = 0;
        if(DEV_MODE) System.out.println("Inside loop...");
        while (true) {
            b = in.read();
            if (b < 0) b = in.read();
            //System.out.print(this.hexify(b));
            msg = msg + (char)b;
            try{
                l = msg.length();
                char ch = msg.charAt(l - 2);
                lb = Byte.valueOf((byte)ch);
            }
            catch(Exception e){
                System.out.println(e);
            }
            finally{
                if (b == 86 && lb == 29){
                    System.out.println("++++++++++++++++" + numtelegrams + " (cmd " + lb + " " + b + ")");
                    String[] parts = msg.split("\r\n");
                    int c = parts.length;
                    //for(int i = 0; i < c; i++){
                    //  System.out.println("line " + i + " => " + parts[i]);
                    //}
                    try{
                        String temp = parts[6];
                        System.out.println("Line product " + temp);
                        String[] lineparts = temp.split(" ");
                        int l = lineparts.length;
                        //for(int i = 0; i < l; i++){
                        //  System.out.println("line " + i + " => " + lineparts[i]);
                        //}
                        System.out.println("product = " + lineparts[0]);
                        System.out.println("kol = " + lineparts[l - 1]);
                        //send.sendMessage("K001");
                    }
                    catch(Exception e){
                        System.out.println(e);
                    }
                    finally{
                        msg = "";
                        numtelegrams++;
                    }
                }
            }
            //System.out.print((char)b);
        }
    }

    public static void main( String[] args ) {
        try {
            TestSerialComm test = new TestSerialComm();
            test.connect("/dev/tty" + args[0]);
            SendCM send = new SendCM();
            send.connect("/dev/tty" + args[1]);
            test.fetchTelegrams();
            System.exit(0);
        } catch( Exception e ) {
            e.printStackTrace();
        }
    }
}

Code: Select all

package TestSerialComm;

import java.io.File;
import java.io.OutputStream;
import java.util.Properties;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

public class SendCM {
    //private CommPortIdentifier portIdentifier;
    //private SerialPort serialPort;
    private OutputStream out;
    public static final boolean DEV_MODE = true;

    void connect(String portNameOut) throws Exception {
    	
    	/*
    	Properties propertiesOut = System.getProperties();
    	
    	System.out.println(propertiesOut);
    	String currentPortsOut = propertiesOut.getProperty("gnu.io.rxtx.SerialPorts", portNameOut);
    	
    	if (currentPortsOut.equals(portNameOut)) {
    	     propertiesOut.setProperty("gnu.io.rxtx.SerialPorts", portNameOut);
    	  } else {
    	     propertiesOut.setProperty("gnu.io.rxtx.SerialPorts", currentPortsOut + File.pathSeparator + portNameOut);
    	 } 
    	
    	System.out.println(currentPortsOut);
    	*/
    	//System.out.println("Out currentPorts " + currentPortsOut);
    	System.out.println("Out portName " + portNameOut);
    	
    	CommPortIdentifier portIdentifierOut = CommPortIdentifier.getPortIdentifier(portNameOut);
        if(portIdentifierOut.isCurrentlyOwned()) {
            System.out.println("Error: Port is currently in use");
        } else {
            if(DEV_MODE) System.out.println("Starting...");
            int timeout = 2000;
            CommPort commPortOut = portIdentifierOut.open(getClass().getName(), timeout);
            if(commPortOut instanceof SerialPort) {
            	SerialPort serialPortOut = (SerialPort)commPortOut;
                serialPortOut.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.FLOWCONTROL_NONE );
                out = serialPortOut.getOutputStream();
            } else {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }
    }

    public void sendMessage(String msg) throws Exception {
        if(DEV_MODE) System.out.println("sendMessage..." + msg);
        out.write(msg.getBytes(), 0, msg.getBytes().length);
        if(DEV_MODE) System.out.println("sendMessage...OK");
    }

}


User avatar
svsdval
Posts: 133
Joined: Fri Jan 18, 2013 5:12 pm
Location: Russia->Siberia->Altayskiy Kray->Biysk
Contact: ICQ Website

Re: 2 COM порта по USB java

Tue Oct 13, 2015 2:27 pm

ttyUSBx - это симуляция ком порта со всеми спецификациями типа битовой скорости итп.
ttyACMx - поток байтов точка-точка, остальное выкинуто.

Посмотрите возможно вы просто не стем работаете, либо у вас не правильные права на использование портов стоят, которые не дают возможности записывать, попробуйте поставить chmod 777 /dev/ttyXXX
Debian/Blender/Gimp/Inkscape/Lmms/Fpc/Gcc crazy user ;)

Return to “Русский”