Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    18

    [Java] Problema comunicazione con porta seriale

    Ciao a tutti, sono nuovo del forum, mi sono inscritto perche l'ho trovato molto serio e interessante.
    A tal proposito voglio postarvi un codice che sto scrivendo e che mi sta dando un problema che nn riesco a risolvere.
    Premetto che la parte relativa alla gui è solo momentanea e la utilizzo come test, sara poi rifatta.

    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import gnu.io.*;
    import java.util.*;

    public class gui extends JFrame {
    gestioneporta g;
    String str="";
    String comando="GET\r";

    ////////////////////////////// Creazione finestra

    JFrame f = new JFrame();
    Container c = f.getContentPane();

    JButton b1 = new JButton("Connect");
    JButton b2 = new JButton("Comando");
    JButton b3 = new JButton("Disconnect");

    JPanel p1 = new JPanel();
    JPanel p2 = new JPanel();
    JPanel p3 = new JPanel();
    JPanel p4 = new JPanel();
    JPanel p5 = new JPanel();
    JPanel p6 = new JPanel();
    JPanel p7 = new JPanel();
    JPanel p8 = new JPanel();
    JTextField ta = new JTextField(10); // ogni numero contiene circa 4 lettere
    JTextField ta2 = new JTextField(20);

    public gui(String s) {

    f.setTitle(s);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Chiude la finestra alla pressione del tasto x rosso
    f.setSize(900,600); // Imposta la dimensione della finestra iniziale

    c.setLayout(new GridLayout(2,2));
    p5.setLayout(new FlowLayout());
    p6.setLayout(new FlowLayout());
    p7.setLayout(new FlowLayout());
    p8.setLayout(new FlowLayout());
    p6.add(ta);
    // p6.add(ta2);
    p5.add(b1);
    p6.add(b2);
    p7.add(b3);
    p1.add(p5);
    p2.add(p6);
    p3.add(p7);
    p4.add(p8);
    //p.add(ta);
    c.add(p1);
    c.add(p2);
    c.add(p3);
    c.add(p4);

    f.setVisible(true);

    MenuBar mb = new MenuBar(); // Crea la barra dei Menu
    Menu m1 = new Menu("File"); // Crea i bottoni sulla barra dei menu
    Menu m2 = new Menu("Opzioni");
    Menu m3 = new Menu("exit");
    MenuItem mi1=new MenuItem ("Save"); // Bottone nella finestra
    MenuItem mi2=new MenuItem ("Close");

    mb.add(m1);
    mb.add(m2);
    mb.add(m3);
    m1.add(mi1); // Entrambe sono nella finestra di File
    m1.add(mi2);
    f.setMenuBar(mb); // Aggiunge la barra menu

    b1.addActionListener(new miolistener());
    b2.addActionListener(new miolistener2());
    b3.addActionListener(new miolistener3());
    ta.addActionListener(new miolistener4());
    }

    // Definizioni delle classi per la gestione dei Listener

    public static void main (String [] args) {

    gui p = new gui("Collaudo");

    }
    public class miolistener implements ActionListener {

    public void actionPerformed(ActionEvent e) {

    g=new gestioneporta();
    //g.connetti(); // Dovrei ottenere come risultato del return la seriale da passare allo scrittore FORSE!!!
    }
    }

    public class miolistener2 implements ActionListener {

    public void actionPerformed (ActionEvent e) {
    // Per ora nn implementato

    }
    }
    public class miolistener3 implements ActionListener {
    public void actionPerformed (ActionEvent e) {
    g.disconnetti();
    }
    }

    // Questo listener è colegato alla jtextfield e alla pressione del tasto invio crea la stringa str contenete il testo scritto nella jtextfield
    // poi invoca il metodo scrivi passandogli il comando come parametro

    public class miolistener4 implements ActionListener {
    public void actionPerformed (ActionEvent e) {
    str=(ta.getText());
    //comando=new String(str);
    g.scrivi(str);
    }
    }

    /////////////////////////////////////////////////////////////////////////////////////////////
    // Gestioneporta()
    /////////////////////////////////////////////////////////////////////////////////////////////


    public class gestioneporta implements SerialPortEventListener { // implements Runnable, SerialPortEventListener

    CommPortIdentifier comid;
    Thread gestore;
    InputStream in;
    OutputStream out;
    Enumeration e;
    boolean trovata=false;
    SerialPort portaseriale;
    String portadefault="COM4";


    public gestioneporta() {

    try{

    // Apre la porta seriale passatagli come parametro stringa

    e=CommPortIdentifier.getPortIdentifiers();
    while (e.hasMoreElements()) {

    comid = (CommPortIdentifier)e.nextElement();

    if(comid.getPortType()== CommPortIdentifier.PORT_SERIAL) {
    if(comid.getName().equals(portadefault)) {
    trovata=true;

    System.out.println("");
    System.out.println("Found serial port "+comid.getName()+" waiting...");
    System.out.println("");

    try {
    portaseriale=(SerialPort)comid.open("Gestioneporte ",3000); // La stringa indiva il nome dell'applicazione che sta usando la porta
    //timeout, se la porta nn è disponibile prima dello scadere dello stesso parte l'eccezione di porta in uso
    try{
    gestore.sleep(1500);
    }
    catch(InterruptedException e) {
    }

    System.out.println("");
    System.out.println("Connected..."); //comid.getName()
    System.out.println("");
    }

    catch (PortInUseException e) {

    System.out.println("");
    System.out.println("Port in use.");
    System.out.println("");
    }

    // Lo stream in ingresso viene collegato alla seriale

    try {
    in = portaseriale.getInputStream();
    }
    catch (IOException e) {
    }

    try {
    portaseriale.addEventListener(this);
    }
    catch (TooManyListenersException e) {

    System.out.println("errore");
    }

    portaseriale.notifyOnDataAvailable(true);
    try {
    portaseriale.setSerialPortParams(9600, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
    }
    catch (UnsupportedCommOperationException e) {
    }

    } // Connetti
    }
    }
    if(!trovata) {

    System.out.println("");
    System.out.println("Port "+portadefault+" not found.");
    System.out.println("");
    }

    }// try iniziale
    catch (Exception e) {
    System.out.println("");
    System.out.println("Connessione gia stabilita");
    System.out.println("");
    }
    }


    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[30];
    int numByte=0;
    try {
    //int c;
    //char car;
    String risposta="";
    //String risp="";

    while (in.available()>0 ) {

    numByte=in.read(readBuffer); // Mi rewstituisce il numero di byte che compongono la risposta
    }


    // Qui viene letta la risposta inviata dal modem ci sono due casi:
    // Il metodo write a riga 323 invia un comando al modem connesso alla porta seriale COM3 e questo risponde, e la sua risposta viene visualizata mediante il println qui sotto.
    // Per inviargli il comando posso seguire 2 strade:
    // Gli do direttamente write(comando.getBytes()) dove la variabile comando è una stringa precedentemente memorizzata
    // Oppure il comando posso mandarglielo come parametro quando viene invovato il metodo scrivi a riga 117. Questo non fa altro che prendere la stringa digitata sulla JTextField
    // che ovviamente deve essere un comando ricosciuto dal modem, e passarlo allo scrittore.
    // Il problema è che in questo secondo caso, che poi è l'unico che dovrà funzionare, il println qui sotto nn mi stampa la risposta che proviene dal modem
    // ma ristampa cio che è stato scritto sulla JtextField.
    // Come posso risolvere questo problema???
    System.out.println("lettore "+ new String (readBuffer)+ numByte);

    }
    catch (IOException e) {}
    }


    } // Serialevent


    /////////////////////////////////////////////////////////////////////////////////////////////
    // Scrivi()
    /////////////////////////////////////////////////////////////////////////////////////////////


    public void scrivi(String s) {

    // Connettiamo lo stream d'uscita alla porta seriale passata come parametro

    try {

    try {

    out=portaseriale.getOutputStream();
    //PrintStream pr=new PrintStream(out);
    }
    catch (IOException e) {
    System.out.println("");
    System.out.println("Impossibile connettere lo stream d'uscita");
    System.out.println("");
    }

    // Settiamo i parametri per la scrittura

    try {

    portaseriale.setSerialPortParams(9600, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
    }
    catch (UnsupportedCommOperationException e) {
    }

    try {
    portaseriale.notifyOnOutputEmpty(true);
    }
    catch (Exception e) {
    System.out.println("");
    System.out.println("Error setting event notification");
    System.out.println(e.toString());
    System.exit(-1);
    }

    try {

    System.out.println("Allo scrittore e' arrivato "+s+ " lettere "+s.length()); // Questo dimostra che il comando inserito arriva esatto fino al metodo

    // Il metodo scrive sull'output collegato alla seriale COM3 alla quale è connesso il modem.

    out.write(comando.getBytes());
    out.flush();

    }
    catch (IOException e) {

    System.out.println("");
    System.out.println("Impossibile scrivere sull'out");
    System.out.println("");
    }
    }
    catch (Exception e) {
    System.out.println("");
    System.out.println("No connected...");
    System.out.println("");
    }
    }


    /////////////////////////////////////////////////////////////////////////////////////////////
    // Disconnetti()
    /////////////////////////////////////////////////////////////////////////////////////////////

    public void disconnetti() {

    try {

    portaseriale.close();

    System.out.println("");
    System.out.println("Disconnected...");
    System.out.println("");
    }

    catch (Exception e) {

    System.out.println("");
    System.out.println("No connected...");
    System.out.println("");
    }
    }
    }
    }





    Non riesco quindi a capire perche se il comando che deve essere mandato al modem tramite out.write() glie lo passo direttamente come stringa predefinita funziona tutto mentre se invece il comando lo acquisisco tramite JTextField e poi glie lo passo non funziona.
    Grazie in anticipo.......

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    18
    Ah scusate, la stringa comando doveva essere inizializzata a ATI\r\n
    Stavo facendo un'altra prova!!!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.