Bonjour,
je reprends actuellement le code d'un projet qui communique avec une puce embarquée programmée en C.
La communication se fait via des DataInputStream et dataOutputStream comme suit:
le client (ici le matériel embarqué donc) se connecte sur un port, on récupere la socket via un accept -> donc TCP et on la passe à la classe Network qui va gérer les stream.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public Network(Socket socket) { try { this.socket = socket; this.dis = new DataInputStream(socket.getInputStream()); this.dos = new DataOutputStream(socket.getOutputStream()); } catch (IOException ex) { Logger.getLogger(Network.class.getName()).log(Level.SEVERE, null, ex); } }
jusque là pas de soucis.
pour lire et ecrire on passe par des tableau de byte comme ceci:
et ceci:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public boolean sendTrame(String trame) { try { int z; int i = 0; int j; String Hex; byte buffer[] = new byte[trame.length() / 2]; for (z = 0; z < (trame.length()); z++) { Hex = ""; Hex = Hex + trame.charAt(z); z++; Hex = Hex + trame.charAt(z); j = Integer.parseInt(Hex, 16); buffer[i] = (byte) (j & 0xFF); i++; } while(dis.available() > 0) { //On vide le stream au cas ou dis.readByte(); } dos.write(buffer); dos.flush(); } catch (IOException ex) { console.traceError("NETWORK_MANAGER", "sendTrame" , ex); return false; } catch (IndexOutOfBoundsException ex) { return false; } return true; }
je l'utilise donc comme cela:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public String receiveTrame() { byte[] messageByte = new byte[512]; String trame = null; int size = 0; try{ while (dis.available()>0) { messageByte[size] = dis.readByte(); size++; } } catch (IOException ex) { console.traceError("NETWORK_MANAGER", "receiveTrame", ex); //Fin de stream normalement detecté via dis.available() } if(size > 0) trame = ""; else console.traceError("NETWORK_MANAGER", "Aucune réponse"); for (int i = 0; i < size; i++) { trame = trame + String.format("%02X", messageByte[i] & 0xFF); } return trame; }
Mon problème c'est que je reçois 8 fois sur 10 une erreur sur la lecture: je retrouve dis.avalaible() == 0 dans la plupart des cas...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 socket = clients.getClient(); //il se cache derrière un ArrayList<Socket>() en attente de traitement créée avec un accept() dans un autre thread socket.setKeepAlive(true); socket.setSoTimeout(5000); network = new Network(socket, true); network.sendTrameDmeLan(maRequete); trame = network.receiveTrameDmeLan();
je passe probablement à cotes d'un truc con mais je n'arrive pas à trouver quoi :/
pour moi dis.readByte() et sensé être bloquant tant que je n'ai rien dans le stream. vu qu'il est vidé avant je devrait y trouver la réponse de ma puce embarqué du coup...
voilà en gros mon problème... merci à vous pour vos éventuelles réponses.
Partager