Bonjour

J'essaye via un programme Java de lire et d'ecrire sur un pty sous Linux, afin que cela soit recuperable par un autre langage de l'autre cote.
J'ai fait deux tests qui ne fonctionne pas
Auriez vous une autre idée ???


Le 1er Class15 fonctionne en Output mais pas en Input ou le Message Bad Descriptor est génére
Le voici


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
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
 import java.io.*; 
 
 
public class Class15 
{ 
 String portName=null; 
 FileOutputStream fos2 = null; 
 FileInputStream fis2 = null; 
 
 
        public byte[] toBytes(char[] from) { 
          byte[] result = new byte[from.length]; 
 
 
          for (int i = 0; i < from.length; i++) { 
            result[i] = (byte)from[i]; 
          } 
 
 
          return result; 
        } 
 
 
  public Class15(String mportName) throws Exception 
  { 
                      portName=mportName; 
 
 
           System.out.println("cl01 portName "+portName); 
 
 
                  fos2 = new FileOutputStream(portName); 
 
 
                      System.out.println("cl02 portName "+portName); 
 
 
                    //  fis2 = new FileInputStream(portName); // Ne 
fonctionne pas 
                      FileDescriptor fd = fos2.getFD(); 
                      fis2 = new FileInputStream(fd); 
                      //fis2 = new FileInputStream(fd.in); 
                      System.out.println("cl03 portName "+portName); 
 
 
                      System.out.println("cl04 portName fis2 
"+fis2.available()); 
 
 
                  } 
 
 
public void go(String xx) 
{ 
 
 
                  try{ 
                     fos2.write(toBytes(xx.toCharArray())); 
                     fos2.write('\n'); 
                     fos2.flush(); 
 
 
           //   fos2.close(); 
              } catch(Exception e) 
                { 
                System.out.println("Erreur1 "+e.getMessage()); 
 
 
                } 
 
 
  } 
 
 
      public String read(){ 
      String rt=null; 
      try{ 
          System.out.println("r01 *"+portName+"*"); 
 
 
                               System.out.println("r03 available 
*"+fis2.available()); 
                               System.out.println("r04 valid 
*"+fis2.getFD().valid()); 
 
 
            while (true) { 
 
 
                      System.out.println("r05 *"+portName+"*"); 
                    byte b[] = new byte[100]; 
                    // Read some data from the modem. 
                    int nbytes = fis2.read(b); 
                    System.out.println("r06 *"+nbytes+"*"); 
 
 
                    System.out.println (new String (b, 0, nbytes)); 
                  } 
      } 
      catch(Exception e1){ 
      System.out.println(e1.getMessage()); 
 
 
      } 
 
 
            return rt; 
        } 
 
 
    public void close() { 
    try{ 
        fos2.close(); 
        fis2.close(); 
    }catch(Exception e1){} 
    } 
 
 
  /** 
   * 
   * @param args 
   */ 
  public static void main(String[] args) 
  { 
      String portName=new String("/dev/ptyqf"); 
       String xx=new String("COUCOU DE JAVA"); // Demande de l'Heure 
 
 
      if(args.length>0) 
       portName = args[0]; // ex /dev/ttyq0 
       try{ 
      Class15 x=new Class15(portName); 
 
 
      System.out.println("PORT OUVERT, lancer le BASIC avant de 
Valider!"); 
      System.out.println("APPUYER SUR ENTREE pour l'envoi"); 
 
 
      System.out.println("fis2 "+x.fis2.available()); 
 
 
      //Lecture du clavier 
      BufferedReader entree=new BufferedReader(new 
InputStreamReader(System.in)); 
 
 
      while(entree.readLine()!=null && 
!entree.readLine().equalsIgnoreCase("f")) 
      { 
      System.out.println("GO"); 
 
 
          System.out.println("fis2B "+x.fis2.available()); 
      x.go(xx); 
          System.out.println("fis2c "+x.fis2.available()); 
 
 
      //Test de lecture depuis le BASIC sur le pty 
       String lu=x.read(); 
       System.out.println("LU depuis le BASIC "+lu); 
 
 
      } 
       System.out.println("FERMETURE DU FLUX!"); 
        x.close(); 
      } 
       catch(Exception e1){System.out.println(e1.getMessage());} 
  } 
  }
---------------------------------------------------------------
Le 2eme avec les NIO s'arrete pendant l'ecriture
au niveau du buf.hasRemaining() et l'ecriture ne se fait pas

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
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
 
import java.io.BufferedReader; 
import java.io.FileOutputStream; 
 
 
import java.io.InputStreamReader; 
 
 
import java.nio.ByteBuffer; 
import java.nio.channels.WritableByteChannel; 
 
 
public class Class20 { 
 
 
    WritableByteChannel channel =null; 
    String portName=new String("/dev/ptyqf"); 
    String xx=new String("COUCOU DE JAVA"); // Demande de l'Heur 
 
 
    public Class20() throws Exception { 
        System.out.println("cl01 portName "+portName+" 
"+this.getClass().getName()); 
         channel = new FileOutputStream( portName).getChannel(); 
        System.out.println("cl02 portName "+portName+" 
"+this.getClass().getName()); 
    } 
 
 
    public byte[] toBytes(char[] from) { 
      byte[] result = new byte[from.length]; 
 
 
      for (int i = 0; i < from.length; i++) { 
        result[i] = (byte)from[i]; 
      } 
 
 
      return result; 
    } 
 
 
public void write() 
{ 
    System.out.println("write01"); 
    try { 
 
 
        Character CR=new Character('\n'); 
 
 
        String zz=new String(xx); 
        zz=zz.concat(CR.toString()); 
        ByteBuffer buf = ByteBuffer.allocateDirect(zz.length()); 
 
 
            System.out.println("write02"); 
 
 
                buf.put(toBytes(xx.toCharArray())); 
 
 
            System.out.println("write03"); 
 
 
            System.out.println("write04"); 
                // Set the limit to the current position and the 
position to 0 
                // making the new bytes visible for write() 
                buf.flip(); 
 
 
            System.out.println("write05"); 
                // Write the bytes to the channel 
                int numWritten = channel.write(buf); 
 
 
            System.out.println("write06 "+numWritten ); 
 
 
                // Check if all bytes were written 
                if (buf.hasRemaining()) { 
                    System.out.println("write07"); 
                    // If not all bytes were written, move the 
unwritten bytes 
                    // to the beginning and set position just after the 
last 
                    // unwritten byte; also set limit to the capacity 
                    buf.compact(); 
                } else { 
                    System.out.println("write08"); 
                    // Set the position to 0 and the limit to capacity 
                    buf.clear(); 
                } 
           // } 
        } catch (Exception e) { 
    } 
    System.out.println("write09"); 
 
 
 
} 
 
 
    public void closewrite() throws Exception 
    { 
           // Close the file 
            channel.close(); 
        } 
 
    public static void main(String[] args) 
    { 
    try 
    { 
        Class20 x=new Class20(); 
 
 
        //Lecture du clavier pour etre sur que le prog de test de 
l'autre cote est ouvert 
        BufferedReader entree=new BufferedReader(new 
InputStreamReader(System.in)); 
 
 
        while(entree.readLine()!=null && 
!entree.readLine().equalsIgnoreCase("f")) 
        { 
        System.out.println("GO"); 
            x.write(); 
 
 
        } 
 
 
        x.closewrite(); 
    } 
    catch(Exception e1) { 
        System.out.println(e1.getMessage()); 
    } 
 
 
    } 
 
 
 
}

Cordialement
Philippe