[JAVA] COM2 Write Error

Pagina: 1
Acties:
  • 132 views sinds 30-01-2008
  • Reageer

  • Machiel21
  • Registratie: September 2001
  • Laatst online: 08-02-2024
Ik krijg de volgende foutmelding zodra ik op een knop druk (swing). Hierdoor worden een aantal commando's verstuurt (aansturing oscilloscoop). Ik gebruik Java 2 JDK 1.3.1 en Comm 2.0 (goed geinstalleerd) op een Windows 2000 Systeem.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
OutputStream write error: java.io.IOException: write error
java.io.IOException: write error
      at com.sun.comm.Win32SerialPort.write(Win32SerialPort.java:677)
      at com.sun.comm.Win32SerialPort.write(Win32SerialPort.java:664)
      at com.sun.comm.Win32SerialOutputStream.write(Win32SerialOutputStream.ja
va:34)
      at Communicatie.Uitvoer(Communicatie.java:167)
      at Acquisitie.Verzenden(Acquisitie.java:77)
      at Acquisitie$MyActionListener.actionPerformed(Acquisitie.java:105)
      at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:14
45)
      at javax.swing.AbstractButton$ForwardActionEvents.actionPerformed(Abstra
ctButton.java:1499)
      at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel
.java:373)
      at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:245
)
      at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonL
istener.java:211)
      at java.awt.Component.processMouseEvent(Component.java:3710)
      at java.awt.Component.processEvent(Component.java:3539)
      at java.awt.Container.processEvent(Container.java:1159)
      at java.awt.Component.dispatchEventImpl(Component.java:2588)
      at java.awt.Container.dispatchEventImpl(Container.java:1208)
      at java.awt.Component.dispatchEvent(Component.java:2492)
      at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:2446
)
      at java.awt.LightweightDispatcher.processMouseEvent(Container.java:2211)

      at java.awt.LightweightDispatcher.dispatchEvent(Container.java:2120)
      at java.awt.Container.dispatchEventImpl(Container.java:1195)
      at java.awt.Window.dispatchEventImpl(Window.java:921)
      at java.awt.Component.dispatchEvent(Component.java:2492)
      at java.awt.EventQueue.dispatchEvent(EventQueue.java:334)
      at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchTh
read.java:126)
      at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThre
ad.java:93)
      at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:88)
      at java.awt.EventDispatchThread.run(EventDispatchThread.java:80)
nativeFinalize: Error closing Handle 6

Hier is mijn code:
Communicatie.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
import java.io.*;
import java.util.*;
import javax.comm.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/** Deze class zorgt voor de juiste communicatie met de RS232
 * en stuurt de commando naar de SIN10
 */
public class Communicatie implements SerialPortEventListener, CommPortOwnershipListener
{
    private CommPortIdentifier poortID;
    private SerialPort serialPort;
    private String poortNaam = "COM2";
    
    private InputStream inputStream;
    private OutputStream outputStream;
    
    private TextArea txtRes;
     
    private final char LF = 10; // Line Feed
       
    /** Deze constructor initialiseert de RS232 en maakt een connectie met RS232. */
    public Communicatie(TextArea txtRes) 
    {
        this.txtRes = txtRes;
    }
    
    /** Deze functie zorgt voor de juiste afhandeling van de data. */
    public void openConnectie()
    {
        try 
        {
            //PoortID kijkt of de gewenste poort aanwezig is.
            poortID = CommPortIdentifier.getPortIdentifier(poortNaam);
        } 
        catch (NoSuchPortException nspe) 
        {
            System.err.println("Poort is bestaat niet!");
            nspe.printStackTrace();
        }
        
        try 
        {
            // Opent de seriele poort voor de eigenaar "Communicatie" met een vertraging van 2 sec.
            serialPort = (SerialPort)poortID.open("Communicatie", 2000);
        } 
        catch (PortInUseException piue) 
        {}
        
        try
        {
            // Stel de juiste parameters in.
            serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            //serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
        }
        catch(UnsupportedCommOperationException ucoe)
        {}
        
        try
        {
            // Maakt de benodige streams aan.
            outputStream = serialPort.getOutputStream();
            inputStream = serialPort.getInputStream();
        }
        catch(IOException ioe)
        {
            System.err.println("Kan de streams niet openen.");
            serialPort.close();
            ioe.printStackTrace();
        }
        
        try 
        {
            // Zorgt ervoor dat de RS232 luistert naar events.
            serialPort.addEventListener(this); 
        } 
        catch (TooManyListenersException e) 
        {}
    
        serialPort.notifyOnDataAvailable(true); // De RS232 weet dan wanneer er data beschikbaar is.
        serialPort.notifyOnOutputEmpty(true);    // De RS232 weet dan wanneer er geen data meer beschikbaar is.
        poortID.addPortOwnershipListener(this);  // De RS232 weet dan wie de baas is over de RS232.
    }
    
    /** Deze functie zorgt dat alle streams en de RS232 gesloten worden. */
    private void sluitConnectie()
    {
        if (serialPort != null)
        {
            try 
            {
                outputStream.close();
                inputStream.close();
            } 
            catch (IOException e) 
            {
                System.err.println(e);
            }
        
            serialPort.close();

            poortID.removePortOwnershipListener(this);
        }
    }
    
    /**
    * Deze functie zorgt voor de juiste handeling bij de verschillende RS232 events.
    */
    public void serialEvent(SerialPortEvent event) 
    {
        switch(event.getEventType()) 
      {
          case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // Geen data meer beschikbaar
            break;
          case SerialPortEvent.DATA_AVAILABLE: //Data beschikbaar
              /*
              * Leest wat er in de RS232 binnenkomt en laat dit zien op het scherm.
              */
            StringBuffer readBuffer = new StringBuffer(); // Buffer
            int data = 0;
                 
            try 
            {
                data = inputStream.read();
                if (data > 0) 
                {
                  readBuffer.append((char)data); // Buffer wordt gevult met karakters.
                }
                System.out.print(new String(readBuffer)); // Toon de volledige inhoud van de buffer.
                txtRes.append(new String(readBuffer)); // zowel als in het uitvoerscherm (dos-venster), als in de textarea.
            } 
            catch (IOException e) 
            {}
            break;
      } 
    }
    
    /*
    * Als er van eigenaar van de RS232 gewisseld wordt.
    */
    public void ownershipChange(int type) 
    {
        if (type == CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED) 
        {
            sluitConnectie();
        }
    }
    
    /** Deze functie zorgt ervoor dat de commando op de juiste manier naar de SIN10 worden verzonden. */
    public void Uitvoer(String commando)
    {
        try
        {
               char[] com_kar = commando.toCharArray(); // Zet het commando om in een char array.
               
            for(int i = 0; i < commando.length(); i++)
            {
          Deze regel-->    outputStream.write((int)com_kar[i]); // Verzendt het commando per karakter naar de SIN10
               }
               outputStream.write(LF);
        } 
        catch (IOException e) 
        {
                System.err.println("OutputStream write error: " + e);
                e.printStackTrace();
                sluitConnectie();
        }
    }
}

Acquisitie.java
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
  
public class Acquisitie extends JFrame
{
    // private knoppen, labels enz.
    private TextArea txtRes;
    private JLabel jLabel1;
    private JLabel jLabel2;
    private JButton btnOpnieuw;
    
    private FileOutputStream uitvoer;
    
    private Communicatie connectie;
 
    public Acquisitie()
    {
        initComponents();
    }
    
    private void initComponents()
    {
        txtRes = new TextArea();
        jLabel1 = new JLabel();
        jLabel2 = new JLabel();
        btnOpnieuw = new JButton();
        
        getContentPane().setLayout(null);
              
      addWindowListener (new WindowAdapter ()
      {
        public void windowClosing (WindowEvent evt)
        {
            System.exit(0);
        }
      });
      
      getContentPane ().add (txtRes);
      txtRes.setBounds (380, 30, 280, 210);
      
      jLabel1.setText ("Ontvangen data:");
      getContentPane ().add (jLabel1);
      jLabel1.setBounds (270, 30, 92, 17);
      
      btnOpnieuw.setText ("Opnieuw");
      getContentPane ().add (btnOpnieuw);
      btnOpnieuw.setBounds (40, 90, 95, 27);
      btnOpnieuw.addActionListener(new MyActionListener());
      
      pack ();
      Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
      setSize(new Dimension(700, 300));
      setLocation((screenSize.width-800)/2,(screenSize.height-450)/2);
    }
    
    public static void main(String args[]) 
    {
      new Acquisitie ().show ();
    }
    
    /** Functie voor het verzenden van de commando.
     * @param commando de commando die men wilt versturen.
     */
    public void Verzenden(String commando)
    {
        connectie = new Communicatie(txtRes); // voert de constructor uit van de communicatie klasse
        connectie.openConnectie(); // Voert de functie openConnectie uit van de communicatie klasse.
    Deze regel--> connectie.Uitvoer(commando); // Voert de functie Uitvoer uit van de communicatie klasse.
        //Ophalen("OsciData");
    }
    
    private void Ophalen(String bestandsnaam)
    {
        byte data[] = txtRes.getText().getBytes();
        try
        {
            uitvoer = new FileOutputStream(bestandsnaam + ".csv");
            uitvoer.write(data);
            uitvoer.close();
        }
        catch (IOException ioe)
        {}      
    }
    
    /** MyActionListener handeld de acties af van de knop en de textfield. */
    public class MyActionListener implements ActionListener
    {
        public void actionPerformed(ActionEvent event)
      {
          try
          {
              Verzenden("DATA:SOURCE CH1"); // Verzendt wat men invoert.
              Thread.sleep(500);
              Verzenden("DATA:ENCDG ASCII");
              Thread.sleep(500);
      Deze regel-->   Verzenden("DATA:WIDTH 1");
              Thread.sleep(500);
              Verzenden("DATA:START 1");
              Thread.sleep(500);
              Verzenden("DATA:STOP 5000");
              Thread.sleep(500);
              Verzenden("CURVE?");
          }
          catch(Exception e)
          {}
      }
    }
}

Volgens de foutmelding zit de fout bij "Deze regel -->"
Wie weet wat ik fout doe (of juist niet)??

Verwijderd

Hen al heel lang niet meer met comm poorten gewerkt (Zeker niet met java) maar o.k.

Ik zou in ieder geval proberen deze exceptie af te vangen (in ieder geval voor debuggen) ...

catch (PortInUseException piue) {}
catch(UnsupportedCommOperationException ucoe) {}
catch (TooManyListenersException e) {}

daar dat je Verzenden elke keer weer probeert een comm poort te openen..

Ik zou eigenlijk verwachten dat ie dan al bij de 2e verzend problemen zou geven maar dit zou kunnen komen doordat de data nog gebufferd is in outputstream

probeer eens
outputStream.flush();
na de
outputStream.write(LF);

  • Machiel21
  • Registratie: September 2001
  • Laatst online: 08-02-2024
Thx, maar dat werkt niet. :(
Krijg nog steeds dezelfde foutmelding..

En het is ook steeds een andere regel heb ik gemerkt.

dan weer 103, dan weer 105 of 107.

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 21-06 17:02
Deze aanpassing heb ik eventjes gedaan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class MyActionListener implements ActionListener
    {
        public synchronized void actionPerformed(ActionEvent event)
      {

          try
          {
            connectie = new Communicatie(txtRes);
            connectie.openConnectie();
              connectie.Uitvoer("DATA:SOURCE CH1") ; // Verzendt wat men invoert.
              Thread.sleep(500);
              connectie.Uitvoer("DATA:ENCDG ASCII");
              Thread.sleep(500);
              connectie.Uitvoer("DATA:WIDTH 1");  
              Thread.sleep(500);
              connectie.Uitvoer("DATA:START 1");
              Thread.sleep(500);
              connectie.Uitvoer("DATA:STOP 5000");
              Thread.sleep(500);
              connectie.Uitvoer("CURVE?");
              Thread.sleep(500);
              connectie.sluitConnectie();
          }
          catch(Exception e)
          {}

      }
    }

en verder
code:
1
2
3
4
5
6
7
8
public void sluitConnectie()
    {
        if (serialPort != null)
        {
            try
            {
                outputStream.flush();
            enz .......

Zo wordt de com-poort niet telkens geopend en gesloten

Dit werkt als je niet te snel meermaals op de button klikt. Doe je dit toch, krijg je gelijkaardige fout

  • Baron
  • Registratie: Juli 2000
  • Laatst online: 21-06 17:02
Als je deze twee regels bij initComponents() toevoegd i.p.v. bij actionPerformed(ActionEvent event)

connectie = new Communicatie(txtRes);
connectie.openConnectie();

en

Declareer: private Communicatie connectie;
Verwijder: connectie.sluitConnectie();

Door de verschillende Thread.sleep(500) blijft toepassing schijnbaar even hangen. Dus dit zal je nog moeten oplossen.

  • kim72
  • Registratie: Oktober 2001
  • Laatst online: 15-03 16:41
Eventjes een algemene opmerking over je code: ik zie dat je op een heleboel plaatsen een excepties gewoon afvangt en er dan niks mee doet. Op die manier weet je dus nooit of er iets fout is gegaan. Je kan het beste in elk catch-blok een ex.printStackTrace() opgeven, dan krijg je in ieder geval te zien wat en waar er iets fout gaat. Dit maakt het debuggen vele malen simpeler!

  • Machiel21
  • Registratie: September 2001
  • Laatst online: 08-02-2024
Allemaal bedankt voor jullie hulp.

Ik krijg de foutmelding nu maar heel zelden tot niet meer.

Ik weet alleen niet meer wat ik nou precies allemaal veranderd heb, maar weet wel dat ik jullie raad heb uitgevoerd.

Thx again...
Pagina: 1