j'envoie des commande AT à un modem GSM wavecom et j'utilise 2 timers le premier se lance chaque 60 millisecondes pour lire la réponse du modem et le deuxième se lance chaque 150 millisecondes pour envoyer les commande AT d'envoi de sms. Le problème c'est que le premier timer me renvoie toujours la 1ère réponse de mon exécution meme si le deuxième timer a envoyé une autre commande et lorsque je réexécute il me donne la deuxième réponse et ainsi de suite, donc pour exécuter 4 commande AT il faut que je lance mon application 4 fois comme ci le modem a gardé dans son port 1 seul réponse et l'arrivé d'une nouvelle n'écrase pas la première qu'après rééxécution ? Est ce qu'il faut vider le modem ou il y a un problème au niveau des timers? voilà mon code:
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
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
public class Envoi extends javax.swing.JFrame implements SerialPortEventListener{
public static Timer timer1;
	public static Timer timer2;
	public static Timer timer3;
private BufferedReader fluxLecture;
	private BufferedReader entree;
	private InputStream inStream;
	private OutputStream outStream; 
	private PrintWriter sortie;
	private String flux="";
	private SerialPort port=null;
	private Enumeration portList;
	private CommPortIdentifier portId;
 
public Envoi() {
		super();
initialisation();
traiter();
}
 
public void initialisation()
	{
        //initialisation du driver
		Win32Driver w32Driver= new Win32Driver();
		w32Driver.initialize();
        //r?cup?ration de l'?num?ration
		portList=CommPortIdentifier.getPortIdentifiers();
        //affichage des noms des ports
		portId=null;
		while (portList.hasMoreElements()){
			portId=(CommPortIdentifier)portList.nextElement();
			System.out.println(portId.getName());
		}
		try{
			portId=CommPortIdentifier.getPortIdentifier("COM2");
		}catch(NoSuchPortException ex){
			System.out.println("NoSuchPortException");
		}
 
		try {
			port=(SerialPort)portId.open("Envoi", 2000); // L'appel de la m?thode open accepte deux param?tres : * le nom de l'application qui demande le port * le d?lai d'attente pour l'obtention du port en millisecondes.Si le port est d?j? utilis? par une autre application, le syst?me propage un PORT_OWNERSHIP_REQUESTED et donne alors le d?lai au syst?me pour lib?rer le port. En cas d'?chec une PortInUseException est lev?e. 
 
		} catch (PortInUseException ex) {
			System.out.println("PortInUseException");
		}
 
		try {
				outStream = port.getOutputStream();
				inStream = port.getInputStream();
 
				fluxLecture =new BufferedReader(new InputStreamReader(inStream));
				sortie = new PrintWriter(outStream, true);
 
		} catch (IOException e) {
			System.out.println("IOException");
		}
		//ajout du listener
		try {
			port.addEventListener(this);
		} catch (TooManyListenersException e) {
		}
		port.notifyOnDataAvailable(true);
 
		/* Apr?s son ouverture, vous devez param?trer le port. Les param?tres importants pour la communication par port s?rie sont :
 
		    * le contr?le de flux
		    * le d?bit de la connexion (en Bauds)
		    * le nombre de bits de donn?es
		    * le ou les bits stop
		    * la pr?sence d'un bit de parit?
 
		    */
 
			try{
				port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
				port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
			}catch (UnsupportedCommOperationException ex){
				System.out.println("UnsupportedCommOperationException");
			}
 
		//pour deriger directement les accusses des messages emis ainsi les nouveaux messages sur le port serie
		sortie.println("AT+cnmi=0,2,0,1,0"+(char)13);
		//pour activer les status report request
		sortie.println("AT+csmp=33"+(char)13);
 
		etapeSeq=-1;
		typeModem=1;
 
	}
 
public void serialEvent(SerialPortEvent event) {
		//gestion des ?v?nements sur le port :
		//on ne fait rien sauf quand les donn?es sont disponibles
		switch (event.getEventType()) {
			case SerialPortEvent.BI :
			case SerialPortEvent.OE :
			case SerialPortEvent.FE :
			case SerialPortEvent.PE :
			case SerialPortEvent.CD :
			case SerialPortEvent.CTS :
			case SerialPortEvent.DSR :
			case SerialPortEvent.RI :
			case SerialPortEvent.OUTPUT_BUFFER_EMPTY :
				break;
			case SerialPortEvent.DATA_AVAILABLE :
		break;
		}
	}
 
public void envoiTimer1()
	{
		System.out.println("Timer1");
		System.out.println("etapeSEq="+etapeSeq);
switch(etapeSeq)
		{
 
		case 0:
 
						sortie.println("AT"+(char)13);
						System.out.println("AT");
			    		etapeSeq=1;
			    		break;
				case 1:
System.out.println("flux= "+flux);
							if(typeModem == 1) //Second type de modem (1 dans le fichier ini)
							{
								//if(flux.compareTo((char)13+(char)10+"OK"+(char)13+(char)10)==0) // V?rifier que le modem a r?pondu OK
 
								if(flux.compareTo("OK")==0)
								{	
										flux="";
									System.out.println("etapeSeq1ifType1= "+etapeSeq);
									etapeSeq=2;  //Comme le modem a r?pondu OK on continu ? l'?tape suivante
								}
								else //Communication avec le terminal Impossible ! Rev?rifiez les branchements !", vbCritical, "Erreur")
								{
									System.out.println("Communication avec le terminal Impossible !Modem1");
									System.out.println("etapeSeq1elseType1= "+etapeSeq);
 
								}
							}
break;
case 2:
 
						//On envoi au modem le num?ro de destinataire
						//Commande AT --> AT+CMGS="num?ro"
sortie.println("AT+CMGS=+21622000000"+(char)13);
						System.out.println("etapeSeq2= "+etapeSeq);
						etapeSeq=3; //Continu le s?quencement en laissant au modem le temps de r?pondre
						break;
 
				case 3:
 
						System.out.println("flux= "+flux);
if(typeModem== 1)
							{
								System.out.println("flux.length()");
								if(flux.compareTo(">")==0)
								{
									//flux="";
									System.out.println("etapeSeq31= "+etapeSeq);
									etapeSeq=4; //Comme le modem ? r?pondu, on continu le s?quencement
								}
							}
break;
 
			    case 4:
 
			    		//Dans cette derni?re ?tape, il ne reste plus qu'? envoyer au modem le texte du SMS Chr$(26) --> caract?re ASCII de la combinaison de touches CTRL+Z (permet de valider l'envoi du SMS apr?s y avoir entr? le texte du message => propr au terminal)
 
sortie.println("blabla"+(char)26);
System.out.println("etapeSeq4= "+etapeSeq);
			    		etapeSeq=5;
			    		break;
 
			    case 5:
System.out.println("etapeSeq5= "+etapeSeq);
			    	 		etapeSeq=-1;
   break;
 
			}
	}
 
public void envoiTimer3()
	{
		System.out.println("Timer3");
		flux = new String();
		try {
 
			//lecture du buffer et affichage
			flux= (String) fluxLecture.readLine();
			if(flux.isEmpty())
				flux="";
 
			System.out.println("flux= "+flux);
 
		} catch (IOException e) {
			e.printStackTrace();
		}
 
	}
 
public void traiter()
	{
etapeSeq=0;
timer1 = new Timer(150,new ActionListener()
					{
	            public void actionPerformed(ActionEvent evt)
	            {
 
	            	envoiTimer1();
	            	//timer1.stop();
	            }
	        });
			timer1.start();
	timer3 = new Timer(60, new ActionListener()
					{
	            public void actionPerformed(ActionEvent evt)
	            {
		            envoiTimer3();
	            	//timer3.stop();
	           }
	       });
 
			timer3.start();
}
 
}
Merci svp aidez moi je suis bloquée