envoyer des fax avec Java

testeurforme
envoyer des fax avec Java

Bonjour

tout d'abord j'espere ne pas m'etre trompé de forum ... (dans le cas contraire je vous prie de m'en excuser...)

J'ai comme projet de faire un logiciel en java afin d'envoyer des fax.
Pour cela j'ai telecharger l'aPI Java(tm) Communication API et j'ai trouver quelques exemples ...
Bien que mon programme se compile et s'execute correctement (en tout cas je n'ai pas d'erreur ni à la compilation ni a l'execution) je n'arrive pas a envoyer des commandes Hayes à mon modem.
Ce qui est d'autant plus etrange c'est que lorsque je lance cette classe, et qu'ensuite j'interroge mon modem via Windows, ce dernier ne repond plus! C'est donc que mes commandes ont quand meme eu un effet sur le modem...

Je vous met ci dessous le code que j'utilise , si quelque'un a une idée de ce que je dois faire (ou ne pas faire) ...
Dans tous les cas je vous remercie d'avoir pris la peine de lire mon post !
bonne journée

le lanceur :

public class TestSimpleWrite {

public static void main(String arg[]){
SimpleWrite testeurPort = new SimpleWrite();
testeurPort.setDelaiObtentionPort(10000);
testeurPort.initWin32Driver();
testeurPort.AffichageListPort();
testeurPort.getPort("COM1");
testeurPort.lanceCommande();
testeurPort.libereSerialPort();
}
}

la classe qui me pose problème

import com.sun.comm.Win32Driver;
import java.io.*;
import java.util.*;
import javax.comm.*;

public class SimpleWrite {
public Enumeration portList;
public CommPortIdentifier portId;
public SerialPort serialPort;
public OutputStream outputStream;
private int delaiObtentionPort; //milliseconde
private int bauds;

public SimpleWrite() {
portList = CommPortIdentifier.getPortIdentifiers();
}

public void setDelaiObtentionPort(int delai) {
delaiObtentionPort = delai;
}

public void setBaud(int newBaud) {
bauds = newBaud;
}

public void AffichageListPort() {
CommPortIdentifier portCourant = null;
System.out.println("Affichage de la liste des ports ");
boolean fin = false;
while (!fin) {
try {
if (portList.hasMoreElements()) {
portCourant = (CommPortIdentifier) portList.nextElement();
System.out.println(portCourant.getName());
}
else {
fin = true;
}
}
catch (NoSuchElementException ex) {
System.out.println("Exception plus de port ");
}
}
}

public void initWin32Driver() {
System.out.println("initialisation du driver ");
Win32Driver w32Driver = new Win32Driver();
w32Driver.initialize();
}

public void libereSerialPort() {
serialPort.close();
}

public void paramSerialPort() {
try {
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
serialPort.setSerialPortParams(bauds, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
}
catch (UnsupportedCommOperationException ex) {
System.out.println("Erreur Paramatrage du port '" + serialPort.getName() + "' " + ex.toString());
ex.printStackTrace();
}

serialPort.notifyOnDataAvailable(true);
serialPort.notifyOnCarrierDetect(true);
serialPort.notifyOnDataAvailable(true);
serialPort.notifyOnBreakInterrupt(true);
serialPort.notifyOnCTS(true);
serialPort.notifyOnDSR(true);
serialPort.notifyOnFramingError(true);
serialPort.notifyOnOutputEmpty(true);
serialPort.notifyOnOverrunError(true);
serialPort.notifyOnParityError(true);
serialPort.notifyOnRingIndicator(true);

}

public void lanceCommande() {
String m0 = "AT";
String m1 = "ATE1";
String m2 = "ATI";
String m3 = "AT&Z0=T12345678";
String m4 = "ATD0140127674\n";
String m5 = "ATDS=0";

try {
outputStream = serialPort.getOutputStream();
System.out.println("Recuperation du outPutStream : OK ");
}
catch (IOException e) {
System.out.println("Erreur recuperation outPutStream " + e.toString());
e.printStackTrace();
}
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
System.out.println("Parametrage du modem : OK");
}
catch (UnsupportedCommOperationException e) {
System.out.println("Impossible de parametrer " + e.toString());
e.printStackTrace();
}
try {
outputStream.write(m0.getBytes());
System.out.println("ecriture de m1 (" + m0 + ") OK");

outputStream.write(m1.getBytes());
System.out.println("ecriture de m2 (" + m1 + ") OK");

outputStream.write(m2.getBytes());
System.out.println("ecriture de m0 (" + m2 + ") OK");

outputStream.write(m3.getBytes());
System.out.println("ecriture de m3 (" + m3 + ") OK");

outputStream.write(m4.getBytes());
System.out.println("ecriture de m4 (" + m4 + ") OK");

outputStream.write(m5.getBytes());
System.out.println("ecriture de m5 (" + m5 + ") OK");

outputStream.close();

}
catch (IOException e) {
System.out.println("Impossible d'ecrire " + e.toString());
e.printStackTrace();
}
}

public void getPort(String nomPort) {
CommPortIdentifier portId = null;
try {
portId = CommPortIdentifier.getPortIdentifier(nomPort);
}
catch (NoSuchPortException ex) {
System.out.println("erreur Port '" + nomPort + "' " + ex.toString());
ex.printStackTrace();
}
try {
serialPort = (SerialPort) portId.open("Mon_Appli", delaiObtentionPort);
System.out.println("Obtention du port '" + serialPort.getName() + "' : OK");
}
catch (PortInUseException ex) {
System.out.println("erreur Port '" + nomPort + "' deja ouvert : " + ex.toString());
ex.printStackTrace();
}
}
}

fredericmazue

Quote:

Ce qui est d'autant plus etrange c'est que lorsque je lance cette classe, et qu'ensuite j'interroge mon modem via Windows, ce dernier ne repond plus! C'est donc que mes commandes ont quand meme eu un effet sur le modem...

Pas sûr. Tu peux très bien bloquer le port série sans atteindre ton modem pour autant ;) Ca c'est déjà vu :lol:
mais je ne pense pas que ça soit le cas ici.

Je connais très bien la programmation du port série Windows, mais je ne l'ai jamais fait avec Java.
Toutefois il me semble que tu ne fais qu'écrire sur le port sans jamais le lire.

Quand tu envoies une commande Hayes à un modem, un simple AT, le modem va te répondre OK (+ un retour chariot)
Tu dois retirer ces octets du port avant d'en envoyers d'autres. Comme je disais tu ne lit pas les octets il me semble:

 try {
outputStream = serialPort.getOutputStream();
System.out.println("Recuperation du outPutStream : OK ");
}
catch (IOException e) {
System.out.println("Erreur recuperation outPutStream " + e.toString());
e.printStackTrace();
} 

tu récuperes le outputStream, c'est une chose, mais faut lire les octets dedans ce qui est une autre chose. Et tu dois les lire chaque fois que tu as envoyé une commande Hayes et même tout le temps en fait car le modem lui même peut très bien décider de t'envoyer des octets (RING par exelmple)

La méthode est normalement de mettre outPutStream.read() dans un thread.

Je dis normalement parce que peut être Java le fait automatiquement (en .Net 2.0 c'est automatisé), mais moi je ne l'ai jamais fait en Java alors je ne sais pas exactement.
Si c'est automatisé, alors c'est sans doute dans le gestionnaire d'évenement onDataAvailable que tu dois faire outputStream.read(/* ... */)

testeurforme

salut fredericmazue

tout d'abord merci pour ta reponse rapide...
Effectivement maintenant que tu soulignes ce problème d'ecriture/lecture, des souvenirs me reviennent (j'avais fait cette appli en VB il y a longtemps,et c'etait beaucoup plus simple !)
Il tout a fait fort possible qu'il faille récuperer imperativement les données envoyées par le fax!
Or dans mon test je ne fais (comme tu l'as si bien souligné!) que des ecritures!
Je vais tester ca!
merci encore pour cette remarque
a+

testeurforme

bon ...

J'ai modifié mon programme afin de lire la reponse du modem a chaque fois que je lui envoie une commande....
Lorsque "j'ecoute" une hypothetique reponse, mon programme ne rend pas la main et attend "une reaction" de la part du modem. Si j'arret mon programme le mmodem est de nouveau dispo
Par contre l'envoie d'une commande au modem ne semble pas du tout fonctionner et meme fait plus ou moins planter le modem (obliger de l'eteindre pour que la commande 'interroger le modem' dans windows me donne une reponse.
Plusieurs questions restent donc en suspends :

1) Pourquoi la lecture [via inputStream = serialPort.getInputStream() ]est elle "bloquante" et pas l'ecriture [outputStream = serialPort.getOutputStream() ]

2) Faut il envoyer commencer le pilotage en enoyant une commande particuliere au modem ?

3) dois je faire un thread qui ecoute en permanence une reponse du modem ou puis je faire des sequences du style "envoie de commande puis lecture de la reponse"

4)comment savoir si ma commande est bien passée etant donné que lorsque le programme s'arrete, je dois eteindre rallumé le modem (lorsque j'ai passé une commande)

5) Dans l'api javacomm20-win32 il y a une classe de lecture et une classe d'ecriture (je me suis basé dessus pour ecrire mon simulacre de code lol)
J'aimerai bien tester la classe lecture mais comment faire etant donné que si je la lance, je ne peut pas utiliser un autre prog qui ecrit (genre hyperterminal de windows) etant donné que le port est deja ouvert (par la classe de lecture)

je remets ma classe que j'ai modifié en ajoutant la lecture d'une reponse
ainsi que les deux classes fournis dans l'aPI

ma classe qui ne fonctionne pas :

/**
* Created by IntelliJ IDEA.
* User: JSC
* Date: 4 déc. 2006
* Time: 13:51:07
* To change this template use File | Settings | File Templates.
* http://christophej.developpez.com/tutoriel/java/javacomm/
**/

import com.sun.comm.Win32Driver;

import java.io.*;
import java.util.*;
import javax.comm.*;

public class SimpleWrite {
public Enumeration portList;
public CommPortIdentifier portId;
public SerialPort serialPort;
public OutputStream outputStream;
public InputStream inputStream;
private int delaiObtentionPort; //milliseconde
private int bauds;

public SimpleWrite() {
portList = CommPortIdentifier.getPortIdentifiers();
}

public void setDelaiObtentionPort(int delai) {
delaiObtentionPort = delai;
}

public void setBaud(int newBaud) {
bauds = newBaud;
}

public void AffichageListPort() {
CommPortIdentifier portCourant = null;
System.out.println("Affichage de la liste des ports ");
boolean fin = false;
while (!fin) {
try {
if (portList.hasMoreElements()) {
portCourant = (CommPortIdentifier) portList.nextElement();
System.out.println(portCourant.getName());
}
else {
fin = true;
}
}
catch (NoSuchElementException ex) {
System.out.println("Exception plus de port ");
}
}
}

public void initWin32Driver() {
System.out.println("initialisation du driver ");
Win32Driver w32Driver = new Win32Driver();
w32Driver.initialize();
}

public void libereSerialPort() {
serialPort.close();
}

public void paramSerialPort() {
try {
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
serialPort.setSerialPortParams(bauds, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
}
catch (UnsupportedCommOperationException ex) {
System.out.println("Erreur Paramatrage du port '" + serialPort.getName() + "' " + ex.toString());
ex.printStackTrace();
}

serialPort.notifyOnDataAvailable(true);
serialPort.notifyOnCarrierDetect(true);
serialPort.notifyOnDataAvailable(true);
serialPort.notifyOnBreakInterrupt(true);
serialPort.notifyOnCTS(true);
serialPort.notifyOnDSR(true);
serialPort.notifyOnFramingError(true);
serialPort.notifyOnOutputEmpty(true);
serialPort.notifyOnOverrunError(true);
serialPort.notifyOnParityError(true);
serialPort.notifyOnRingIndicator(true);

}

public void lanceCommande() {
String m0 = "AT,\n";
String m1 = "ATE1";
String m2 = "ATI";
String m3 = "AT&Z0=T12345678";
String m4 = "ATD0140127674\n";
String m5 = "ATDS=0";
int numBytes;

try {
outputStream = serialPort.getOutputStream();
System.out.println("Recuperation du outPutStream : OK ");
}
catch (IOException e) {
System.out.println("Erreur recuperation outPutStream " + e.toString());
e.printStackTrace();
}
try {
inputStream = serialPort.getInputStream();
System.out.println("InputStream créé");
}
catch (IOException e) {
System.out.println("Erreur recuperation inPutStream " + e.toString());
e.printStackTrace();
}
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
System.out.println("Parametrage du modem : OK");
}
catch (UnsupportedCommOperationException e) {
System.out.println("Impossible de parametrer " + e.toString());
e.printStackTrace();
}
try {

outputStream.write(m0.getBytes());
System.out.println("ecriture de m1 (" + m0 + ") OK");
System.out.print("Tentative de lecture");
byte[] readBuffer = new byte[20];
numBytes = inputStream.read(readBuffer);
System.out.print("readbuffer = " + new String(readBuffer));
System.out.print("numBytes = " + numBytes);

outputStream.write(m1.getBytes());
System.out.println("ecriture de m2 (" + m1 + ") OK");

outputStream.write(m2.getBytes());
System.out.println("ecriture de m0 (" + m2 + ") OK");

outputStream.write(m3.getBytes());
System.out.println("ecriture de m3 (" + m3 + ") OK");

outputStream.write(m4.getBytes());
System.out.println("ecriture de m4 (" + m4 + ") OK");

outputStream.write(m5.getBytes());
System.out.println("ecriture de m5 (" + m5 + ") OK");

outputStream.close();

}
catch (IOException e) {
System.out.println("Impossible d'ecrire " + e.toString());
e.printStackTrace();
}
}

public void getPort(String nomPort) {
CommPortIdentifier portId = null;
try {
portId = CommPortIdentifier.getPortIdentifier(nomPort);
}
catch (NoSuchPortException ex) {
System.out.println("erreur Port '" + nomPort + "' " + ex.toString());
ex.printStackTrace();
}
try {
serialPort = (SerialPort) portId.open("Mon_Appli", delaiObtentionPort);
System.out.println("Obtention du port '" + serialPort.getName() + "' en ecriture : OK");
}
catch (PortInUseException ex) {
System.out.println("erreur Port '" + nomPort + "' deja ouvert : " + ex.toString());
ex.printStackTrace();
}
}
}

le lanceur (main)

import javax.comm.CommPortIdentifier;

/**
* Created by IntelliJ IDEA.
* User: JSC
* Date: 4 déc. 2006
* Time: 14:11:32
* To change this template use File | Settings | File Templates.
*/
public class TestSimpleWrite {

public TestSimpleWrite(){

}
public static void main(String arg[]){

//SimpleRead reader = new SimpleRead("COM1");

SimpleWrite testeurPort = new SimpleWrite();
testeurPort.setDelaiObtentionPort(10000);
testeurPort.initWin32Driver();
testeurPort.AffichageListPort();
testeurPort.getPort("COM1");
testeurPort.lanceCommande();
testeurPort.libereSerialPort();
}
}

et les classe de l'aPI

/*
* @(#)SimpleRead.java 1.12 98/06/25 SMI
*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license
* to use, modify and redistribute this software in source and binary
* code form, provided that i) this copyright notice and license appear
* on all copies of the software; and ii) Licensee does not utilize the
* software in a manner which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
* LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE
* SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS
* BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
* HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING
* OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control
* of aircraft, air traffic, aircraft navigation or aircraft
* communications; or in the design, construction, operation or
* maintenance of any nuclear facility. Licensee represents and
* warrants that it will not use or redistribute the Software for such
* purposes.
*/

import java.io.*;
import java.util.*;
import javax.comm.*;

public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;

InputStream inputStream;
SerialPort serialPort;
Thread readThread;

public static void main(String[] args) {
portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
// if (portId.getName().equals("COM1")) {
if (portId.getName().equals("/dev/term/a")) {
SimpleRead reader = new SimpleRead();
}
}
}
}

public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {}
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {}
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {}
serialPort.notifyOnDataAvailable(true);
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
readThread = new Thread(this);
readThread.start();
}

public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {}
}

public void serialEvent(SerialPortEvent event) {
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:
byte[] readBuffer = new byte[20];

try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
System.out.print(new String(readBuffer));
} catch (IOException e) {}
break;
}
}
}

/*
* @(#)SimpleWrite.java 1.12 98/06/25 SMI
*
* Copyright (c) 1998 Sun Microsystems, Inc. All Rights Reserved.
*
* Sun grants you ("Licensee") a non-exclusive, royalty free, license
* to use, modify and redistribute this software in source and binary
* code form, provided that i) this copyright notice and license appear
* on all copies of the software; and ii) Licensee does not utilize the
* software in a manner which is disparaging to Sun.
*
* This software is provided "AS IS," without a warranty of any kind.
* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
* INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND
* ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
* LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE
* SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS
* BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
* HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING
* OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
* This software is not designed or intended for use in on-line control
* of aircraft, air traffic, aircraft navigation or aircraft
* communications; or in the design, construction, operation or
* maintenance of any nuclear facility. Licensee represents and
* warrants that it will not use or redistribute the Software for such
* purposes.
*/

import java.io.*;
import java.util.*;
import javax.comm.*;

public class SimpleWrite {
static Enumeration portList;
static CommPortIdentifier portId;
static String messageString = "Hello, world!\n";
static SerialPort serialPort;
static OutputStream outputStream;

public static void main(String[] args) {
portList = CommPortIdentifier.getPortIdentifiers();

while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
// if (portId.getName().equals("COM1")) {
if (portId.getName().equals("/dev/term/a")) {
try {
serialPort = (SerialPort)
portId.open("SimpleWriteApp", 2000);
} catch (PortInUseException e) {}
try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {}
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
try {
outputStream.write(messageString.getBytes());
} catch (IOException e) {}
}
}
}
}
}

fredericmazue

Quote:

Par contre l'envoie d'une commande au modem ne semble pas du tout fonctionner et meme fait plus ou moins planter le modem (obliger de l'eteindre pour que la commande 'interroger le modem' dans windows me donne une reponse.

Evidemment ça ne devrait pas. Si tu envoies un AT, tu dois voir les leds du modem clignoter gentiment, ce qui signifie qu'il te répond par un OK.

Mais ATTENTION, je vois déjà un problème potentiel. Je ne connais pas les classes Java qui travaillent avec le modem (et heureusement pour moi). Mais je ne peux m'empêcher de supposer que c'est mal foutu et que quand tu envoies un AT c'est n'est pas AT que tu envoies, mais AT en UNICODE. Et là évidement, le modem il risque de pas trop aimer. Il faut donc que tu commences par vérifier ce point et que tu le règles si nécessaire.

Quote:

1) Pourquoi la lecture [via inputStream = serialPort.getInputStream() ]est elle "bloquante" et pas l'ecriture [outputStream = serialPort.getOutputStream() ]

Sans doute parce que les classes sont mal foutues et que la lecture dans un thread séparé n'est pas automatique. Tu va donc devoir placer ton code de lecture dans un thread.

Quote:
2) Faut il envoyer commencer le pilotage en enoyant une commande particuliere au modem ?

Normalement non.
Quote:
3) dois je faire un thread qui ecoute en permanence une reponse du modem

Oui, très clairement.
Quote:
ou puis je faire des sequences du style "envoie de commande puis lecture de la reponse"

C'est une mauvaise approche. D'abord parce que tu n'es pas maître du temps de réponde du modem. Ensuite parce que le modem lui même peut envoyer des octets sans que tu ais envoyé une commande d'abord. Par exemple le modem peut t'envoyer RING si quelqu'un t'appelle sur la ligne.
La programmation du port série ne peut être solide QUE si elle est totalement asynchrone, c'est à dire que si tout est dans des threads, MEME ta routine d'écriture (C'est important)
Quote:

4)comment savoir si ma commande est bien passée etant donné que lorsque le programme s'arrete, je dois eteindre rallumé le modem (lorsque j'ai passé une commande)

Tu le sais. Si tu dois éteindre le modem ça a foiré. Attention à l'UNICODE.

Quote:

5) J'aimerai bien tester la classe lecture mais comment faire etant donné que si je la lance, je ne peut pas utiliser un autre prog qui ecrit (genre hyperterminal de windows) etant donné que le port est deja ouvert (par la classe de lecture)

Tu peux pas en dehors de ton programme. Comme tu le dis pertinement. Ton programme squatte le port.

Je n'ai pas le temps de regarder ton code pour l'instant. J'en suis navré. Peut être plus tard.
Mais si tu appliques l'ensemble de mes conseils, la situation devrait se débloquer pour toi, sans doute en grande partie.

testeurforme

merci beaucoup pour tes reponses!!!
je vais regarder tout ca
a+

testeurforme

je suis conscient de mes lacunes mais pourrais tu m'expliquer ce que tu sous entedn par le problème de l'UNICODE?

merci beaucoup
a+

fredericmazue

Quote:

pourrais tu m'expliquer ce que tu sous entedn par le problème de l'UNICODE?

Très simple

Quand tu veux envoyer AT au modem, tu veux envoyer deux caractères texte, ou ASCII, A puis T, ce qui correspond à deux octets, un pour chaque lettre.

Mais tout Java, donc ses OutputSream aussi, travaille avec UNICODE par défaut.
UNICODE code les caractères avec DEUX octets. Donc quand tu écris AT via un stream Java, à priori tu envoies QUATRE octets au modem. Il est sûr que tu ne lui envoies pas A et T à la suite et il est sûr qu'il va perdre les pédales.

Pour régler ça, tu dois instancier tes stream (ouput ET input) en passant une instance de classe Charset au constructeur des streams.

Une autre bonne solution c'est de prendre un langage qui va bien. Autre chose que Java quoi ;)

salihovic

j'ai testé les classes que tu dis ne marche pas et sa marche
c a d ne bloke pas le modem
mais je sai pas comment envoyer des commandes AT pour envoyer des fax
le problème est comment envoyer les fax!!!
si vous savez comment merci de m'ecrire un simple code source

testeurforme

salihovic wrote:
j'ai testé les classes que tu dis ne marche pas et sa marche
c a d ne bloke pas le modem
mais je sai pas comment envoyer des commandes AT pour envoyer des fax
le problème est comment envoyer les fax!!!
si vous savez comment merci de m'ecrire un simple code source

Salut "salihovic" ,

pour ma part j'ai abandonné l'idée de piloter le modem, j'ai préféré utilisé l'api RFAX http://www.java4less.com/java_fax.htm , qui fonctionne pas trop mal. En faite elle foncitonne partiellement puisque la fonction d'envoie de fichier htmlne fonctionne pas. J'ai du créer une classe qui interpretait le code html a l'aide d'un JTextPane (ptite dedicasse a Mr Mazue ). a part ce details (important ...) l'api fonctionne correctement
a+

fredericmazue

Message à salihovic:

J'ai bien reçu toutes tes demandes en courrier privé, mais je ne peux y répondre. J'ai plus de courrier à traiter qu'un ministre, merci de le comprendre.

Quant à écrire carrément les bouts de code qu'il te faut, je n'en ai évidemment pas le temps. Vraiment navré.
(Ni l'envie en Java...)

Pour revenir à la discussion

Quote:
j'ai testé les classes que tu dis ne marche pas et sa marche
c a d ne bloke pas le modem
mais je sai pas comment envoyer des commandes AT pour envoyer des fax
le problème est comment envoyer les fax!!!

Faut savoir. Si ça marche, alors quel est le problème spécifique aux commandes AT Fax ? Ce sont des commandes AT comme les autres.
Encore faut -il basculer le modem en mode fax, car il est par défaut en mode données normalement.
Mais ça si tu as lu ta doc, tu dois déjà le savoir