Nasłuchiwanie na COM z poziomu Javy przy pomocy Pythona.

0

Witam serdecznie,
Na wstępie chciałbym zaznaczyć, że jestem początkujący w Javie i mam problem, z którym nie mogę sobie samemu poradzić. Mianowicie muszę odczytywać dane z portu COM1. Znalazłem w sieci rozwiązania przy użyciu biblioteki RxTx jednak czytałem, że pod Windows 7 64 nie działa ona w pełni sprawnie i postanowiłem znaleźć jakieś inne rozwiązanie. Znajomy polecił mi napisać skrypt w Pythonie i interpretować ten skrypt z poziomu mojej klasy w Javie. Tak też zrobiłem, jednak przy próbie zinterpretowania linii "import serial" otrzymuję komunikat informujący mnie, że nie znaleziono "Java Communications API". Moje pytanie brzmi czy jest możliwość rozwiązania mojego problemu bez konieczności użycia RxTx? Dodam, że sam skrypt działa prawidłowo. Bardzo proszę o pomoc. Pozdrawiam.

Kod metody (Java):

public void listenOnCOM()throws PyException
{ 
    PythonInterpreter interp = new PythonInterpreter(null, new PySystemState());

    PySystemState sys = Py.getSystemState();
    sys.path.append(new PyString("C:\\jython2.5.3\\Lib"));
    sys.path.append(new PyString("C:\\jython2.5.3\\Lib\\site-packages"));
    //sys.platform = new PyString("win32");
    interp.execfile("main.py");
	
    System.out.println("Goodbye, cruel world");
} 

Kod skryptu (Python):

import time
import subprocess
import serial

ser = serial.Serial('COM1', 115200, timeout=0.005)
print("connected to: " + ser.portstr)
myFile = open('Failed.txt','w')
while True:
    # Read a line and convert it from b'xxx\r\n' to xxx
    line = ser.readline().strip()
    if line:  # If it isn't a blank line
        str = time.strftime("%m/%d/%Y %H:%M:%S")
        print(str+" "+"#1"+" "+line)

        myFile.write(str+" "+"#1"+" "+line+"\r\n")

        if line == '520':
            subprocess.call(["xte", "key Up"])
        elif line == '620':
            subprocess.call(["xte", "key Down"])
        elif line == '110':
            break
myFile.close()
ser.close()

To co wypluwa mi kompilator:
Exception in thread "MainThread" Traceback (most recent call last):
File "main.py", line 3, in <module>
import serial
File "C:\jython2.5.3\Lib\site-packages\serial_init_.py", line 23, in <module>
from serial.serialjava import *
File "C:\jython2.5.3\Lib\site-packages\serial\serialjava.py", line 35, in <module>
comm = detect_java_comm([
File "C:\jython2.5.3\Lib\site-packages\serial\serialjava.py", line 29, in detect_java_comm
raise ImportError("No Java Communications API implementation found")
ImportError: No Java Communications API implementation found

0

Witam

O to kod javy działający pod win 7 64 bit:


import java.awt.*;
import java.awt.geom.*;
import  javax.swing.*;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import javax.swing.JOptionPane;

public class GUI extends javax.swing.JFrame {

  
   Listener _listener;
   SerialPort _serialPort;
   CommPortIdentifier _portId;
   
    public GUI() 
    {
         initComponents();
         initTextField();
       
      
    }

    private void GetConnection()
    {
         jButton2.setEnabled(false);
      
      try
      {
       _portId=CommPortIdentifier.getPortIdentifier("COM2");
       _serialPort = (SerialPort) _portId.open("App", 2000);
       _serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);     
       _listener=new Listener(this);
 
      }
      catch(Exception ex)
      {
          javax.swing.JOptionPane.showMessageDialog(null,ex.getMessage(),"Error",JOptionPane.ERROR_MESSAGE);
          jButton2.setEnabled(true);
      }
    }
    
 


public void CloseApp()
{ 
      if(_serialPort!=null)
      {
        _serialPort.close();
      }
      this.dispose();
}

Funkcja GetConnection jest wywoływana na kliknięcie buttona

import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.*;



public class Listener implements SerialPortEventListener
{
    private final byte[] _buforIn=new byte[20];
    

    private InputStream _inputStream;
    private DataInputStream _dataInputStream;
    
    public Listener(GUI obj)
    {
      
        try
        {  
        obj._serialPort.addEventListener(this);
        obj._serialPort.notifyOnDataAvailable(true);
        _inputStream=obj._serialPort.getInputStream();
        _dataInputStream=new DataInputStream(_inputStream);
        }
        catch(Exception ex){}
    }
    @Override
    public void serialEvent(SerialPortEvent spe) {
        try 
        {
            _dataInputStream.read(_buforIn, 0, _buforIn.length);
        } 
        catch (IOException ex) 
        {
            ClearTextFields();
        }
       
        // Tutaj cos robisz zdanymi które są w _buforIn[]

        
         for(byte i:_buforIn) i=0;
    }
    
  
    
    
}

0
kornik280 napisał(a):

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

Rozumiem, że wymagana jest biblioteka RxTx. A mógłbyś napisać w jakiej wersji? Z tego co wiem to ostatni relase dostępny na repozytorium Mavena to 2.1.7, a ta wersja nie chciała wspołpracować z moim systemem. Pozdrawiam i dzięki za odpowiedz.

1

Tą bibliotek używam: http://jlog.org/v4/windows/win64/RXTXcomm.jar
Mam win7 64 bit i działa

0

Dzięki, z tą biblioteką wszystko działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1