Forum: PC-Programmierung Kommunikation über Com liegt brach


von Topal (Gast)


Lesenswert?

Morgen Morgen,

habe ein kleines Problem und hoffe auf Hilfe. (Das Script hat ein 
bekannter von mir geschrieben da er mehr Ahnung von der Materie hat als 
ich. Ich versuche mich natürlich selber auch einzubringen da das Script 
ja auch für mich gedacht ist.)

Und zwar habe ich 2 Rechner:

Rechner 1 Com2
Rechner 2 Com2

Nun ein versuch:

Auf Rechner 1 ist das Script und auf Rechner 2 hypertrm aktiv. Sobald 
ich nun das Script ausführe erscheint im hypertrm 
„[10][02][03][10][03][00]“. Somit sendet das Script aufjedenfall.

Wenn ich nun auf Rechner 1 und Rechner 2 das Script laufen lasse, kommt 
leider nichts an. Was wohl bedeutet das das empfangen noch nicht richtig 
funktioniert. Könnte mir da vlt. jemand Helfen?

#------------------#

package tp;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;

import gnu.io.*;

/**
 * COM2SchnittstellenTransfer
 * @author ABre
 * @version 1.0 1/27/2010*/
public class Com2PortTransfer implements Runnable{
    private Thread thread;
    private CommPortIdentifier com2PortIdentifier;
    private SerialPort com2;
    private int baud;
    private int dataBits;
    private int stopBits;
    private int parity;
    private OutputStream outputStream;
    private InputStream inputStream;

    public static void main(String[] args) {
        new Com2PortTransfer();
    }

    public Com2PortTransfer() {
        baud = 38400;
        dataBits = SerialPort.DATABITS_8;
        stopBits = SerialPort.STOPBITS_1;
        parity = SerialPort.PARITY_NONE;
        try {
            com2PortIdentifier = getSerialPortCom2();
        } catch (NoSuchPortException e) {
            System.err.println("Port COM2 nicht gefunden: " + 
e.getStackTrace());
        }
        thread = new Thread(this);
        thread.start();
    }

    @Override
    public void run(){
        System.out.println(portOpenNAddThings(baud, dataBits, stopBits, 
parity) ?
                "COM2 geöffnet, Parameter gesetzt." : "42");

        while (true){
        String anfrage = "[10][02][03][10][03][00]";
        System.out.println(sendeDaten(anfrage) ?
                "Daten gesendet: " + anfrage : "42");

        }
//      try {
//          Thread.sleep(2000);
//      } catch (InterruptedException e) {
//          e.printStackTrace();}
//
//      System.out.println(portSchliessen() ?
//              "COM2 geschlossen." : "Fehler: Schliessen COM2.");
    }

    /**
     *  @return Serielle Schnittstelle COM2*/
    @SuppressWarnings("unchecked")
    private CommPortIdentifier getSerialPortCom2() throws 
NoSuchPortException{
        Enumeration<CommPortIdentifier> ports = 
CommPortIdentifier.getPortIdentifiers();
        while (ports.hasMoreElements()){
            CommPortIdentifier ret = (CommPortIdentifier) 
ports.nextElement();
            if (ret.getName().equals("COM2")){
                return ret;
            }
        }
        throw new NoSuchPortException();
    }//getSerialPort

    /**
     * @param baud
     * @param dataBits
     * @param stopBits
     * @param parity
     * @return only TRUE COM2 geöffnet und Parameter gesetzt ELSE 
EXCEPTION*/
    private boolean portOpenNAddThings(int baud, int dataBits, int 
stopBits, int parity){
        try {
            com2 = (SerialPort) com2PortIdentifier.open("42", 1000);
        } catch (PortInUseException e) {
            System.err.println("COM2 wird schon benutzt: " + 
e.getStackTrace());
        }
        try {
            com2.setSerialPortParams(baud, dataBits, stopBits ,parity);
        } catch (UnsupportedCommOperationException e) {
            System.err.println("COM2 Parameter können nicht gesetzt 
werden: " + e.getStackTrace());
        }
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();}
        try {
            outputStream = com2.getOutputStream();
            inputStream = com2.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();}
        try {
            com2.addEventListener(new MyPortListener());
        } catch (TooManyListenersException e) {
            e.printStackTrace();}
        return true;
    }//portOeffnen

    /**
     * @return TRUE COM2 geschlossen ELSE FALSE*/
    private boolean portSchliessen(){
        if (com2 != null){
            com2.close();
            return true;
        }
        return false;
    }//portSchliessen

    /**
     * @param daten Daten als String
     * @return TRUE Daten gesendet*/
    private boolean sendeDaten(String daten){
        try {
            outputStream.write(daten.getBytes());
        } catch (IOException e) {
            e.printStackTrace();}
        return true;
    }

    /**
     * SerialPortEventListener*/
    private class MyPortListener implements SerialPortEventListener{

        @Override
        public void serialEvent(SerialPortEvent event) {
            if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE){
                int temp;
                System.out.println("Daten verfügbar.");
                try {
                    while ((temp = inputStream.read()) != -1)
                        System.out.println((char) temp);
                } catch (IOException e) {
                    e.printStackTrace();}
            }
        }

    }//MyPortListener

}//Com2PortTransfer

von Stephan M. (stephanm)


Lesenswert?

Topal schrieb:
>         @Override
>         public void serialEvent(SerialPortEvent event) {

Wenn ich zusätzlich noch com2.notifyOnDataAvailable(true); aufrufe dann 
lande ich beim Debuggen auch in dem Listener, was ohne den Aufruf nicht 
der Fall war. Allerdings mag mich dann die JRE nicht mehr:

# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f6aedae695d, pid=20567, 
tid=140097229805840
#
# JRE version: 6.0_17-b04
# Java VM: Java HotSpot(TM) 64-Bit Server VM (14.3-b01 mixed mode 
linux-amd64 )
# Problematic frame:
# C  [librxtxSerial-2.1-7.so+0x795d]  read_byte_array+0x3d

Na egal, vielleicht hilfts Dir ja weiter. Was auch helfen würde, wäre 
der Kursus "Mastering Exception Propagation and Exception Handling in 
Simple Java Programs" ;)

Stephan

von Topal (Gast)


Lesenswert?

Also wenn ich bei mir
1
com2.notifyOnDataAvailable(true);
einbaue kommt keine fehler meldung. Und das script rennt durch.

Funzt also so wie es im moment gewünscht ist. Ich danke dir wobei es 
sicher nicht das letzte problem war.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.