Datei senden via Xmodem an Serial-Port

  • Themenstarter Gelöschtes Mitglied 65862
  • Beginndatum
G

Gelöschtes Mitglied 65862

Gast
In einem aktuellen Projekt, möchte ich einen Cisco-Switch mithilfe meines Tools konfigurieren lassen.
Soweit kann ich über Serial-Port eine Verbindung zum Switch herstellen und die Konfiguration größtenteils durchführen. Allerdings muss ich an einer Stelle das Konfigurationstemplate an den Switch mittels Xmodem senden und genau dort scheitere ich.

Nämlich erhalte ich folgenden Fehler: The read operation timed out before any data was returned.

Der Error tritt in Zeile 112 und 252 auf. (Quellcode weiter unten)

Wenn ich mich nicht irre, geht es hierbei um den fehlenden InputStream des Switches. Allerdings erhalte ich keinen Input des Switches, sondern sende nur Output (Konfigurationsbefehle) an diesen.

Meine Frage: Kann mir vlt. jemand dabei weiterhelfen, wie ich es schaffe das Problem zu beheben und die Datei an den Switch zu senden? Ich bin für jede Hilfe und alle Tipps sehr dankbar.

Xmodem Quellcode:
public class Xmodem
{
    //  start
    private final byte SOH = 0x01;
    //  The end of the
    private final byte EOT = 0x04;
    //  The reply
    private final byte ACK = 0x06;
    //  The retransmission
    private final byte NAK = 0x15;
    //  Unconditional termination
    @SuppressWarnings("unused")
    private final byte CAN = 0x18;

    //  In order to 4278 Data is transmitted in the form of byte blocks
    private final int SECTOR_SIZE = 128; //Standardwert: 128
    //  Maximum error (no reply) number of packets
    private final int MAX_ERRORS = 10;

    //  Input stream for reading serial port data
    private InputStream inStream;
    //  Output stream for sending serial port data
    private OutputStream outStream;

 public Xmodem(InputStream inStream, OutputStream outStream)
 {
     this.inStream = inStream;
     this.outStream = outStream;
 }

 /**
 *  To send data
 *
 * @param filePath
 *   The file path
 */
 public void send(final String filePath)
 {
     new Thread()
     {
         public void run()
         {
             try
             {
                 //  Error packets
                 int errorCount;
                 //  Package number
                 byte blockNumber = 0x01;
                 //  The checksum
                 int checkSum;
                 //  The number of bytes read into the buffer
                 int nbytes;
                 //  Initializes the data buffer
                 byte[] sector = new byte[SECTOR_SIZE];
                 //  Read file initialization
                 @SuppressWarnings("resource")
                 DataInputStream inputStream = new DataInputStream(new FileInputStream(filePath));

                 while ((nbytes = inputStream.read(sector)) > 0)
                 {
                     //  If the last 1 Packet data less than 128 Two bytes, so 0xff A filling
                     if (nbytes < SECTOR_SIZE)
                     {
                         for (int i = nbytes; i < SECTOR_SIZE; i++)
                         {
                             sector[i] = (byte) 0xff;
                         }
                     }

                     //  with 1 Packet data is sent at most 10 time
                     errorCount = 0;
                     while (errorCount < MAX_ERRORS)
                     {
                         //  Set of packages
                         //  Control characters  +  Package number  +  The inverse of the package number  +  data  +  The checksum
                         putData(SOH);
                         putData(blockNumber);
                         putData(~blockNumber);
                         checkSum = CRC16.calc(sector) & 0x00ffff;
                         putChar(sector, (short) checkSum);
                         outStream.flush();

                         //  Get response data
                         byte data = getData();
                         //  If you receive response data, jump out of the loop and send it 1 Packet data
                         //  No reply received, error number of packets +1 , continue to resend
                         if (data == ACK)
                         {
                             break;
                         }
                         else
                         {
                             ++errorCount;
                         }
                     }
                     //  The package number is self-increasing
                     blockNumber = (byte) ((++blockNumber) % 256);
                 }

                 //  When all data is sent, the end of sending is identified
                 boolean isAck = false;
                 while (!isAck)
                 {
                     putData(EOT);
                     isAck = getData() == ACK;
                 }
             }
             catch (Exception e)
             {
                 e.printStackTrace();
             }
         };
     }.start();
 }

 /**
 *  Receive data
 *
 * @param filePath
 *   The file path
 * @return  Whether the reception is completed
 * @throws IOException
 *   abnormal
 */
 public boolean receive(String filePath) throws Exception
 {
     //  Error packets
     int errorCount = 0;
     //  Package number
     byte blocknumber = 0x01;
     //  data
     byte data;
     //  The checksum
     int checkSum;
     //  Initializes the data buffer
     byte[] sector = new byte[SECTOR_SIZE];
     //  Write file initialization
     DataOutputStream outputStream = new DataOutputStream(new FileOutputStream(filePath));

     //  Send characters C . CRC Way to check
     putData((byte) 0x43);

     while (true)
     {
         if (errorCount > MAX_ERRORS)
         {
             outputStream.close();
             return false;
         }

         //  Get response data
         data = getData();
         if (data != EOT)
         {
             try
             {
                 //  Determine whether the received start id is
                 if (data != SOH)
                 {
                     errorCount++;
                     continue;
                 }

                 //  Gets the package number
                 data = getData();
                 //  Determine if the package number is correct
                 if (data != blocknumber)
                 {
                     errorCount++;
                     continue;
                 }

                 //  Gets the inverse of the package number
                 byte _blocknumber = (byte) ~getData();
                 //  Determine whether the inverse of the package number is correct
                 if (data != _blocknumber)
                 {
                     errorCount++;
                     continue;
                 }

                 //  To get the data
                 for (int i = 0; i < SECTOR_SIZE; i++)
                 {
                     sector[i] = getData();
                 }

                 //  Get the checksum
                 checkSum = (getData() & 0xff) << 8;
                 checkSum |= (getData() & 0xff);
                 //  Determine if the checksum is correct
                 int crc = CRC16.calc(sector);
                 if (crc != checkSum)
                 {
                     errorCount++;
                     continue;
                 }

                 //  Send a reply
                 putData(ACK);
                 //  The package number is self-increasing
                 blocknumber++;
                 //  Write data locally
                 outputStream.write(sector);
                 //  Error packets return to zero
                 errorCount = 0;

             }
                 catch (Exception e)
             {
                     e.printStackTrace();
             }
             finally
             {
                 //  If an error is sent, a retransmission id is sent
                 if (errorCount != 0)
                 {
                     putData(NAK);
                 }
             }
         }
         else
         {
             break;
         }
     }

     //  Turn off the output stream
     outputStream.close();
     //  Send a reply
     putData(ACK);

     return true;
 }

 /**
 *  To get the data
 *
 * @return  data
 * @throws IOException
 *   abnormal
 */
 private byte getData() throws IOException
 {
     return (byte) inStream.read();
 }

 /**
 *  To send data
 *
 * @param data
 *   data
 * @throws IOException
 *   abnormal
 */
 private void putData(int data) throws IOException
 {
     outStream.write((byte) data);
 }

 /**
 *  To send data
 *
 * @param data
 *   data
 * @param checkSum
 *   The checksum
 * @throws IOException
 *   abnormal
 */
 private void putChar(byte[] data, short checkSum) throws IOException
 {
     ByteBuffer bb = ByteBuffer.allocate(data.length + 2).order(ByteOrder.BIG_ENDIAN);
     bb.put(data);
     bb.putShort(checkSum);
     outStream.write(bb.array());
 }
}


class CRC16
{
    private static final char crctable[] =
    {
        0x0000, 0x1021, 0x2042, 0x3063,
        0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b,
        0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252,
        0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a,
        0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,
        0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509,
        0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630,
        0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738,
        0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7,
        0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af,
        0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96,
        0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e,
        0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5,
        0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,
        0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4,
        0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc,
        0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb,
        0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3,
        0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da,
        0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2,
        0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589,
        0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481,
        0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
        0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0,
        0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f,
        0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827,
        0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e,
        0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16,
        0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d,
        0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45,
        0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c,
        0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,
        0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
    };

    public static char calc(byte[] bytes)
    {
        char crc = 0x0000;
        for (byte b : bytes)
        {
            crc = (char) ((crc << 8) ^ crctable[((crc >> 8) ^ b) & 0x00ff]);
        }
        return (char) (crc);
    }
}

Aufrufen der Xmodem Class in einer anderen Class:
 public synchronized void importTemplate() throws Exception
    {
//        else if(inStream.equals(inputText3)) //Input: "Would you like to enter the initial configuration dialog? [yes/no]:"     
        outStream.write(outputText7.getBytes()); //Simulieren des Enter-Tastendrucks
        outStream.write(outputText5.getBytes()); //Befehl "no"
        outStream.write(outputText8.getBytes()); //Befehl "enable"
        outStream.write(outputText9.getBytes()); //Befehl "copy xmodem: running-config"
        outStream.write(outputText7.getBytes()); //Simulieren des Enter-Tastendrucks
        
        //xmodem einbinden, um das Konfigurationstemplate dem Switch zu senden
        Xmodem xmodem = new Xmodem(serialPort.getInputStream(),serialPort.getOutputStream()); // serialPort Is a serial port object
        //Dateipfad des Konfigurationstemplate
        xmodem.send(filePath);
        
        outStream.write(outputText10.getBytes()); //Befehl "write"
    }
 
G

Gelöschtes Mitglied 65862

Gast
Wie/womit greifst Du auf die serielle Schnittstelle zu?
Ich denke mal Du fragst, mit welcher Library.
Hab zu Beginn mit RxTx gearbeitet, hab damit allerdings immer wieder Probleme gehabt. Bin dann letztendlich auf jserialcomm gewechselt und seitdem läuft es auf jeden Fall etwas besser. Muss aber ehrlich sagen, dass ich wohl möglich noch einige RxTx-Commands benutze.
Wolltest Du das wissen?

Mir ist zudem aufgefallen, dass ich falsche Zeilenangaben gemacht habe.
Der Error tritt in den Zeile 105 und 258 auf.
 
Zuletzt bearbeitet von einem Moderator:
G

Gelöschtes Mitglied 65862

Gast
Ja, dann kann ich das mal nachbauen :)

Der Sender soll vor dem Versand auf ein NAK oder eben ein "C" des Empfängers warten, um zu entscheiden, ob es normales XMODEM oder XMODEM-CRC ist. Weiß nicht, ob das hier eine Rolle spielt.
Okay, soweit logisch. Ich hab mal mein Programm bis zur besagten Xmodem Stelle durchlaufen lassen.

Ich denke mal, folgendes "C" wird abgefragt: (Ausgabe des Switch an den Serial-Port) (Aufgezeichnet mit einem Serial-Port Monitor)

Switch#copy xmodem: running-config
Destination filename [running-config]?
Begin the Xmodem or Xmodem-1K transfer now...
CCCCCCCCCC <----------------------------
%Error opening xmodem: (I/O error)
Switch#

Wie man sieht geht das "C" über den InputStream nicht an die Abfrage weiter, weil ich ehrlicherweise nicht weiß, wie genau das umzusetzen ist.
Kannst du mir da vlt. Tipps geben bzw. weiterhelfen?
 
G

Gelöschtes Mitglied 65862

Gast
So wie Du später auf ein ACK wartest, musst Du zu Beginn des Sendens auf das C warten.
Okay, verstehe. Nur leider weiß ich echt nicht, wo diese "C"-Abfrage einzubauen ist. Hab mir das gerade angeschaut, aber komme einfach nicht drauf.

Ich denke mal in diesem Bereich irgendwo:
"C"-Abfrage Stelle:
public void send(final String filePath)
 {
     new Thread()
     {
         public void run()
         {
             try
             {
                 //  Error packets
                 int errorCount;
                 //  Package number
                 byte blockNumber = 0x01;
                 //  The checksum
                 int checkSum;
                 //  The number of bytes read into the buffer
                 int nbytes;
                 //  Initializes the data buffer
                 byte[] sector = new byte[SECTOR_SIZE];
                 //  Read file initialization
                 @SuppressWarnings("resource")
                 DataInputStream inputStream = new DataInputStream(new FileInputStream(filePath));

                 while ((nbytes = inputStream.read(sector)) > 0)
                 {
                     //  If the last 1 Packet data less than 128 Two bytes, so 0xff A filling
                     if (nbytes < SECTOR_SIZE)
                     {
                         for (int i = nbytes; i < SECTOR_SIZE; i++)
                         {
                             sector[i] = (byte) 0xff;
                         }
                     }

                     //  with 1 Packet data is sent at most 10 time
                     errorCount = 0;
                     while (errorCount < MAX_ERRORS)
                     {
                         //  Set of packages
                         //  Control characters  +  Package number  +  The inverse of the package number  +  data  +  The checksum
                         putData(SOH);
                         putData(blockNumber);
                         putData(~blockNumber);
                         checkSum = CRC16.calc(sector) & 0x00ffff;
                         putChar(sector, (short) checkSum);
                         outStream.flush();


Ist die "C"- Abfrage dann genau so aufgebaut wie die ACK-Abfrage oder muss ich den InputStream vom Switch erst in einen String umwandeln und dann mit dem Char "C" vergleichen?

Bin Dir für die Hilfe sehr Dankbar :)
 
mihe7

mihe7

Top Contributor
Es gibt ja diverse Möglichkeiten. Eine davon wäre, vor dem while, also vor Zeile 22, in einer Schleife so lange Bytes zu empfangen, bis ein C erhalten oder die Zahl an Fehlern überschritten wurde. Für den Vergleich kannst Du Dir ja eine Konstante für das 'C' (0x43) definieren. Also etwas wie

Java:
while (errorCount < MAX_ERRORS && getData() != XMODEM_CRC) {
    errorCount++;
}
wobei XMODEM_CRC für 0x43 ('C') steht.
 
G

Gelöschtes Mitglied 65862

Gast
Es gibt ja diverse Möglichkeiten. Eine davon wäre, vor dem while, also vor Zeile 22, in einer Schleife so lange Bytes zu empfangen, bis ein C erhalten oder die Zahl an Fehlern überschritten wurde. Für den Vergleich kannst Du Dir ja eine Konstante für das 'C' (0x43) definieren. Also etwas wie

Java:
while (errorCount < MAX_ERRORS && getData() != XMODEM_CRC) {
    errorCount++;
}
wobei XMODEM_CRC für 0x43 ('C') steht.
Zunächst vielen Dank für Deine Antwort. Ich hab es gerade mal versucht, bekomme aber wieder den Error:
Error:
com.fazecast.jSerialComm.SerialPortTimeoutException: The read operation timed out before any data was returned.
    at com.fazecast.jSerialComm.SerialPort$SerialPortInputStream.read(SerialPort.java:1450)
    at switchbespielung.Xmodem.getData(Xmodem.java:259)
    at switchbespielung.Xmodem$1.run(Xmodem.java:69)

Der Error in Zeile 69 ist in dem Fall der neu hinzugefügte Quellcode:
Erste Stelle:
errorCount = 0;
while (errorCount < MAX_ERRORS && getData() != XMODEM_CRC)
{
     ++errorCount;
}

und der Error in Zeile 259 ist folgender Quellcode:
Zweite Stelle:
 /**
 *  To get the data
 *
 * @return  data
 * @throws IOException
 *   abnormal
 */
 private byte getData() throws IOException
 {
     return (byte) inStream.read();
 }

Ich hab gerade nochmal darüber nachgedacht, ob es vlt. am InputStream liegt, dass dieser nicht korrekt entgegengenommen wird. Allerdings konnte ich jetzt selbst nichts falsches erkennen.

Wär es okay, wenn ich mal mein Skript zur Verbindungsherstellung mit dem Serial Port posten würde? Vlt. hilft das ja etwas weiter. :)

Vielen Dank für die Hilfe :)
 
G

Gelöschtes Mitglied 65862

Gast
Ich geh mal stark davon aus, dass du meine Serial Port Verbindung meinst.
Ich stelle dann einfach mal meinen Quellcode ein, den ich nutze, um mich mit dem Serial Port zu verbinden.

Wird der Serial Port schon genutzt oder ist kein aktiver vorhanden, wird eine Exception ausgegeben:

Verbindung:
    public void connect(String COM3) throws IOException
    {
        try
        {
            // Obtain a CommPortIdentifier object for the port you want to open
//            CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM3");
            SerialPort serialPort = SerialPort.getCommPorts()[0];
            
            if (serialPort.isOpen())
            {
                System.out.println("Error: Sie sind bereits mit dem COM3-Port verbunden!");
                serialPort.closePort();
            }
            else
            {
                // Get the port's ownership
                serialPort.openPort();
                serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 0, 0);
 
                // Set the parameters of the connection.
                setSerialPortParameters();
 
                // Open the input and output streams for the connection. If they won't
                // open, close the port before throwing an exception.
                outStream = serialPort.getOutputStream();
                inStream = serialPort.getInputStream();
            
                //EventListener
                serialPort.addDataListener(new SerialInput(inStream));
            
                // Hinweisen, wenn Daten vorhanden sind
                //serialPort.notifyOnDataAvailable(true);
                System.out.println("Verbindung zum COM3-Port hergestellt!\n");
            }
        }
        catch (IOException e)
        {
            serialPort.closePort();
            throw e;
        }
    }

Ist der Port verfügbar und wird noch nicht genutzt, so wird die Bespielung zunächst gestartet. Da das bei mir der Fall ist, denke ich hat es nichts mit der Verbindung zu tun. Jedenfalls wüsste ich auf anhieb nicht was.

Die if-Abfragen kannst Du eig ignorieren, da das Programm nicht in diese reingeht. Da weiß ich ehrlich gesagt auch noch nicht, woran es liegt.

Ich würde eig gerne meine gesamte class nochmal hochladen, die ich nutze, um eine Verbindung zum Serial Port herzustellen. Grund dafür ist, dass ich von rxtx auf jSerialComm umgestiegen bin und denke, dass ich jetzt mehrere Commands von beiden Librarys in meinem Quellcode habe.

Ich glaube, dass das Problem in dieser Class auftritt, weshalb ich meine Datei mittels Xmodem nicht senden kann.
 
mihe7

mihe7

Top Contributor
Ja, lad mal komplett hoch. Im Code oben sieht man das Interessantere nicht (setSerialPortParameters) :)

EDIT: Du kannst auch zippen.

Ich geh mal stark davon aus, dass du meine Serial Port Verbindung meinst.
Ja, klar. Ich meinte, Du sollst einfach ein kleines Testprogramm schreiben: Mit switch Verbinden, dessen Ausgabe ausgeben, irgendwelche Befehle rüberschicken. Irgendwas, damit Du siehst, dass es grundsätzlich funktioniert.
 
G

Gelöschtes Mitglied 65862

Gast
Serial-Port Verbindung:
import java.io.*;
import gnu.io.*;
import gnu.io.SerialPortEvent;
import com.fazecast.jSerialComm.SerialPort;


public class SerialPortHandler implements SerialPortEventListener
{   
    private SerialPort serialPort = SerialPort.getCommPorts()[0];
    private OutputStream outStream;
    private InputStream inStream;
    
    //Befehle
    String outputText1 = "flash_init\n";
    String outputText11 = "dir flash:\n";
    String outputText2 = "delete flash:config.text\n";
    String outputText3 = "delete flash:vlan.dat\n";
    String outputText4 = "yes\n";
    String outputText5 = "no\n";
    String outputText6 = "boot\n";
    String outputText7 = "\r\n"; //Enter-Tastendruck
    String outputText8 = "enable\n";
    String outputText9 = "copy xmodem: running-config\n";
    String outputText10 = "write\n";
    
    //Dateipfad des Konfigurationstemplate
    String filePath = "C:\\Abschlussprojekt\\eclipse\\switchbespielung\\w8003337.txt";
    String path = filePath.replace("\\", "/");
    
    //Zu vergleichender Input vom Switch
    String inputText1 = "Are you sure you want to delete \"flash:config.text\" (y/n)?";
    String inputText2 = "Are you sure you want to delete \"flash:vlan.dat\" (y/n)?";
    String inputText3 = "Would you like to enter the initial configuration dialog? [yes/no]:";
    //private byte[] readBuffer = new byte[400];
    
    
    public void serialEvent(SerialPortEvent arg0)
    {
        // TODO Auto-generated method stub   
    }
    
    
    /**
     * Get the serial port input stream
     * @return The serial port input stream
     */
    public InputStream getSerialInputStream()
    {
        return inStream;
    }
 
    /**
     * Get the serial port output stream
     * @return The serial port output stream
     */
    public OutputStream getSerialOutputStream()
    {
        return outStream;
    }
 
    /**
     * Sets the serial port parameters
     */
    void setSerialPortParameters() throws IOException
    {
        
        int baudRate = 9600; // 9600bps
        //COM-Port Einstellungen
        serialPort.setComPortParameters(baudRate, 8, SerialPort.ONE_STOP_BIT, SerialPort.NO_PARITY);
        serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DISABLED);
    }
    
    
    //Verbindung zum SerialPort
    public void connect(String COM3) throws IOException
    {
        try
        {
            // Obtain a CommPortIdentifier object for the port you want to open
            //CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM3");
            SerialPort serialPort = SerialPort.getCommPorts()[0];

            if (serialPort.isOpen())
            {
                System.err.println("Error: Sie sind bereits mit dem COM3-Port verbunden!");
            }
            else
            {
                // Get the port's ownership
                serialPort.openPort();
                //serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 0, 0);
 
                // Set the parameters of the connection.
                setSerialPortParameters();
 
                // Open the input and output streams for the connection. If they won't
                // open, close the port before throwing an exception.
                outStream = serialPort.getOutputStream();
                inStream = serialPort.getInputStream();
            
                //EventListener
                serialPort.addDataListener(new SerialInput(inStream));
            
                // Hinweisen, wenn Daten vorhanden sind
                //serialPort.notifyOnDataAvailable(true);
                System.out.println("Verbindung zum COM3-Port hergestellt!\n");
            }
        }
        catch (IOException e)
        {
            serialPort.closePort();
            throw e;
        }
    }
    
    
    //Text an COM-Port senden
//    @SuppressWarnings("unlikely-arg-type")
    public void outputStream() throws IOException, InterruptedException
    {
        System.out.println("Grundkonfiguration des Switches startet!");
        
        outStream.write(outputText1.getBytes()); // Befehl "flash_init"
    
//        outStream.write(outputText11.getBytes()); // Befehl "dir flash:"
        
        outStream.write(outputText2.getBytes()); //Befehl "delete flash:config.text"
        
//        if (inStream.equals(inputText1)) //Input: "Are you sure you want to delete "flash:config.text" (y/n)?
//        {
        outStream.write(outputText4.getBytes()); //Befehl "yes"
        outStream.write(outputText3.getBytes()); //Befehl "delete flash:vlan.dat"
//        }
//        else if(inStream.equals(inputText2)) ////Input: "Are you sure you want to delete "flash:vlan.dat" (y/n)?"
//        {
        outStream.write(outputText4.getBytes()); //Befehl "yes"
        outStream.write(outputText6.getBytes()); //Befehl "boot"
        serialPort.closePort();
   }       
  
    
    //Konfigurationstemplate importieren
    public void importTemplate() throws Exception
    {   
        System.out.println("Aufspielen des Konfigurationstemplates beginnt in Kuerze!");
        
//        else if(inStream.equals(inputText3)) //Input: "Would you like to enter the initial configuration dialog? [yes/no]:"     
        outStream.write(outputText7.getBytes()); //Simulieren des Enter-Tastendrucks
        outStream.write(outputText5.getBytes()); //Befehl "no"
        outStream.write(outputText8.getBytes()); //Befehl "enable"
        outStream.write(outputText9.getBytes()); //Befehl "copy xmodem: running-config"
        outStream.write(outputText7.getBytes()); //Simulieren des Enter-Tastendrucks

        //xmodem einbinden, um das Konfigurationstemplate dem Switch zu senden
        // serialPort Is a serial port object
        Xmodem xmodem = new Xmodem(serialPort.getInputStream(),serialPort.getOutputStream());
        //Dateipfad des Konfigurationstemplate
        xmodem.send(filePath);
        
        outStream.write(outputText10.getBytes()); //Befehl "write"
    }
    

//    public int getListeningEvents()
//    {
//        // TODO Auto-generated method stub
//        return 0;
//    }
//
//    public void serialEvent(com.fazecast.jSerialComm.SerialPortEvent arg0)
//    {
//        // TODO Auto-generated method stub
//       
//    }
      
 
    
//Mögliche Erweiterungen:
  
//Verbindung trennen (Serial Port)
//    if (serialPort != null)
//    {
//        InputStream in = serialPort.getInputStream();
//        OutputStream out = serialPort.getOutputStream();
//        try
//        {
//
//            serialPort.removeDataListener();
//
//            in.close();
//            out.close();
//        }
//        catch (IOException ex)
//        {}
//        serialPort.closePort();
//    }

    
    //Text empfangen COM-Port
//    public void inputStream()
//    {
//        try
//        {
//            int availableBytes = inStream.available();
//            if (availableBytes >= 0)
//            {
//                // Read the serial port
//                inStream.read(readBuffer, 0, availableBytes);
//         
//                // Print it out
//                System.out.println(new String(readBuffer, 0, availableBytes));
//            }
//            else
//            {
//                 System.out.println("\nEs geht kein Input vom COM-Port ein!");
//            }
//        }
//        catch (IOException e)
//        {}
//    }
    
    
//    //Wenn Text vom COM-Port eingeht = Empfangenen Text ausgeben
//    public void inputStream(SerialPortEvent event)
//    {
//        switch (event.getEventType())
//        {
//            case SerialPortEvent.DATA_AVAILABLE:
//                inputStream();
//                break;
//        }
//    }
 
    
//    COM feststellen
//    public void ComPortIdentifier(String[] args) {
//        System.out.println("Program Started!!!");
//           
//        CommPortIdentifier serialPortId;
//       
//        @SuppressWarnings("rawtypes")
//        Enumeration enumComm;
//       
//        enumComm = CommPortIdentifier.getPortIdentifiers();
//       
//        while(enumComm.hasMoreElements())
//        {
//            serialPortId = (CommPortIdentifier)enumComm.nextElement();
//            if(serialPortId.getPortType() == CommPortIdentifier.PORT_SERIAL)
//            {
//                System.out.println(serialPortId.getName());
//            }
//        }
//       
//        System.out.println("Program Finished Sucessfully");
//    }
}

Alles klar, mir fällt gerade auf, dass ich die Abfrage vom InputStream gar nicht eingebaut habe, weil ich davor nicht wusste, wo genau ich die abfragen muss. :)

Also die Verbindung mit dem Switch und das Senden von Befehlen klappt ja an sich schon. Kann es ja an dem Serial Port Monitor sowie dem Switch selbst sehen (LEDs werden aktiv). Nur die Abfrage vom Input des Switches fehlt.

Danke für den "Zippen-Tipp". Bin noch relativ neu in Java und muss noch viel lernen. :)
 
G

Gelöschtes Mitglied 65862

Gast
Äh, das war eigentlich auf das Forum bezogen: Du kannst hier auch ZIP-Files anhängen :)


Bist Du sicher? Ich hätte hier RTS/CTS oder DTR/DSR erwartet.

Nachtrag: und ja, schmeiß die RXTX-Pakete raus.
Okay, dann weiß ich Bescheid. :)

Ne, bin mir ziemlich sicher, dass die Flusssteuerung deaktiviert sein muss. Hab ja bei der Arbeit schon einige Switche mithilfe von HyperTerminal bespielt und hier war nie eine Flusssteuerung aktiv.

Alles klar, mach ich dann gleich mal.

Kleiner Nachtrag:
Neuer Error:
 public void connect(String COM3) throws IOException
    {
        try
        {
            // Obtain a CommPortIdentifier object for the port you want to open
            //CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM3");
            SerialPort serialPort = SerialPort.getCommPorts()[0];

            if (serialPort.isOpen())
            {
                System.err.println("Error: Sie sind bereits mit dem COM3-Port verbunden!");
            }
            else
            {
                // Get the port's ownership
                serialPort.openPort();
                //serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 0, 0);
 
                // Set the parameters of the connection.
                setSerialPortParameters();
 
                // Open the input and output streams for the connection. If they won't
                // open, close the port before throwing an exception.
                outStream = serialPort.getOutputStream();
                inStream = serialPort.getInputStream();
            
                //EventListener
                serialPort.addDataListener(new SerialInput(inStream));
            
                // Hinweisen, wenn Daten vorhanden sind
                //serialPort.notifyOnDataAvailable(true);
                System.out.println("Verbindung zum COM3-Port hergestellt!\n");
            }
        }
        catch (IOException e)
        {
            serialPort.closePort();
            throw e;
        }
    }

Seitdem ich den Quellcode hier gestern an jSerialComm angepasst habe, wird mir nicht mehr der ursprüngliche Error "The read operation timed out before any data was returned." angezeigt, sondern dass der Port entweder geschlossen oder disconnected ist.
 
G

Gelöschtes Mitglied 65862

Gast
Entfern hier mal das SerialPort am Anfang. Du deklarierst hier eine lokale Variale, die somit die Instanzvariable versteckt. Das kann ein Problem sein.
Zunächst möchte ich mich entschuldigen, dass ich mich die letzten Tage nicht gemeldet habe. Hatte leider ziemlich viel um die Ohren.

Im Anschluss will ich mich für die Verbesserung oben bedanken. Somit wurde der Error behoben, sodass ich nun wieder beim Alten "The read operation timed out before any data was returned." angekommen bin :(

Flusskontrolle:
serialPort.setFlowControl(SerialPort.FLOW_CONTROL_DTR_ENABLED | SerialPort.FLOW_CONTROL_DSR_ENABLED);
Ich hab zur Sicherheit die Flusskontrolle natürlich nochmal angepasst und getestet, allerdings leider auch ohne Erfolg.

Ich würde es gerne nochmal mit dem InputStream versuchen und schauen, ob mir dieser hilft, die Signale vom Switch zu erhalten. Diesen habe ich ja in mein Skript zur Verbindungsherstellung mit dem Switch nicht eingebaut. Würdest Du sagen, dass es daran liegen kann, dass das "C" nicht erkannt wird?

Vielen Dank für die Hilfe :)
 
mihe7

mihe7

Top Contributor
Diesen habe ich ja in mein Skript zur Verbindungsherstellung mit dem Switch nicht eingebaut.
?!?

Du musst schauen, dass Du ein einfaches Beispiel (wie z. B. unter https://github.com/Fazecast/jSerial...am-and-OutputStream-Interfacing-Usage-Example) ans Laufen bekommst. Das kannst Du ja unabhängig von Deinem Code machen und dann darauf aufbauen. Evtl. musst Du das Beispiel noch um eine Ausgabe erweitern, damit Du was empfängst aber vom Grundsatz her sollte nicht mehr notwendig sein.
 
G

Gelöschtes Mitglied 65862

Gast
?!?

Du musst schauen, dass Du ein einfaches Beispiel (wie z. B. unter https://github.com/Fazecast/jSerial...am-and-OutputStream-Interfacing-Usage-Example) ans Laufen bekommst. Das kannst Du ja unabhängig von Deinem Code machen und dann darauf aufbauen. Evtl. musst Du das Beispiel noch um eine Ausgabe erweitern, damit Du was empfängst aber vom Grundsatz her sollte nicht mehr notwendig sein.
Code:
public void connect(String COM3) throws IOException
    {
        try
        {
            // Obtain a CommPortIdentifier object for the port you want to open
            //CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM3");
            serialPort = SerialPort.getCommPorts()[0];

            if (serialPort.isOpen())
            {
                System.err.println("Error: Sie sind bereits mit dem COM3-Port verbunden!");
            }
            else
            {
                // Get the port's ownership
                serialPort.openPort();
                serialPort.setComPortTimeouts(SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 0, 0);
 
                // Set the parameters of the connection.
                setSerialPortParameters();
 
                // Open the input and output streams for the connection. If they won't
                // open, close the port before throwing an exception.
                outStream = serialPort.getOutputStream();
                inStream = serialPort.getInputStream();
                try
                {
                   for (int j = 0; j < 1000; ++j)
                      System.out.print((char)inStream.read());
                   inStream.close();
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
           
                //EventListener
                serialPort.addDataListener(new SerialInput(inStream));
           
                // Hinweisen, wenn Daten vorhanden sind
                //serialPort.notifyOnDataAvailable(true);
                System.out.println("Verbindung zum COM3-Port hergestellt!\n");
            }
        }
        catch (IOException e)
        {
            serialPort.closePort();
            throw e;
        }
    }

Okay, hab gerade mal versucht den InputStream einzubauen. An sich hat der Quellcode funktioniert, nur leider "freezed" mein Programm, wenn ich die Verbindung zum Switch herstellen und die Bespielung starten will.

Im Anschluss habe ich es dann nochmal ohne den Input versucht und wie es ausschaut, wird der Inhalt des Konfigurationstemplates übermittelt. Nur wie man erkennen kann, wird das Template total durcheinander und mit Sonderzeichen importiert.
Ab einem Punkt wird der Inhalt der Datei dann in die Eingabezeilen eingefügt.
 
Zuletzt bearbeitet von einem Moderator:
mihe7

mihe7

Top Contributor
Okay, hab gerade mal versucht den InputStream einzubauen. An sich hat der Quellcode funktioniert, nur leider "freezed" mein Programm, wenn ich die Verbindung zum Switch herstellen und die Bespielung starten will.
D. h. die Verbindung hat geklappt, der Switch hat Dir irgendwas gesendet, was Dir auch auf dem Bildschirm ausgegeben wurde, dann hängt Dein Programm, weil es auf weitere Daten wartet, der Switch aber keine mehr sendet?

Zu der oben angefügten Config.txt: ist das die, die Du an den Switch übermittelst oder ist das die, die Du aus dem Switch erstellt hast?
 
mihe7

mihe7

Top Contributor
So, jetzt habe ich mal (quick & very dirty) den Spaß nachgebaut (s. Anhang). Ausgeführt werden muss die Klasse Test mit zwei Parametern: 1. der String des Com-Ports, 2. Name der zu sendenden Datei.

Getestet habe ich das unter Linux:
  1. Mit socat -d -d pty,raw,echo=0 pty,raw,echo=0 virtuelle Com-Ports eingerichtet, bei mir waren das /dev/pts/10 und /dev/pts/15.
  2. Empfänger mit rx -Xc test < /dev/pts/15 > /dev/pts/15 gestartet.
  3. Sender mit mvn compile exec:java -Dexec.mainClass=Test -Dexec.args="/dev/pts/10 pom.xml" gestartet (ich habe mal die pom.xml übertragen).
Ausgabe von rx:
Code:
rx: bereit zum Empfangen von test
Bytes empfangen:    1024   BPS:106                  

Übertragung abgeschlossen

Ausgabe des "Tools":
Code:
Starting xfer
01 01 fe 3c 70 72 6f 6a 65 63 74 20 78 6d 6c 6e
73 3d 22 68 74 74 70 3a 2f 2f 6d 61 76 65 6e 2e
61 70 61 63 68 65 2e 6f 72 67 2f 50 4f 4d 2f 34
2e 30 2e 30 22 20 78 6d 6c 6e 73 3a 78 73 69 3d
22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f
72 67 2f 32 30 30 31 2f 58 4d 4c 53 63 68 65 6d
61 2d 69 6e 73 74 61 6e 63 65 22 0a 20 20 20 20
20 20 20 20 20 78 73 69 3a 73 63 68 65 6d 61 4c
6f 63 61 83 4d
01 02 fd 74 69 6f 6e 3d 22 68 74 74 70 3a 2f 2f
6d 61 76 65 6e 2e 61 70 61 63 68 65 2e 6f 72 67
2f 50 4f 4d 2f 34 2e 30 2e 30 20 68 74 74 70 3a
2f 2f 6d 61 76 65 6e 2e 61 70 61 63 68 65 2e 6f
72 67 2f 78 73 64 2f 6d 61 76 65 6e 2d 34 2e 30
2e 30 2e 78 73 64 22 3e 0a 20 20 20 20 3c 6d 6f
64 65 6c 56 65 72 73 69 6f 6e 3e 34 2e 30 2e 30
3c 2f 6d 6f 64 65 6c 56 65 72 73 69 6f 6e 3e 0a
20 20 20 43 e5
01 03 fc 20 3c 67 72 6f 75 70 49 64 3e 6f 72 67
2e 6a 61 76 61 66 6f 72 75 6d 2e 6d 69 68 65 37
3c 2f 67 72 6f 75 70 49 64 3e 0a 20 20 20 20 3c
61 72 74 69 66 61 63 74 49 64 3e 78 6d 6f 64 65
6d 3c 2f 61 72 74 69 66 61 63 74 49 64 3e 0a 20
20 20 20 3c 76 65 72 73 69 6f 6e 3e 31 2e 30 2d
53 4e 41 50 53 48 4f 54 3c 2f 76 65 72 73 69 6f
6e 3e 0a 20 20 20 20 3c 70 61 63 6b 61 67 69 6e
67 3e 6a c0 0d
01 04 fb 61 72 3c 2f 70 61 63 6b 61 67 69 6e 67
3e 0a 20 20 20 20 3c 64 65 70 65 6e 64 65 6e 63
69 65 73 3e 0a 20 20 20 20 20 20 20 20 3c 64 65
70 65 6e 64 65 6e 63 79 3e 0a 20 20 20 20 20 20
20 20 20 20 3c 67 72 6f 75 70 49 64 3e 63 6f 6d
2e 66 61 7a 65 63 61 73 74 3c 2f 67 72 6f 75 70
49 64 3e 0a 20 20 20 20 20 20 20 20 20 20 3c 61
72 74 69 66 61 63 74 49 64 3e 6a 53 65 72 69 61
6c 43 6f 5f f4
01 05 fa 6d 6d 3c 2f 61 72 74 69 66 61 63 74 49
64 3e 0a 20 20 20 20 20 20 20 20 20 20 3c 76 65
72 73 69 6f 6e 3e 32 2e 36 2e 32 3c 2f 76 65 72
73 69 6f 6e 3e 0a 20 20 20 20 20 20 20 20 3c 2f
64 65 70 65 6e 64 65 6e 63 79 3e 0a 20 20 20 20
20 20 20 20 3c 64 65 70 65 6e 64 65 6e 63 79 3e
0a 20 20 20 20 20 20 20 20 20 20 3c 67 72 6f 75
70 49 64 3e 6a 75 6e 69 74 3c 2f 67 72 6f 75 70
49 64 3e d0 42
01 06 f9 0a 20 20 20 20 20 20 20 20 20 20 3c 61
72 74 69 66 61 63 74 49 64 3e 6a 75 6e 69 74 3c
2f 61 72 74 69 66 61 63 74 49 64 3e 0a 20 20 20
20 20 20 20 20 20 20 3c 76 65 72 73 69 6f 6e 3e
34 2e 31 32 3c 2f 76 65 72 73 69 6f 6e 3e 0a 20
20 20 20 20 20 20 20 20 20 3c 73 63 6f 70 65 3e
74 65 73 74 3c 2f 73 63 6f 70 65 3e 0a 20 20 20
20 20 20 20 20 3c 2f 64 65 70 65 6e 64 65 6e 63
79 3e 0a ec 71
01 07 f8 20 20 20 20 3c 2f 64 65 70 65 6e 64 65
6e 63 69 65 73 3e 0a 20 20 20 20 3c 70 72 6f 70
65 72 74 69 65 73 3e 0a 20 20 20 20 20 20 20 20
3c 6d 61 76 65 6e 2e 63 6f 6d 70 69 6c 65 72 2e
73 6f 75 72 63 65 3e 31 2e 38 3c 2f 6d 61 76 65
6e 2e 63 6f 6d 70 69 6c 65 72 2e 73 6f 75 72 63
65 3e 0a 20 20 20 20 20 20 20 20 3c 6d 61 76 65
6e 2e 63 6f 6d 70 69 6c 65 72 2e 74 61 72 67 65
74 3e 31 d7 97
01 08 f7 2e 38 3c 2f 6d 61 76 65 6e 2e 63 6f 6d
70 69 6c 65 72 2e 74 61 72 67 65 74 3e 0a 20 20
20 20 3c 2f 70 72 6f 70 65 72 74 69 65 73 3e 0a
3c 2f 70 72 6f 6a 65 63 74 3e 0a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 6f 3b
Done, sending EOT
Grob funktioniert das.
 

Anhänge

  • xmodem.zip
    4,2 KB · Aufrufe: 3
G

Gelöschtes Mitglied 65862

Gast
D. h. die Verbindung hat geklappt, der Switch hat Dir irgendwas gesendet, was Dir auch auf dem Bildschirm ausgegeben wurde, dann hängt Dein Programm, weil es auf weitere Daten wartet, der Switch aber keine mehr sendet?

Zu der oben angefügten Config.txt: ist das die, die Du an den Switch übermittelst oder ist das die, die Du aus dem Switch erstellt hast?
Naja, also sobald ich auf den Button Bespielung starten drücke, freezed das Programm sofort und der Button wird so angezeigt, als würde ich durchgehend darauf drücken. In dem Fall passiert nichts mehr... Keine Ausgabe gar nichts.

Zu der Config.txt: Was man in der Config sieht, ist das Template, was der Switch von meinem Programm zugesendet bekommt. Allerdings ist es wie bereits erwähnt total durcheinander und enthält Sonderzeichen, die eig. gar nicht da sein sollten. Zudem werden Abschnitte mehrfach ausgegeben, was ebenfalls nicht der Fall sein sollte.
 
G

Gelöschtes Mitglied 65862

Gast
So, jetzt habe ich mal (quick & very dirty) den Spaß nachgebaut (s. Anhang). Ausgeführt werden muss die Klasse Test mit zwei Parametern: 1. der String des Com-Ports, 2. Name der zu sendenden Datei.

Getestet habe ich das unter Linux:
  1. Mit socat -d -d pty,raw,echo=0 pty,raw,echo=0 virtuelle Com-Ports eingerichtet, bei mir waren das /dev/pts/10 und /dev/pts/15.
  2. Empfänger mit rx -Xc test < /dev/pts/15 > /dev/pts/15 gestartet.
  3. Sender mit mvn compile exec:java -Dexec.mainClass=Test -Dexec.args="/dev/pts/10 pom.xml" gestartet (ich habe mal die pom.xml übertragen).
Ausgabe von rx:
Code:
rx: bereit zum Empfangen von test
Bytes empfangen:    1024   BPS:106                 

Übertragung abgeschlossen

Ausgabe des "Tools":
Code:
Starting xfer
01 01 fe 3c 70 72 6f 6a 65 63 74 20 78 6d 6c 6e
73 3d 22 68 74 74 70 3a 2f 2f 6d 61 76 65 6e 2e
61 70 61 63 68 65 2e 6f 72 67 2f 50 4f 4d 2f 34
2e 30 2e 30 22 20 78 6d 6c 6e 73 3a 78 73 69 3d
22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f
72 67 2f 32 30 30 31 2f 58 4d 4c 53 63 68 65 6d
61 2d 69 6e 73 74 61 6e 63 65 22 0a 20 20 20 20
20 20 20 20 20 78 73 69 3a 73 63 68 65 6d 61 4c
6f 63 61 83 4d
01 02 fd 74 69 6f 6e 3d 22 68 74 74 70 3a 2f 2f
6d 61 76 65 6e 2e 61 70 61 63 68 65 2e 6f 72 67
2f 50 4f 4d 2f 34 2e 30 2e 30 20 68 74 74 70 3a
2f 2f 6d 61 76 65 6e 2e 61 70 61 63 68 65 2e 6f
72 67 2f 78 73 64 2f 6d 61 76 65 6e 2d 34 2e 30
2e 30 2e 78 73 64 22 3e 0a 20 20 20 20 3c 6d 6f
64 65 6c 56 65 72 73 69 6f 6e 3e 34 2e 30 2e 30
3c 2f 6d 6f 64 65 6c 56 65 72 73 69 6f 6e 3e 0a
20 20 20 43 e5
01 03 fc 20 3c 67 72 6f 75 70 49 64 3e 6f 72 67
2e 6a 61 76 61 66 6f 72 75 6d 2e 6d 69 68 65 37
3c 2f 67 72 6f 75 70 49 64 3e 0a 20 20 20 20 3c
61 72 74 69 66 61 63 74 49 64 3e 78 6d 6f 64 65
6d 3c 2f 61 72 74 69 66 61 63 74 49 64 3e 0a 20
20 20 20 3c 76 65 72 73 69 6f 6e 3e 31 2e 30 2d
53 4e 41 50 53 48 4f 54 3c 2f 76 65 72 73 69 6f
6e 3e 0a 20 20 20 20 3c 70 61 63 6b 61 67 69 6e
67 3e 6a c0 0d
01 04 fb 61 72 3c 2f 70 61 63 6b 61 67 69 6e 67
3e 0a 20 20 20 20 3c 64 65 70 65 6e 64 65 6e 63
69 65 73 3e 0a 20 20 20 20 20 20 20 20 3c 64 65
70 65 6e 64 65 6e 63 79 3e 0a 20 20 20 20 20 20
20 20 20 20 3c 67 72 6f 75 70 49 64 3e 63 6f 6d
2e 66 61 7a 65 63 61 73 74 3c 2f 67 72 6f 75 70
49 64 3e 0a 20 20 20 20 20 20 20 20 20 20 3c 61
72 74 69 66 61 63 74 49 64 3e 6a 53 65 72 69 61
6c 43 6f 5f f4
01 05 fa 6d 6d 3c 2f 61 72 74 69 66 61 63 74 49
64 3e 0a 20 20 20 20 20 20 20 20 20 20 3c 76 65
72 73 69 6f 6e 3e 32 2e 36 2e 32 3c 2f 76 65 72
73 69 6f 6e 3e 0a 20 20 20 20 20 20 20 20 3c 2f
64 65 70 65 6e 64 65 6e 63 79 3e 0a 20 20 20 20
20 20 20 20 3c 64 65 70 65 6e 64 65 6e 63 79 3e
0a 20 20 20 20 20 20 20 20 20 20 3c 67 72 6f 75
70 49 64 3e 6a 75 6e 69 74 3c 2f 67 72 6f 75 70
49 64 3e d0 42
01 06 f9 0a 20 20 20 20 20 20 20 20 20 20 3c 61
72 74 69 66 61 63 74 49 64 3e 6a 75 6e 69 74 3c
2f 61 72 74 69 66 61 63 74 49 64 3e 0a 20 20 20
20 20 20 20 20 20 20 3c 76 65 72 73 69 6f 6e 3e
34 2e 31 32 3c 2f 76 65 72 73 69 6f 6e 3e 0a 20
20 20 20 20 20 20 20 20 20 3c 73 63 6f 70 65 3e
74 65 73 74 3c 2f 73 63 6f 70 65 3e 0a 20 20 20
20 20 20 20 20 3c 2f 64 65 70 65 6e 64 65 6e 63
79 3e 0a ec 71
01 07 f8 20 20 20 20 3c 2f 64 65 70 65 6e 64 65
6e 63 69 65 73 3e 0a 20 20 20 20 3c 70 72 6f 70
65 72 74 69 65 73 3e 0a 20 20 20 20 20 20 20 20
3c 6d 61 76 65 6e 2e 63 6f 6d 70 69 6c 65 72 2e
73 6f 75 72 63 65 3e 31 2e 38 3c 2f 6d 61 76 65
6e 2e 63 6f 6d 70 69 6c 65 72 2e 73 6f 75 72 63
65 3e 0a 20 20 20 20 20 20 20 20 3c 6d 61 76 65
6e 2e 63 6f 6d 70 69 6c 65 72 2e 74 61 72 67 65
74 3e 31 d7 97
01 08 f7 2e 38 3c 2f 6d 61 76 65 6e 2e 63 6f 6d
70 69 6c 65 72 2e 74 61 72 67 65 74 3e 0a 20 20
20 20 3c 2f 70 72 6f 70 65 72 74 69 65 73 3e 0a
3c 2f 70 72 6f 6a 65 63 74 3e 0a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 6f 3b
Done, sending EOT
Grob funktioniert das.
Alles klar, ich schau mir das gleich mal an.

Vielen Dank für die enorme Hilf :)
 
G

Gelöschtes Mitglied 65862

Gast
So, jetzt habe ich mal (quick & very dirty) den Spaß nachgebaut (s. Anhang). Ausgeführt werden muss die Klasse Test mit zwei Parametern: 1. der String des Com-Ports, 2. Name der zu sendenden Datei.

Getestet habe ich das unter Linux:
  1. Mit socat -d -d pty,raw,echo=0 pty,raw,echo=0 virtuelle Com-Ports eingerichtet, bei mir waren das /dev/pts/10 und /dev/pts/15.
  2. Empfänger mit rx -Xc test < /dev/pts/15 > /dev/pts/15 gestartet.
  3. Sender mit mvn compile exec:java -Dexec.mainClass=Test -Dexec.args="/dev/pts/10 pom.xml" gestartet (ich habe mal die pom.xml übertragen).
Ausgabe von rx:
Code:
rx: bereit zum Empfangen von test
Bytes empfangen:    1024   BPS:106                 

Übertragung abgeschlossen

Ausgabe des "Tools":
Code:
Starting xfer
01 01 fe 3c 70 72 6f 6a 65 63 74 20 78 6d 6c 6e
73 3d 22 68 74 74 70 3a 2f 2f 6d 61 76 65 6e 2e
61 70 61 63 68 65 2e 6f 72 67 2f 50 4f 4d 2f 34
2e 30 2e 30 22 20 78 6d 6c 6e 73 3a 78 73 69 3d
22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 2e 6f
72 67 2f 32 30 30 31 2f 58 4d 4c 53 63 68 65 6d
61 2d 69 6e 73 74 61 6e 63 65 22 0a 20 20 20 20
20 20 20 20 20 78 73 69 3a 73 63 68 65 6d 61 4c
6f 63 61 83 4d
01 02 fd 74 69 6f 6e 3d 22 68 74 74 70 3a 2f 2f
6d 61 76 65 6e 2e 61 70 61 63 68 65 2e 6f 72 67
2f 50 4f 4d 2f 34 2e 30 2e 30 20 68 74 74 70 3a
2f 2f 6d 61 76 65 6e 2e 61 70 61 63 68 65 2e 6f
72 67 2f 78 73 64 2f 6d 61 76 65 6e 2d 34 2e 30
2e 30 2e 78 73 64 22 3e 0a 20 20 20 20 3c 6d 6f
64 65 6c 56 65 72 73 69 6f 6e 3e 34 2e 30 2e 30
3c 2f 6d 6f 64 65 6c 56 65 72 73 69 6f 6e 3e 0a
20 20 20 43 e5
01 03 fc 20 3c 67 72 6f 75 70 49 64 3e 6f 72 67
2e 6a 61 76 61 66 6f 72 75 6d 2e 6d 69 68 65 37
3c 2f 67 72 6f 75 70 49 64 3e 0a 20 20 20 20 3c
61 72 74 69 66 61 63 74 49 64 3e 78 6d 6f 64 65
6d 3c 2f 61 72 74 69 66 61 63 74 49 64 3e 0a 20
20 20 20 3c 76 65 72 73 69 6f 6e 3e 31 2e 30 2d
53 4e 41 50 53 48 4f 54 3c 2f 76 65 72 73 69 6f
6e 3e 0a 20 20 20 20 3c 70 61 63 6b 61 67 69 6e
67 3e 6a c0 0d
01 04 fb 61 72 3c 2f 70 61 63 6b 61 67 69 6e 67
3e 0a 20 20 20 20 3c 64 65 70 65 6e 64 65 6e 63
69 65 73 3e 0a 20 20 20 20 20 20 20 20 3c 64 65
70 65 6e 64 65 6e 63 79 3e 0a 20 20 20 20 20 20
20 20 20 20 3c 67 72 6f 75 70 49 64 3e 63 6f 6d
2e 66 61 7a 65 63 61 73 74 3c 2f 67 72 6f 75 70
49 64 3e 0a 20 20 20 20 20 20 20 20 20 20 3c 61
72 74 69 66 61 63 74 49 64 3e 6a 53 65 72 69 61
6c 43 6f 5f f4
01 05 fa 6d 6d 3c 2f 61 72 74 69 66 61 63 74 49
64 3e 0a 20 20 20 20 20 20 20 20 20 20 3c 76 65
72 73 69 6f 6e 3e 32 2e 36 2e 32 3c 2f 76 65 72
73 69 6f 6e 3e 0a 20 20 20 20 20 20 20 20 3c 2f
64 65 70 65 6e 64 65 6e 63 79 3e 0a 20 20 20 20
20 20 20 20 3c 64 65 70 65 6e 64 65 6e 63 79 3e
0a 20 20 20 20 20 20 20 20 20 20 3c 67 72 6f 75
70 49 64 3e 6a 75 6e 69 74 3c 2f 67 72 6f 75 70
49 64 3e d0 42
01 06 f9 0a 20 20 20 20 20 20 20 20 20 20 3c 61
72 74 69 66 61 63 74 49 64 3e 6a 75 6e 69 74 3c
2f 61 72 74 69 66 61 63 74 49 64 3e 0a 20 20 20
20 20 20 20 20 20 20 3c 76 65 72 73 69 6f 6e 3e
34 2e 31 32 3c 2f 76 65 72 73 69 6f 6e 3e 0a 20
20 20 20 20 20 20 20 20 20 3c 73 63 6f 70 65 3e
74 65 73 74 3c 2f 73 63 6f 70 65 3e 0a 20 20 20
20 20 20 20 20 3c 2f 64 65 70 65 6e 64 65 6e 63
79 3e 0a ec 71
01 07 f8 20 20 20 20 3c 2f 64 65 70 65 6e 64 65
6e 63 69 65 73 3e 0a 20 20 20 20 3c 70 72 6f 70
65 72 74 69 65 73 3e 0a 20 20 20 20 20 20 20 20
3c 6d 61 76 65 6e 2e 63 6f 6d 70 69 6c 65 72 2e
73 6f 75 72 63 65 3e 31 2e 38 3c 2f 6d 61 76 65
6e 2e 63 6f 6d 70 69 6c 65 72 2e 73 6f 75 72 63
65 3e 0a 20 20 20 20 20 20 20 20 3c 6d 61 76 65
6e 2e 63 6f 6d 70 69 6c 65 72 2e 74 61 72 67 65
74 3e 31 d7 97
01 08 f7 2e 38 3c 2f 6d 61 76 65 6e 2e 63 6f 6d
70 69 6c 65 72 2e 74 61 72 67 65 74 3e 0a 20 20
20 20 3c 2f 70 72 6f 70 65 72 74 69 65 73 3e 0a
3c 2f 70 72 6f 6a 65 63 74 3e 0a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a 1a
1a 1a 1a 6f 3b
Done, sending EOT
Grob funktioniert das.

Ich hab mir Deinen Code gerade mal angeschaut und zum Teil schonmal verstanden. Allerdings verstehe ich die Funktion eines Abschnitts nicht ganz. Kannst Du mir den vlt. etwas genauer erklären? :)

Abschnitt:
private void send(byte[] buf, int block) throws IOException {
        if (buf == null) {
            System.out.printf("Done, sending EOT\n");
            out.write(EOT);
            state = EOF;
        } else {
            byte[] nbuf = new byte[buf.length+5];
            nbuf[0] = SOH;
            nbuf[1] = (byte) block;
            nbuf[2] = (byte) ~nbuf[1];
            System.arraycopy(buf, 0, nbuf, 3, buf.length);
            CRC16 crc = new CRC16().update(buf);
            nbuf[nbuf.length-2] = crc.hiByte();
            nbuf[nbuf.length-1] = crc.loByte();
            out.write(nbuf);
            out.flush();

            for (int i = 0; i < nbuf.length; i++) {
                System.out.printf("%02x ", nbuf[i]);
                if ((i+1) % 16 == 0) {
                    System.out.println();
                }
            }
            System.out.println();

            state = SENDING;
        }
    }

Der erste Teil ist soweit klar.
Sobald die zu sendenden Daten gleich null sind (keine mehr vorliegen), wird "Done" ausgegeben. Nun verstehe ich nur die Else-Verzweigung nicht. :)
 
mihe7

mihe7

Top Contributor
Zeilen 7 bis 14 erstellen ein byte-Array, das alles enthält, was zu senden ist: SOH, Blocknummer, Komplement der Blocknummer, die 128-Bytes Daten und die CRC-Prüfsumme. Mit 15/16 wird der Spaß rausgeschrieben (gesendet). 18 bis 24 dient einfach der Hex-Ausagabe der gesendeten Daten, wie Du sie in Kommentar #21 siehst.
 
G

Gelöschtes Mitglied 65862

Gast
Ach, und noch was: es wird vor allem ein EOT gesendet :)
Okay, ich hab es gerade nochmal versucht und aktuell würde ich sagen, dass die Config durch ist. Ich hab den Switch nochmal per HyperTerminal gebootet und wie man auf dem Screenshot sieht, hat er jetzt den Namen, der in der Textdatei (dem Konfigurationstemplate) hinterlegt war.

1615636035382.png


Allerdings muss ich das ganze natürlich nochmal genauer mit einem Kollegen testen.

Weiterhin sind mir zwei Unstimmigkeiten aufgefallen.

Ich habe mich mal von deinem Code inspirieren lassen und den genutzt. :) Starte ich nun die Grundkonfiguration des Switches, werden mir die abgearbeiteten Schritte des Switches nicht mehr in Klartext, sondern in, ich tippe mal ASCII-Code, dargestellt.

Vorher:
Base ethernet MAC Address : BC:C4:93:8E:6F:00
Motherboard assembly number : 73-15620-01
Power supply part number : 341-0097-03
Motherboard serial number : FOC191340W7
Power supply serial number : DCA190783C7
Model revision number : B0
Motherboard revision number : B0
Model number : WS-C2960+24TC-L
System serial number : FOC1914S2YG
Top Assembly Part Number : 800-40261-01
Top Assembly Revision Number : B0
Version ID : V01
CLEI Code Number : CMMKV00ARA
Hardware Board Revision Number : 0x0B


Switch Ports Model SW Version SW Image
------ ----- ----- ---------- ----------
* 1 26 WS-C2960+24TC-L 15.0(2)SE7 C2960-LANBASEK9-M

Nachher:
xxøø€øø€øx€ø.€øx.€xx.€x.xø€øø€x.xø€ø€.€.xøøø€€ø.øøxøø€xx€øø.ø.€x€øx€øxøøøøø€€øxø.€.xøx€øø€ø.øøø€ø.€€ø€.€€.øx€øø€øxøø€øøx.€x.xø€øø€x.xø€ø€.€.xøøø€€ø.øøxøø€xx€øø.ø.€x€øx€øxøøøøø€€øxø.€.xøx€øø€ø.øøø€ø.€€ø€.€x.ø€øø.€ø.x.€ø€x.øøxø.øøxøøø€ø.€.xxøø€øø€øx€ø.€øx.€xx.€x.xø€øø€x.xø€ø€.€ø.ø.xxxø.€x€øx€øø.ø.€xøø€øø.øøx€ø€€ø€€øxøø.øx€ø.€.€øøøøøøø.ø€.øxøø.øøxø.€.xøx€øø€ø.øøø€ø.€€ø€.€€.øx€øø€øxøø€øøx.€x.xø€øø€x.xø€ø€.€ø.ø.xxxø.€x€øx€øø.ø.€xøø€øø.øøx€ø€€ø€€øxøø.øx€ø.

Zudem ist es so, dass das Senden der Config-Datei beim ersten Mal zu viele Trys benötigt. Starte ich die Übertragung dann erneut, startet diese nach dem vierten Try erfolgreich.

Edit: Zudem werden beim Sendevorgang der Config zur Zeit immer noch Sonderzeichen hinzugefügt, wie ich es bereits in einer vorherigen Antwort erwähnt habe. Aus dem Grund gehe ich natürlich aktuell davon aus, dass der Switch mit dieser Config nicht funktionieren wird.

Aus diesem Grund wollte ich mal fragen, ob du vlt. weißt, woran beide "Probleme" liegen können.
Diesmal hab ich die Klassen natürlich als .zip mit angehangen. :)

Und ich möchte Dir erneut vielmals für deine starke Hilfe danken. :)
 

Anhänge

  • Projekt-Backup.zip
    8,9 KB · Aufrufe: 0
Zuletzt bearbeitet von einem Moderator:
mihe7

mihe7

Top Contributor
Ich habe mich mal von deinem Code inspirieren lassen und den genutzt. :) Starte ich nun die Grundkonfiguration des Switches, werden mir die abgearbeiteten Schritte des Switches nicht mehr in Klartext, sondern in, ich tippe mal ASCII-Code, dargestellt.
Ich wiederhole mich: ich habe das wirklich nur auf die Schnelle zusammengeschustert, das ist kein guter Code :)

Klartext wäre ASCII-Code. Evtl. erwartet der Switch am Dateiende ein anderes Zeichen? Du kannst ja mal z. B. mit EOT oder NUL auffüllen.

Zudem ist es so, dass das Senden der Config-Datei beim ersten Mal zu viele Trys benötigt.
Mit welcher Begründung? Timeout?

Wenn ich drandenke, schau ich später mal in den Code rein.
 
G

Gelöschtes Mitglied 65862

Gast
Ich wiederhole mich: ich habe das wirklich nur auf die Schnelle zusammengeschustert, das ist kein guter Code :)

Klartext wäre ASCII-Code. Evtl. erwartet der Switch am Dateiende ein anderes Zeichen? Du kannst ja mal z. B. mit EOT oder NUL auffüllen.


Mit welcher Begründung? Timeout?

Wenn ich drandenke, schau ich später mal in den Code rein.
Tut mir Leid, dass es etwas ruhig war, aber ich hatte in den letzten Tagen einige Prüfungen.

Es wird nicht genau gesagt, warum zu viele Trys benötigt werden. Es wird immer nur zum 10. Try gezählt und dann bleibt es dabei. Es wird kein Fehler angezeigt.

Code_Abschnitt:
 private int receive() throws IOException {
            int tries = 20;
            while (tries > 0 && in.available() <= 0) {
                tries--;
                sleep(100);
            }
            if (in.available() > 0) {
                in.skip(in.available()-1);
                return in.read();
            }
            return -1;
        }
Ich hab zum testen die Anzahl der Tries mal von 10 auf 20 erhöht und bei dem darauffolgenden Test ist die Übertragung erst beim 16 Versuch gestartet. Also wie man sieht variiert die Anzahl der Tries immer wieder. :)

Viele Grüße
 
mihe7

mihe7

Top Contributor
Ach, an der Stelle. Ja, das kann durchaus sein. Ich weiß jetzt nicht genau, ob und welches Timeout in Xmodem vorgesehen ist, aber ich meine etwas von 10 s im Kopf zu haben. Das habe ich nur eingebaut, damit die Methode überhaupt wieder verlassen wird, wenn nichts ankommt - theoretisch kannst Du auch einfach blockierend lesen.
 
G

Gelöschtes Mitglied 65862

Gast
Ach, an der Stelle. Ja, das kann durchaus sein. Ich weiß jetzt nicht genau, ob und welches Timeout in Xmodem vorgesehen ist, aber ich meine etwas von 10 s im Kopf zu haben. Das habe ich nur eingebaut, damit die Methode überhaupt wieder verlassen wird, wenn nichts ankommt - theoretisch kannst Du auch einfach blockierend lesen.
Alles klar. Ich belasse die Trys einfach mal bei 20, weil der InputStream sowieso meistens zwischen Try 15 und 20 startet.

Leider konnte ich noch nicht genau herausfinden, warum die Grundkonfiguration nicht mehr im Klartext angezeigt wird, sondern nur noch in Sonderzeichen. Sry, dass ich da nochmal nachfrage, aber weißt Du vlt., woran das liegen kann? :)

Viele Grüße
 
mihe7

mihe7

Top Contributor
Keine Ahnung, evtl. irgendwas in den vielen Versuchen zerschossen? Kannst Du das durch einen erneuen Upload via z. B. Hyper Terminal beheben?
 
G

Gelöschtes Mitglied 65862

Gast
Keine Ahnung, evtl. irgendwas in den vielen Versuchen zerschossen? Kannst Du das durch einen erneuen Upload via z. B. Hyper Terminal beheben?
Ich glaube da gab es ein Missverständnis. Es ist so, dass ich den InputStream vom Switch, den ich mir mit einem SerialPort Reader anzeigen lasse, nicht mehr im Klartext angezeigt bekomme. Der Rest
 
G

Gelöschtes Mitglied 65862

Gast
Ach, so. Filtere halt mal alle Steuerzeichen raus.
Okay, also wie es scheint funktioniert nun alles. Ich dank dir für die ganze Hilfe Mihe :)

Ich hätte zum gleichen Projekt noch eine andere Frage. Kann ich die hier stellen oder soll ich dafür ein eigenes Thema erstellen?

Viele Grüße
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Datei kodiert zu Webservice senden Allgemeine Java-Themen 9
P Bat Datei in Java ausführen Allgemeine Java-Themen 2
S Verwendet Programmiersprache aus Quellcode - Datei ermitteln Allgemeine Java-Themen 6
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Jar-Datei ausführen Allgemeine Java-Themen 7
C Outlook msg-Datei Anhänge extrahieren Allgemeine Java-Themen 2
G Datei aus Ordner wählen, ohne den Dateinamen im Pfad angeben zu müssen Allgemeine Java-Themen 4
C Wav-Datei aus Jar laden? Allgemeine Java-Themen 11
L Best Practice Zip Datei aktualisieren Allgemeine Java-Themen 1
N Speicherort einer Datei im Explorer ändern Allgemeine Java-Themen 8
H Mehrere PNG-Files in einer Datei Allgemeine Java-Themen 9
Gaudimagspam CSV-Datei auslesen in Java Allgemeine Java-Themen 7
S createTempFile erstellt keine temporäre Datei Allgemeine Java-Themen 13
Hatsi09 Jar datei ausführen verursacht NumberFormatException Allgemeine Java-Themen 9
kodela bestimmten Dateityp immer mit jar-Datei öffnen Allgemeine Java-Themen 17
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
B .txt Datei erstellen und auslesen bzw. schreiben Allgemeine Java-Themen 6
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Dann07 MP3 Datei abspielen funktioniert nicht Allgemeine Java-Themen 6
H ArrayListe in CSV Datei speichern Allgemeine Java-Themen 6
O Aus JAR-Datei erstellte EXE-Datei funktioniert nicht Allgemeine Java-Themen 10
N Txt Datei auslesen. Allgemeine Java-Themen 5
B Datei/Ordner auf Server zugreifen/erstellen Allgemeine Java-Themen 2
M Datei verschieben hat einen Fehler?? Allgemeine Java-Themen 20
M Erstellungsdatum einer Datei Allgemeine Java-Themen 10
O xlsx Datei auslesen mit POI Apache liest keine LEERZELLEN Allgemeine Java-Themen 6
P Input/Output entfernte Datei mit Java öffnen ohne Download Allgemeine Java-Themen 5
O xlsx Datei auslesen mit POI von Apache wirft seltsamen Fehler. Allgemeine Java-Themen 11
J Hilfe, Jar Datei kann nicht ausgeführt werden Allgemeine Java-Themen 2
M Programm erkennt String aus .txt Datei nicht Allgemeine Java-Themen 3
O Java-Applikation tut in Netbeans, als JAR nicht, wegen Pfadangaben einer benötigten Datei Allgemeine Java-Themen 8
J Fehlermeldung bei Ausführung von .jar-Datei Allgemeine Java-Themen 9
J Die Letzte Zahl aus einer Text datei lesen Allgemeine Java-Themen 8
Elyt Compiler-Fehler Datei kann nicht erstellt werden. Die Syntax für den Dateinamen etc. ist falsch. Allgemeine Java-Themen 2
M Probleme jar datei. Allgemeine Java-Themen 2
F Datei in String-Array einlesen Allgemeine Java-Themen 8
O docx-Datei erzeugung mit DocXStamper funktioniert nicht Allgemeine Java-Themen 2
T Objekt mit String und Int aus TxT Datei erstellen Allgemeine Java-Themen 23
Bluedaishi Prüfen ob Datei noch geöffnet ist Allgemeine Java-Themen 59
I Temp-Datei wird nicht gelöscht Allgemeine Java-Themen 12
D ODS.Datei öffnet leider in Excel Allgemeine Java-Themen 3
L JavaFX JavaFX Chart in Apache Poi Excel Datei Allgemeine Java-Themen 2
D .txt Datei in .jar Datei speichern Allgemeine Java-Themen 3
ralfb1105 Blöcke aus Datei filtern/suchen und in neue Datei schreiben Allgemeine Java-Themen 10
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
L SQL Datei in Eclipse erstellen Allgemeine Java-Themen 3
Drachenbauer Wie sorge ich dafür, dass mein Spiel die ini-Datei in der Resourcen-ordner des Projektes schreibt? Allgemeine Java-Themen 5
Trèfle Excel-Datei nicht speicherbar, da von Java zum Bearbeiten gesperrt. Allgemeine Java-Themen 3
N Datei Zeilenweise Einlesen, Versteckte Zeichen Allgemeine Java-Themen 5
L Excel Datei löscht sich selbst im Programm - Java Allgemeine Java-Themen 3
K Workupload datei mit Java Downloaden Allgemeine Java-Themen 6
H .jar Datei startet nicht richtig bei Doppelklick Allgemeine Java-Themen 11
S Hilfe bei dem Auslesen einer YAML Datei Allgemeine Java-Themen 8
M Java Eclipse- Datei exportieren Allgemeine Java-Themen 5
R jar-Datei funktioniert nicht Allgemeine Java-Themen 2
R .txt Datei einlesen und auf der Konsole ausgeben lassen Allgemeine Java-Themen 11
T Jar Datei nicht ausführbar Allgemeine Java-Themen 6
H jar-Datei mit java.exe anstatt mit javaw.exe ausführen Allgemeine Java-Themen 9
S Datei wird nicht gefunden Thread.currentThread().getContextClassLoader().getResourceAsStream() Allgemeine Java-Themen 1
A Steuerung von Spiel aus Datei lesen Allgemeine Java-Themen 0
Javafan01 .sh datei in Java ausführen Allgemeine Java-Themen 1
M Speichern von Programmeinstellungen in Datei Allgemeine Java-Themen 7
J Ordner und Datei Struktur einer War Datei Allgemeine Java-Themen 1
J XML Datei mit installiertem Programm öffnen Allgemeine Java-Themen 7
L Weg um Datei zuzuordnen? Allgemeine Java-Themen 3
M Datei kann nicht umbenannt oder verschoben werden ?? Allgemeine Java-Themen 17
S Input/Output Beste Möglichkeit einen String in einen Datei zu Schreiben Allgemeine Java-Themen 2
K Erste Schritte Start einer JAR Datei 2 Wege aber einmal nicht die volle Funktionlität Allgemeine Java-Themen 20
J Datei löschen, die Leerzeichen im Pfad hat Allgemeine Java-Themen 5
Aruetiise " in Datei schreiben Allgemeine Java-Themen 2
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
S Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft. Allgemeine Java-Themen 24
The Pi NetBeans Bilder in Jar Datei werden nicht angezeigt Allgemeine Java-Themen 7
RalleYTN Audiolänge einer MP3 Datei erhalten ohne diese vollständig zu laden Allgemeine Java-Themen 15
H Jar-Datei öffnet nur teilweise Allgemeine Java-Themen 2
I Datei zugriffe erkennen Allgemeine Java-Themen 25
G Java Datei öffnen Allgemeine Java-Themen 9
E Datei-Informationen Allgemeine Java-Themen 12
K JAR Datei Corrupt nach Kopieren Allgemeine Java-Themen 4
Arif Input/Output Serialisierung - Datei wird nicht erzeugt Allgemeine Java-Themen 3
H .Sh Datei ausführen programmieren Allgemeine Java-Themen 5
J Input/Output Word Datei einlesen, verarbeiten und abspeichern Allgemeine Java-Themen 3
N ZIp datei direkt im eclipse speichern Allgemeine Java-Themen 4
K jar-Datei lässt sich unter Windows nicht verwenden Allgemeine Java-Themen 3
N Das Ende von bestimmten zeilen in text datei ändern und speichern Allgemeine Java-Themen 3
T Drucken einer PDF Datei Allgemeine Java-Themen 4
B Input/Output Datei ändern Allgemeine Java-Themen 9
L Bilder innerhalb der JAR Datei Allgemeine Java-Themen 2
X Mehrere booleans in Datei Speichern, Updaten und Laden Allgemeine Java-Themen 1
J Aus mehreren Klassen ein Datei ausführbare machen Allgemeine Java-Themen 6
T Ant Jar Datei per Ant in Eclipse erstellen Allgemeine Java-Themen 2
T Url aus txt Datei auslesen und öffnen? Allgemeine Java-Themen 4
C Ausführen einer .JAR Datei Allgemeine Java-Themen 5
M XML-Datei "erweitern" mit Java Allgemeine Java-Themen 2
J Batch datei öffnen und als Admin ausführen Allgemeine Java-Themen 43
F String in OpenOffice Ods datei abspeichern? Allgemeine Java-Themen 8
T Datei öffnen mit eigener Applikation.exe Allgemeine Java-Themen 4
JavaWolf165 Externe .jar-Dateien in .jar-Datei intigrieren Allgemeine Java-Themen 0
JG12111989 FileInputStream - Breite einer bmp-Datei?? Allgemeine Java-Themen 8
Meeresgott Input/Output OutputStream löscht Datei Allgemeine Java-Themen 7

Ähnliche Java Themen


Oben