Avatar billede pentium Nybegynder
18. august 2005 - 16:04 Der er 4 kommentarer og
1 løsning

Java RS232 Problem

Hej

Jeg har en atmel processer, som måler en temp. Denne atmel er forbundet vil et RS232 kabel til en pc, hvor på jeg har et java program som læser de værdier som atmellen sender ud på RS232.

Efter ca. 3 min. går mit java program meget langsom. Den bruger ikke CPU eller RAM. Hvis der kommer en svingning på min temp føler, er det ligesom at de værdier jeg får på min RS232, bliver lagt i kø, og kommer ind til mit  program, men meget langsomt.


    while (portList.hasMoreElements()) {
      portId = (CommPortIdentifier) portList.nextElement();
    if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        if (portId.getName().equals(ComPort.trim())) {
          LogFil.SkrivLog("ComPort :" + ComPort.trim());
          break;
        }
      }
    }

    try {
      serialPort = (SerialPort) portId.open("Sun Control Klient", 2000);
    }
    catch (PortInUseException ex1) {
      LogFil.SkrivLog("SerialPort Exception: " + ex1);
    }
    try
      inputStream = serialPort.getInputStream();
      in = new BufferedReader(new InputStreamReader(inputStream));

    }
    catch (IOException ex2) {
      LogFil.SkrivLog("IOException: " + ex2);
    }
    try {
      serialPort.addEventListener(this);
    }
    catch (TooManyListenersException e3) {
      LogFil.SkrivLog("serialPort - TooManyListenersException" + e3);
    }
    serialPort.notifyOnDataAvailable(true);
    try {
      serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
                                    SerialPort.STOPBITS_1,
                                    SerialPort.PARITY_EVEN);
    }
    catch (UnsupportedCommOperationException e) {}
  }

  public void serialEvent(SerialPortEvent event) {
    switch (event.getEventType()) {
      case SerialPortEvent.BI:
      case SerialPortEvent.OE:
      case SerialPortEvent.FE:
      case SerialPortEvent.PE:
      case SerialPortEvent.CD:
      case SerialPortEvent.CTS:
      case SerialPortEvent.DSR:
      case SerialPortEvent.RI:

      case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
        break;
      case SerialPortEvent.DATA_AVAILABLE:

        Date time = new Date();
        DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
        DateFormat df2 = new SimpleDateFormat("HH-mm-ss");

        try {
          in2 = in.readLine();

        }
        catch (IOException ex4) {
          LogFil.SkrivLog("IOException: " + ex4);
        }
        Index = in2.indexOf("A");
        a = in2.substring(Index, Index + 5) + "\n";
        out.println(a);
        LogFil.SkrivLog("Modtaget og Sendt Data Fra Kit Til Server: \n" +
                        a.trim() + " - " + "Dato: " + df1.format(time) + " - " +
                        "Tid: " + df2.format(time));
        if (a.trim().equals("A-5")) {
          LogFil.SkrivLog("Fejl På Sensor nr. 1: \n" + a.trim() + " - " +
                          "Dato: " + df1.format(time) + " - " + "Tid: " +
                          df2.format(time));
        }
        Index = in2.indexOf("B");
        b = in2.substring(Index, Index + 5) + "\n";
        out.println(b);
        LogFil.SkrivLog("Modtaget og Sendt Data Fra Kit Til Server: \n" +
                        b.trim() + " - " + "Dato: " + df1.format(time) + " - " +
                        "Tid: " + df2.format(time));
        if (b.trim().equals("B-5")) {
          LogFil.SkrivLog("Fejl På Sensor nr. 2: \n" + a.trim() + " - " +
                          "Dato: " + df1.format(time) + " - " + "Tid: " +
                          df2.format(time));
        }
        Index = in2.indexOf("C");
        c = in2.substring(Index, Index + 4) + "\n";
        out.println(c);
        LogFil.SkrivLog("Modtaget og Sendt Data Fra Kit Til Server: \n" +
                        c.trim() + "  - " + "Dato: " + df1.format(time) +
                        " - " + "Tid: " + df2.format(time));
        if (c.trim().equals("C0")) {
          LogFil.SkrivLog("FAN Værdi er    \n: " + c.trim() + "  - " +
                          "Dato: " + df1.format(time) + " - " + "Tid: " +
                          df2.format(time));
          LogFil.SkrivLog("FAN Står Stille");
          LogFil.SkrivLog("---------------------------------------------------------------------------------------------");
        }
        try {
          Class.forName("com.mysql.jdbc.Driver");
        }
        catch (ClassNotFoundException ex1) {
          LogFil.SkrivLog("ClassNotFoundException: " +
                          "Class.forName(com.mysql.jdbc.Driver)" + ex1);
        }
        try {
          forb = (Connection) DriverManager.getConnection("jdbc:mysql://" +
              ServerIP.trim() +
              ":" + SqlPort.trim() + "/" + DatabaseNavn.trim(),
              SqlBrugerNavn.trim(), SqlPassword.trim());
          LogFil.SkrivLog("MySql forbindelse Oprettet Til : " +
                          DatabaseNavn.trim() + " - " + "Dato: " +
                          df1.format(time) + " - " + "Tid: " + df2.format(time));
        }
        catch (SQLException ex2) {
          LogFil.SkrivLog("------------------------------------------------------------------------------------------");
          LogFil.SkrivLog("SQLException: " + ex2);
          LogFil.SkrivLog("------------------------------------------------------------------------------------------");
        }
        Statement stmt = null;

        try {
          stmt = forb.createStatement();
        }
        catch (SQLException ex4) {
          LogFil.SkrivLog("SQLException: " + ex4);
        }
        try {
          rs = stmt.executeQuery("select * from fan");
          while (rs.next()) {
            fanrpm = rs.getString("rpm");
          }
        }
        catch (SQLException ex5) {
        }

        try {
          outputStream = serialPort.getOutputStream();
        }
        catch (IOException ex) {
        }
        messageString = fanrpm;
        LogFil.SkrivLog("Blæser Værdi : " + fanrpm + " Sendt til Kit" + " - " +
                        "Dato: " + df1.format(time) + " - " + "Tid: " +
                        df2.format(time));
        try {
          outputStream.write(messageString.getBytes());
          try {
            forb.close();
            LogFil.SkrivLog("------------------------------------------------------------------------------------------");
            LogFil.SkrivLog("MySql forbindelse Lukket :" + " - " + "Dato: " +
                            df1.format(time) + " - " + "Tid: " +
                            df2.format(time));
            LogFil.SkrivLog("------------------------------------------------------------------------------------------");
          }
          catch (SQLException ex6) {
            LogFil.SkrivLog("------------------------------------------------------------------------------------------");
            LogFil.SkrivLog("SQLException: " + ex6);
            LogFil.SkrivLog("------------------------------------------------------------------------------------------");
          }
        }
        catch (IOException ex3) {
          LogFil.SkrivLog("------------------------------------------------------------------------------------------");
          LogFil.SkrivLog("IOException" + ex3);
          LogFil.SkrivLog("------------------------------------------------------------------------------------------");
        }

    }
  }
  public void run() {
    while (true) {
      try {
        Thread.sleep(20000);
      }
      catch (InterruptedException ex) {
      }
    }

  }

}

Hvad kan jeg gøre, er det noget med buffer??
Avatar billede simonvalter Praktikant
19. august 2005 - 00:55 #1
Jeg har ikke muligheden for at teste din kode men jeg kan da lige hurtigt se at du laver noget som er _MEGET_ dårlig skik og muligvis kunne fortælle dig noget om dit problem.

Du har flere steder
catch (EnException ex) { }

Hvordan vil du nogensinde kunne vide om der går noget galt?
om ikke andet så smid en midlertidig ex.printStackTrace(); ind.
Avatar billede simonvalter Praktikant
19. august 2005 - 01:56 #2
hvad laver programmet? det læser nogen data ind .. og de data kommer uafbrudt fra dine fan's. hver gang det sker så læser du fra dine fans, opretter en ny forbindelse til database for at læse en værdi som hedder rpm som du så sender tilbage til serial porten?
Du kunne starte med at strukture det lidt bedre. Start med at få den database forbindelse/driver osv oprettet en gang. DateFormat objekter behøves heller ikke oprettes hver gang du går ind i den switch statement.
en masse case statements som den bare falder igennem har du heller ikke rigtigt noget at bruge til, og husk break; efter hver hvis du ikke vil have den skal falde igennem til den næste.
Avatar billede simonvalter Praktikant
19. august 2005 - 01:58 #3
du behøver selvfølgelig ikke holde forbindelsen åben til databasen men driveren behøver du ihvertfald ikke at hive fat i hver gang.
Avatar billede pentium Nybegynder
19. august 2005 - 14:17 #4
Ok, tak skal du have. lig et svar.
Avatar billede simonvalter Praktikant
19. august 2005 - 18:10 #5
Hjalp jeg på problemet? I så fald hvad var det
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester