Hoi!
Lange tijd geleden dat ik hier nog gepost heb omdat ik meestal zelf m'n problemen weet op te lossen. Met dit probleem ben ik echter ten einde raad...
Het gaat om het volgende:
Met behulp van de RxTx (javax.comm is deprecated) wil ik communiceren met een seriële poort waaraan een GSM-module hangt (via AT-cmd's). Na wat zoeken lukt het me om dingen te sturen naar de seriele poort, maar krijg ik geen bevestiging ervan. Normaal gezien krijg je OK of Error terug van de gsm, maar dit is dus niet het geval....
Volgens mij ligt het aan het feit dat de GSM telkens een lege regel meestuurt.
Voorbeeld hoe AT-commando's werken met Hyperterminal (Windows):
Terwijl hij normaal dus zou moeten bevestiging geven... Ga ik dan gaan kijken met Hyperterminal dan zie ik
Ik gebruik hiervoor volgende code:
Acquisitie2.java
En de klasse die de eigenlijk serieële communicatie verzorgt:
communicatie.java
Wie kan mij helpen?
/Edit
En dit kan ook wel handig zijn: uitvoer van mijn programma:
Dit was na het versturen van de code at+cpin? Zoals je ziet krijgt hij niets op de output buffer...
Lange tijd geleden dat ik hier nog gepost heb omdat ik meestal zelf m'n problemen weet op te lossen. Met dit probleem ben ik echter ten einde raad...
Het gaat om het volgende:
Met behulp van de RxTx (javax.comm is deprecated) wil ik communiceren met een seriële poort waaraan een GSM-module hangt (via AT-cmd's). Na wat zoeken lukt het me om dingen te sturen naar de seriele poort, maar krijg ik geen bevestiging ervan. Normaal gezien krijg je OK of Error terug van de gsm, maar dit is dus niet het geval....
Volgens mij ligt het aan het feit dat de GSM telkens een lege regel meestuurt.
Voorbeeld hoe AT-commando's werken met Hyperterminal (Windows):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| at OK att OK at+cpin? +CPIN: SIM PIN atd0000000000 ERROR ath OK atd ERROR at+cpin=0000 OK |
Terwijl hij normaal dus zou moeten bevestiging geven... Ga ik dan gaan kijken met Hyperterminal dan zie ik
Ik gebruik hiervoor volgende code:
Acquisitie2.java
Java:
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
172
173
174
175
176
177
178
| import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; import gnu.io.*; public class Acquisitie2 extends JFrame { // private knoppen, labels enz. private TextArea textArea; private TextField invoerVeld; private JLabel jLabel1; private JLabel jLabel2; private JButton btnOpnieuw, btnDisconnect, btnConnect; private FileOutputStream uitvoer; private Communicatie connectie; public Acquisitie2() { initComponents(); } private void initComponents() { textArea = new TextArea(); invoerVeld = new TextField(); jLabel1 = new JLabel(); jLabel2 = new JLabel(); btnOpnieuw = new JButton(); btnDisconnect = new JButton(); btnConnect = new JButton(); getContentPane().setLayout(null); addWindowListener (new WindowAdapter () { public void windowClosing (WindowEvent evt) { System.exit(0); } }); getContentPane ().add (textArea); textArea.setBounds (380, 30, 280, 210); invoerVeld.setText("at+cpin?"); getContentPane().add(invoerVeld); invoerVeld.addActionListener(new invoerVeldListener() ); invoerVeld.setBounds(380, 250, 280, 27); btnConnect.setText("Connect"); getContentPane().add(btnConnect); btnConnect.addActionListener(new connectListener() ); btnConnect.setBounds(40, 60, 95, 27); btnDisconnect.setText("Disconnect"); getContentPane().add(btnDisconnect); btnDisconnect.addActionListener(new disconnectListener() ); btnDisconnect.setBounds(40, 130, 95, 27); 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 Acquisitie2 ().show (); } /** Functie voor het verzenden van de commando. * @param commando de commando die men wilt versturen. */ public void Verzenden(String commando) { connectie = new Communicatie(textArea); // voert de constructor uit van de communicatie klasse connectie.openConnectie(); // Voert de functie openConnectie uit van de communicatie klasse. connectie.Uitvoer(commando); // Voert de functie Uitvoer uit van de communicatie klasse. //Ophalen("OsciData"); } private void Ophalen(String bestandsnaam) { byte data[] = textArea.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 synchronized void actionPerformed(ActionEvent event) { try { /*connectie = new Communicatie(textArea); connectie.openConnectie(); connectie.Uitvoer("at") ; // Verzendt wat men invoert. Thread.sleep(500); connectie.Uitvoer("at+cpin?"); 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) { System.out.println("Fout bij het versturen van commando's naar class Communicatie"); e.printStackTrace(); } } } public class invoerVeldListener implements ActionListener { public synchronized void actionPerformed(ActionEvent event){ try { /*connectie = new Communicatie(textArea); connectie.openConnectie();*/ String invoer = invoerVeld.getText(); textArea.append(invoer); connectie.Uitvoer(invoer); connectie.invoer(); Thread.sleep(2000); connectie.invoer(); } catch (Exception ex) { ex.printStackTrace(); } } } public class connectListener implements ActionListener { public synchronized void actionPerformed(ActionEvent event) { try { connectie = new Communicatie(textArea); connectie.openConnectie(); } catch (Exception ex) { ex.printStackTrace(); } } } public class disconnectListener implements ActionListener { public synchronized void actionPerformed(ActionEvent event ) { try { connectie.sluitConnectie(); } catch (Exception ex) { ex.printStackTrace(); } } } } |
En de klasse die de eigenlijk serieële communicatie verzorgt:
communicatie.java
Java:
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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
| import java.io.*; import java.util.*; import gnu.io.*; //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; //TODO: hier de correct compoort plaatsen private String poortNaam = "COM1"; private InputStream inputStream; private OutputStream outputStream; private TextArea txtRes; private final char LF = 10; // Line Feed private final char CR = 13; // Carriage Return /** 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.out.println("Poort "+ poortNaam +" 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) { System.out.println("Poort " + poortNaam +" is al in gebruik!"); piue.printStackTrace(); } try { // Stel de juiste parameters in voor de WaveCOM. serialPort.setSerialPortParams(19200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); } catch(UnsupportedCommOperationException ucoe) { System.out.println("Niet-ondersteunde parameter werd opgegeven"); ucoe.printStackTrace(); } try { // Maakt de benodige streams aan. outputStream = serialPort.getOutputStream(); inputStream = serialPort.getInputStream(); } catch(IOException ioe) { System.out.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) { System.out.println("Te veel listeners opgegeven!"); } //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. */ public void sluitConnectie() { if (serialPort != null) { try { outputStream.flush(); inputStream.close(); } catch (IOException e) { System.out.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 System.out.println("Output Buffer Empty"); break; case SerialPortEvent.DATA_AVAILABLE: //Data beschikbaar /*Leest wat er in de RS232 binnenkomt en laat dit zien op het scherm. */ System.out.println("Data available ..."); 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) { System.out.println("IOException gekregen bij lezen char's..."); } System.out.println("Einde data available..."); 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 WaveCOM worden verzonden. */ public void Uitvoer(String commando) { try { char[] com_kar = commando.toCharArray(); // Zet het commando om in een char array. System.out.println("Start char array die verzonden wordt....."); for(int i = 0; i < commando.length(); i++) { System.out.print((int) com_kar[i]); outputStream.write((int)com_kar[i]); // Verzendt het commando per karakter naar de WaveCOM } System.out.println("Einde char array"); //System.out.println("Start poging tot lezen: "+ inputStream.read() ); werkt hier niet outputStream.write(LF); //outputStream.write(CR); normaal gezien is dit niet nodig } catch (IOException e) { System.err.println("OutputStream write error: " + e); e.printStackTrace(); sluitConnectie(); } } public void invoer() { int data = 0; StringBuffer readBuffer = new StringBuffer(); // Buffer try { data = inputStream.read(); if (data > 0) { readBuffer.append((char)data); // Buffer wordt gevult met karakters. } System.out.print("Running invoer: "+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) { System.out.println("IOException gekregen bij lezen char's..."); } //return readBuffer; } } |
Wie kan mij helpen?
/Edit
En dit kan ook wel handig zijn: uitvoer van mijn programma:
code:
1
2
3
4
| Start char array die verzonden wordt..... 97116439911210511063Einde char array Output Buffer Empty Running invoer: Running invoer: |
Dit was na het versturen van de code at+cpin? Zoals je ziet krijgt hij niets op de output buffer...