Bonjour
Je dois faire un programme en java qui gere un lecteur de carte brancher en rs232 j'ai pris rxtxcomm pour utiliser les ports comm mais je ne trouve pas la commande pour envoyer le code au lecteur.
Pouvez vous m'aider merci
Version imprimable
Bonjour
Je dois faire un programme en java qui gere un lecteur de carte brancher en rs232 j'ai pris rxtxcomm pour utiliser les ports comm mais je ne trouve pas la commande pour envoyer le code au lecteur.
Pouvez vous m'aider merci
pour plus d'info voir ce lienhttp://christophej.developpez.com/tu...java/javacomm/, c'est sur l'api javaComm mais c'est le meme principe sinon il y a des exemples sur le site de rxtxcomm http://rxtx.qbang.org/wiki/index.php/ExamplesCode:
1
2
3
4
5
6
7 try { outStream = sPort.getOutputStream(); bufRead = new BufferedReader( new InputStreamReader(sPort.getInputStream())); } catch (IOException e) { }
en fait je t'explique je dois faire sa pour mon BTS info je doit me connecté a un lecteur de carte et envoyer des code de commande pour le mettre en mode reception et tout les truc la! les codes de commandes je les ai mais impossible de envoyer a mon lecteur j'ai enormement de mal a comprendre comment marche le RXTXcomm. pour me connecter j'ai mis sa
mais je sais pas du tout si c'est juste. quesque t'en pense peut tu m'aider un peu stpCode:
1
2
3
4
5 CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); CommPort commPort = portIdentifier.open(this.getClass().getName(),2000); SerialPort serialPort = (SerialPort) commPort; serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
Hello!
Es-tu certain que les paramètres du port série sont bons ? (baudrate, parity,...) ?
apparement ton projet correspond la gestion de bascule du premier lien que je t'ai donné mais come te l'a dit nnovic est tu sur de tes parametres de com et est ce que tu à des erreurs quand tu te connecte?
je suis sur de mes parametres il sont donné!
Bonjour,
As-tu déjà essayé de communiquer avec ton appareil avec un logiciel de type minicom (UNIX) ou HyperTerminal(Window) ou autres?
;)Citation:
On reconnait un bon programmeur aux outils qu'il emploie
Voila un code qui te permet de te connecter un port com et à envoyer des caractere avec la fonction EcrireChar ou des bytes avec EcrireBytes et tu recois en retour une String avec GetCRecu() la réception se déroule dans un thread pour qu'il n'y ai pas de blocage.
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
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361 package a2eim.jcomm.rs232; import gnu.io.*; import java.io.*; public class rs232 { private OutputStream outStream; //flux d'écriture du port private InputStream in;//flux de lecture du port private CommPortIdentifier portId; //identifiant du port private RXTXPort sPort; //le port série private String s; //String de retour d'info private int vitesse=9600; private int NbBits=SerialPort.DATABITS_8; private String NomPort="COM1"; private int Parite=SerialPort.PARITY_NONE; private int Stop=SerialPort.STOPBITS_1; private int Controle=SerialPort.FLOWCONTROL_NONE; private RXTXCommDriver w32Driver = new RXTXCommDriver(); private EcoutePort EcoutePort1; public rs232(){ } //recupération du nom du port public String SetPort(String port){ NomPort=port; s=""; try { portId = CommPortIdentifier.getPortIdentifier(NomPort); s="port OK" ; } catch (NoSuchPortException e) { s="port innexistant"; } return s; } //renvoi du nom du port public String GetPort(){ return portId.toString(); } //recuperation de la vitesse de transmission public void SetVitesse(int v){ vitesse=v; } //retour de la vitesse de transmission public int GetVitesse(){ return vitesse; } //recupertion du nombre de bits de donées public String SetNbBits(int b){ s=""; if (b==5){ NbBits=RXTXPort.DATABITS_5; s="5 bits de donnée"; } else if (b==6){ NbBits=RXTXPort.DATABITS_6; s="6 bits de donnée"; } else if (b==7){ NbBits=RXTXPort.DATABITS_7; s="7 bist de donnée"; } else if (b==8){ NbBits=RXTXPort.DATABITS_8; s="8 bits de donnée"; } else { s="Nombre de bits de donnée incompatible"; } // System.out.println(s); return s; } //retour du nombre de bits de données public int getNbBits(){ int b=0; if ( NbBits==RXTXPort.DATABITS_5){ b=5 ; } else if (NbBits==RXTXPort.DATABITS_6){ b=6 ; } else if ( NbBits==RXTXPort.DATABITS_7){ b=7 ; } else if ( NbBits==RXTXPort.DATABITS_8){ b=8 ; } return b; } //recuperation de la parite public String SetParite(String parite){ s=""; if (parite.equals("AUCUNE")){ Parite=RXTXPort.PARITY_NONE; s="Pas de parité"; } else if (parite.equals("PAIRE")){ Parite=RXTXPort.PARITY_EVEN; s="Parité paire"; } else if (parite.equals("IMPAIRE")){ Parite=RXTXPort.PARITY_ODD; s="Parité impaire"; } else if (parite.equals("MARQUE")){ Parite=RXTXPort.PARITY_MARK; s="Parité marquée"; } else if (parite.equals("ESPACE")){ Parite=RXTXPort.PARITY_SPACE; s="Parité espace"; } else { s="Parité inconnue"; } // System.out.println(s); return s; } //retour de la parite public String GetParite(){ s=""; if (Parite==RXTXPort.PARITY_NONE){ s="AUCUNE"; } else if (Parite==RXTXPort.PARITY_EVEN){ s="PAIRE"; } else if ( Parite==RXTXPort.PARITY_ODD){ s="IMPAIRE"; } else if ( Parite==RXTXPort.PARITY_MARK){ s="MARQUE"; } else if ( Parite==RXTXPort.PARITY_SPACE){ s="ESPACE"; } return s; } //recuperation du nombre de bits de stop public String SetStop(String stop){ s=""; if (stop.equals("1")){ Stop=RXTXPort.STOPBITS_1; s="1 bit de stop"; } else if (stop.equals("2")){ Stop=RXTXPort.STOPBITS_2; s="2 bits de stop"; } else if (stop.equals("1,5")){ Stop=RXTXPort.STOPBITS_1_5; s="bit de stop 1,5"; } else { s="bit de stop inconnu"; } // System.out.println(s); return s; } //retour du nombre de bits de stop public String GetStop(){ s=""; if (Stop==RXTXPort.STOPBITS_1){ s="1"; } else if (Stop==RXTXPort.STOPBITS_2){ s="2"; } else if (Stop==RXTXPort.STOPBITS_1_5){ s="1,5"; } return s; } //recuperation du controle public void SetControle(String controle){ if (controle.equals("matériel")){ Controle=SerialPort.FLOWCONTROL_RTSCTS_IN; } else if (controle.equals("Xon/Xoff")){ Controle=SerialPort.FLOWCONTROL_XONXOFF_IN; } else { Controle=SerialPort.FLOWCONTROL_NONE; } } //retour du controle public String GetControle(){ String c = null; if (Controle==SerialPort.FLOWCONTROL_NONE){ c="aucun"; } if (Controle==SerialPort.FLOWCONTROL_RTSCTS_IN){ c="matériel"; } if (Controle==SerialPort.FLOWCONTROL_XONXOFF_IN){ c="Xon/Xoff"; } return c; } //ouvrir le port et les flux public void OuvrirPort(){ w32Driver.initialize(); //ouverture du port try { sPort = (RXTXPort) portId.open("java_rs232", 2000); } catch (PortInUseException e) { } //règle les paramètres de la connexion try { sPort.setFlowControlMode(Controle); sPort.setSerialPortParams( vitesse, NbBits, Stop, Parite); } catch (UnsupportedCommOperationException e) { } //récupération du flux de lecture et écriture du port outStream = sPort.getOutputStream(); in = sPort.getInputStream(); EcoutePort1=new EcoutePort(in); (new Thread(EcoutePort1)).start(); } // retour de la chaine recu public String GetCRecu(){ String c=EcoutePort1.Recu(); return c; } //effacer la chaine recu public void EffacerCRecu(){ EcoutePort1.EffacerRecu(); } // ecrire un caractere public void EcrireChar(char envoie){ try { //demande de poids outStream.write((int) envoie); outStream.close(); } catch (IOException e) { } } //ecrire un tablea de bytes public boolean EcrireBytes(byte[] envoie){ boolean b=false; try { outStream.write(envoie); outStream.close(); b=true; } catch (IOException e) { } return b; } //fermer le port public void FermerPort(){ try { outStream.close(); } catch (IOException e) { } EcoutePort1.stopThread(); sPort.close(); } } //thread d'ecoutedu port class EcoutePort implements Runnable{ private boolean running=true; private InputStream in; private String CaractRecu; private String SRecu=new String(); public EcoutePort(InputStream in){ this.in =in; } @Override public void run(){ while (running){ byte[] buffer = new byte[1024]; int len = -1; try { while ( ( len = this.in.read(buffer)) > -1 ) { CaractRecu=new String(buffer,0,len); SRecu=SRecu.concat(CaractRecu); byte[] RetourTrame=CaractRecu.getBytes(); for (int t=0;t<RetourTrame.length;t++){ System.out.println((int)RetourTrame[t]& 0xff); } try { // pause Thread.sleep(100); } catch (InterruptedException ex) {} } } catch ( IOException e ) { e.printStackTrace(); } } } //arrette le thread public void stopThread(){ this.running=false; } //eface les caractere recu public void EffacerRecu(){ SRecu=""; } //renvoi les caractere recu public String Recu(){ return SRecu; } }
Merci de ta reponse! j'ai des code a envoyer pour initialiser le lecteur de carte je dois les mettre a quel endroit du code pour qu'il les envoye? parce que dans ecritebyte je vois pas ou mettre les code!
Il faut écrire un programme pour utiliser la classe rs232.
Exemple (non compilé et donc non testé):
Dommage que rs232 ne respecte pas certaines conventions d'écriture de java.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public static TestSerialPort { public static void main(String[] args) { final rs232 serial = new rs232(); serial.SetPort("COM1"); serial.SetVitesse("9600"); serial.SetNbBit(8); serial.SetParite("AUCUNE"); serial.SetStop("1"); serial.SetControle("matériel"); serial.OuvrirPort(); final byte[] msg = new Byte[]{0x00, 0x01}; serial.EcrireByte(msg); String response = serial.GetCRecu(); System.out.println(response); serial.FermerPort(); } }
merci j'ai utiliser ton code et je l'ai adapter mais il me mais sa comme erreur:
Code:
1
2
3
4
5
6
7
8 Stable Library ========================================= Native lib Version = RXTX-2.1-7 Java lib Version = RXTX-2.1-7 Exception in thread "main" java.lang.NullPointerException at rs232.OuvrirPort(rs232.java:222) at TestSerialPort.main(TestSerialPort.java:14)
en fait sa libere pas le port com parce que quand je le lance une fois sa donne rien et quand je el relance une 2eme fois sa mais l'erreur la faut que je quitte eclipse et que je le relance pour liberer le port com et pouvoir relancer le prog!! mais enfaite j'ai mis un code pour allumer la led de mon lecteur de carte mais rien ne se passe!!
Salut,
L'erreur est simple, non?
Tu vas à la ligne 222 du code de rs232. Tu verras que le code n'est pas bien écrit. Il ignore les exceptions.....
Remplace la méthode OouvrirPort par ce code
Vu le code de la classe rs232, tu auras d'autres problèmes du même genre.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 //ouvrir le port et les flux public void OuvrirPort(){ w32Driver.initialize(); //ouverture du port try { sPort = (RXTXPort) portId.open("java_rs232", 2000); } catch (PortInUseException e) { system.err.println(e); } if (sPort != null) { //règle les paramètres de la connexion try { sPort.setFlowControlMode(Controle); sPort.setSerialPortParams(vitesse, NbBits, Stop, Parite); //récupération du flux de lecture et écriture du port outStream = sPort.getOutputStream(); in = sPort.getInputStream(); EcoutePort1 = new EcoutePort(in); (new Thread(EcoutePort1)).start(); } catch (UnsupportedCommOperationException e) { system.err.println(e); } }
dévellopant que pour mon propre plaisir j'admet que mon code ne doit pas etre parfait (d'ailleur si quelqu'un voulait bien me le corriger pour que je progresse j'apprecierais fortement). Néamoins ce code fonctionne car je m'en suis servi pour faire un hyperterminal et pour communiquer en modbus avec des automates. Donc vu l'erreur je me demande si le port que tu indique existe réellement ou s'il n'est pas deja utilisé par une autre appli.
Si tu pouvais nous donner ton code ainsi que le format de commande que tu doit envoyer on pourrais peut etre t'aider d'avantage.
en fait le programme doit se conneter a un lecteur de carte lui envoyer des code c'est des code pour le mettre en mode lecture ou des truc comme sa!! et ensuite quand il est en mode lecture je lui fait lire une carte et je recupere c'est donnée dans un memo.
serialport 1
baud rate 9600
parity none
data bits 8
merci
voila en gros le code il est loin d'etre fini j'essaye de me connecté a mon lecteur de carte et ensuite j'aimerer récupérer les données qui arrive sur le lecteur pour les afficher dans mes afficheur1 afficheur2 et afficheur3.
merciCode:
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 public class traitementcarte extends javax.swing.JApplet implements ActionListener { JTextField afficheur1 = new JTextField(20); JTextField afficheur2 = new JTextField(20); JTextField afficheur3 = new JTextField(20); JPanel panel1 = new JPanel(); JPanel panel2 = new JPanel(); JPanel panel3 = new JPanel(); private OutputStream outStream; private BufferedReader bufRead; private RXTXCommDriver w32Driver = new RXTXCommDriver(); public void init() { Container co = getContentPane(); // on récupère le conteneur GridLayout grid0 = new GridLayout(3, 3);//on crée un gestionnaire de mise en page GridLayout grid1 = new GridLayout(1, 2); GridLayout grid2 = new GridLayout(1, 2); GridLayout grid3 = new GridLayout(1, 2); co.setLayout(grid0); panel1.setLayout(grid1); // on ajoute le gestionnaire de mise en page au conteneur panel2.setLayout(grid2); panel3.setLayout(grid3); co.add(panel1); panel1.add(afficheur1); afficheur1.setHorizontalAlignment(JTextField.RIGHT); afficheur1.setEditable(false); co.add(panel2); panel2.add(afficheur2); afficheur2.setHorizontalAlignment(JTextField.RIGHT); afficheur2.setEditable(false); co.add(panel3); panel3.add(afficheur3); afficheur3.setHorizontalAlignment(JTextField.RIGHT); afficheur3.setEditable(false); } public void actionPerformed(ActionEvent arg0) { } void connect(String portName) throws NoSuchPortException, UnsupportedCommOperationException, PortInUseException, IOException { w32Driver.initialize(); CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); CommPort commPort = portIdentifier.open(this.getClass().getName(),2000); SerialPort serialPort = (SerialPort) commPort; serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); outStream = commPort.getOutputStream(); bufRead = new BufferedReader(new InputStreamReader(commPort.getInputStream())); final byte[] msg = new byte[0x28]; } }
Bonjour,
Je me répète: As-tu réussi de communiquer avec ta carte à l'aide d'un programme genre minicom ou HyperTerminal?
C'est la première étape afin d'être sûr qu'il n'existe pas de problème lié au matériel (câble,...).
Connais-tu les commandes à envoyer à ta carte?
D'abord une chose à la fois, essaie de d'avoir un programme simple (mode console sans SWING) utilisant tes classes pour la communication avec ta carte.
Sinon on va qu'accumuler des problèmes sans pouvoir les résoudre...
non j'ai pas essayer le hyperterminal j'assaye et je te tien au courant
J'ai bien compris ce que tu devais faire mais sans le code que tu a ecrit ni le format de trame que tu doit envoyer au lecteur je ne peut pas t'aider plus.
Oups désolé j'avais pas vu le code