www.mikrocontroller.net

Forum: PC-Programmierung Kommunikation über Com liegt brach


Autor: Topal (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan M. (stephanm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Topal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also wenn ich bei mir
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.