|
 Posté le 08/05/2010 @ 04:44 |
Petit astucien
| Bonjour, j ai un problème dans mon programme java. Je vous dit d'abord que fait ce programme: il lit en temps reel du port com. Ensuite, je n affiche sur la console que les lignes qui commencent par une String: ($GPRMC). Ce que je veux maintenant, c est que au lieu de lire toujours et en temps reel à partir du com, je ne veux lire qu'apres une demande de l user, par exemple juste apres un click ou un appui sur une lettre. Apres, si cela est effectué, je ne veux retourner apres le click (ou eventuellement l appui sur une lettre) que la premiere ligne rencontrée qui commence par la String : $gprmc. (j ai pas besoin de touutes les lignes qui viennent apres) Voici le code que j ai utilisé:
[code]package gpsclass;
import javax.comm.*;
import com.sun.comm.Win32Driver; import java.io.*; import java.util.*; public class Testport extends Thread implements SerialPortEventListener { private CommPortIdentifier portId; private SerialPort serialPort; private BufferedReader fluxLecture; private boolean running; /** * Constructeur qui récupère l'identifiant du port et lance l'ouverture. */ public Testport(String port) { //initialisation du driver Win32Driver w32Driver = new Win32Driver(); w32Driver.initialize(); //récupération de l'identifiant du port try { portId = CommPortIdentifier.getPortIdentifier(port); } catch (NoSuchPortException e) { } //ouverture du port try { serialPort = (SerialPort) portId.open("ModeEvenement", 2000); } catch (PortInUseException e) { } //récupération du flux try { fluxLecture = new BufferedReader( new InputStreamReader(serialPort.getInputStream())); } catch (IOException e) { } //ajout du listener try { serialPort.addEventListener(this); } catch (TooManyListenersException e) { } //paramétrage du port serialPort.notifyOnDataAvailable(true); try { serialPort.setSerialPortParams( 9600, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN); } catch (UnsupportedCommOperationException e) { } System.out.println("port ouvert, attente de lecture");
} public void run() { running = true; while (running) { try { Thread.sleep(2000); } catch (InterruptedException e) { } } //fermeture du flux et port try { fluxLecture.close(); } catch (IOException e) { } serialPort.close(); } /** * Méthode de gestion des événements. */ 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 : String codeBarre = new String();
try { //lecture du buffer et affichage codeBarre = (String) fluxLecture.readLine(); if (codeBarre.startsWith("$GPRMC")) { System.out.println(codeBarre); }
}catch (IOException e) { } break; } } /** * Permet l'arrêt du thread */ public void stopThread() { running = false; }/** * Méthode principale de l'exemple. */ /** * @param args */ public static void main(String[] args) { //Récuperation du port en argument //String port = args[0]; //lancement de l'appli Testport modeEve=new Testport("COM7"); modeEve.start(); //"interface utilisateur" System.out.println("taper q pour quitter"); //construction flux lecture BufferedReader clavier = new BufferedReader(new InputStreamReader(System.in)); //lecture sur le flux entrée. try { String lu = clavier.readLine(); while (!lu.equals("q")) { } } catch (IOException e) { } modeEve.stopThread(); } } [/code]
Voila j espere que vous pouvez m aider. Merci d avance. Modifié par almofa237 le 08/05/2010 13:11
|
|
|
|
|
|
Posté le 08/05/2010 à 13:08 |
Petit astucien
| Bonjour, voici l'idée, reste à la convertir en java:
si l utilisateur appui sur un caractère --> lire du port com --> afficher la 1ere ligne qui commence par une String ($gprmc) --> sortir.
Voila l idée, mais maintenant il faut comment traduire cela en Java.
Merci. |
|
Posté le 08/05/2010 à 18:12 |
Astucien
| almofa237 a écrit :
Bonjour, voici l'idée, reste à la convertir en java:
si l utilisateur appui sur un caractère --> lire du port com --> afficher la 1ere ligne qui commence par une String ($gprmc) --> sortir.
Voila l idée, mais maintenant il faut comment traduire cela en Java.
Merci.
Bonjour,
Je le vois comme ça:
tu déclare un attribut membre privé booléen "enregistre" initialisé a (vrai faux) en fonction de si tu veux enregistrer dès le départ ou apres appuie sur 'E'
Tu modifies ta boucle
try { String lu;
do
{
lu= clavier.readLine();
if (lu.equals("e"))
{
enregistre = !enregistre // enregistre est un menmbre de classe booléen;
}
}while (!lu.equals("q")) ; } catch (IOException e) {
//pense a mettre des System.out.println dans tes catch pour voir si il y a un problême}
et ensuite tu modifies serialevent:
...
try { //lecture du buffer et affichage codeBarre = (String) fluxLecture.readLine(); if (codeBarre.startsWith("$GPRMC") && enregistre == true) { System.out.println(codeBarre); }
...
|
|
Posté le 08/05/2010 à 21:09 |
Petit astucien
| Je te remercie pour le temps que tu as consacré à mon probleme :)
Merci, j ai testé et ca marche :d
Maintenant je veux que l exécution s arrete une fois qu une ligne valide est trouvé. (ligne commence par $gprmc)
algorithme:
Lire du port com --> ligne valide ? --> oui--> l afficher dans la console et arreter l execution (je ne veux plus appuyer sur q pour sortir, je veux que ca soit automatique apres avoir trouvé une ligne valide)
Lire du port com --> ligne valide ? --> non--> continuer à lire, jusqu a trouver une ligne valide
Merci enormement
|
|
Posté le 08/05/2010 à 22:02 |
Petit astucien
| En fait, voila ce que je veux: je veux travailler directement sur les resultats dans le buffer. Est ce que c est possible deja ?
La ligne valide recue (que j ai expliqué dans le message precedent) dans la console (en buffer), une fois trouvée, je veux ensuite appliquer une methode "split" sur cette ligne etc...
Merci :D |
|
Posté le 08/05/2010 à 23:38 |
Astucien
| Ta ligne valide se trouve dans codeBarre c'est ça?
Eh bien tu peut faire tes traitements dessus? |
|
Posté le 08/05/2010 à 23:45 |
Petit astucien
| Oui c est ce que je veux.
maintenant comment puis je arreter l execution automatiquement comme j ai expliqué dans le message precedent
algorithme:
Lire du port com --> ligne valide ? --> oui--> l afficher dans la console et arreter l execution (je ne veux plus appuyer sur q pour sortir, je veux que ca soit automatique apres avoir trouvé une ligne valide)
Lire du port com --> ligne valide ? --> non--> continuer à lire, jusqu a trouver une ligne valide
Un graaand merci a toi :D :D |
|
Posté le 09/05/2010 à 15:20 |
Astucien
| almofa237 a écrit :
Oui c est ce que je veux.
maintenant comment puis je arreter l execution automatiquement comme j ai expliqué dans le message precedent
algorithme:
Lire du port com --> ligne valide ? --> oui--> l afficher dans la console et arreter l execution (je ne veux plus appuyer sur q pour sortir, je veux que ca soit automatique apres avoir trouvé une ligne valide)
Lire du port com --> ligne valide ? --> non--> continuer à lire, jusqu a trouver une ligne valide
Un graaand merci a toi :D :D
Tu utilise un booléen "trouver" que tu mets a true de la même façon que "enregisre":
do
{
...
}while (!lu.equals("q")&& trouve==false) ;
et dans la foncrtion qui detecte la ligne tu mets trouve à true:
if (codeBarre.startsWith("$GPRMC")) { System.out.println(codeBarre); trouve=true; }
|
|
Posté le 09/05/2010 à 16:26 |
Petit astucien
| Re bonjour,
J ai pu resoudre le probleme. j ai joué sur l affichage.
j ai utilisé "substring" et ca a marché.
Merci beaucoup pour ton aide. |
|