2013-02-22 19 views
5

Ho realizzato un programma semplice per inviare e ricevere dati sulla porta seriale in java. Collego il dispositivo della porta seriale con il test del loopback (da Rx a Tx). funziona bene ma non riesco a inviare e ricevere dati esadecimali alla porta seriale e a ricevere la porta seriale. Nel mio dispositivo ci sono chip FT232BL usati. Quindi c'è qualche DLL o altra libreria richiesta per inviare e ricevere dati esadecimali sul dispositivo della porta seriale. il mio codice è sottoCome convertire String in Hex e Hex in String?

enter code here 
package x.rayimagecapture; 

import gnu.io.CommPort; 
import gnu.io.CommPortIdentifier; 
import gnu.io.SerialPort; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class TwoWaySerialComm extends JPanel implements ActionListener { 

    OutputStream out; 
    private javax.swing.JButton btn; 
    private javax.swing.JScrollPane jScrollPane1; 
    public static javax.swing.JLabel jLabel1; 
    public static javax.swing.JTextField textField; 
    public static boolean flag = false; 
    public static int count = 50; 
// TimerWindow tmr=new TimerWindow(); 
    public static Timer tmr = new Timer(1000, new ActionListener() { 
     public void actionPerformed(ActionEvent evt) { 
         count++; 
      jLabel1.setText("" + count); 
     } 
    }); 

    public TwoWaySerialComm() { 
     super(); 
     textField = new javax.swing.JTextField(); 
     btn = new javax.swing.JButton(); 
     jScrollPane1 = new javax.swing.JScrollPane(); 
     jLabel1 = new javax.swing.JLabel(); 
     textField.setText(""); // NOI18N 
//  tmr.setDelay(0); 

     btn.setFont(new java.awt.Font("Tahoma", 0, 12)); // NOI18N 
     btn.setText("Send"); // NOI18N 
     btn.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       serialwrite(); 
      } 
     }); 

//  textArea.setColumns(20); 
//  textArea.setRows(20); 
//  textArea.setTabSize(0); 
     jScrollPane1.setViewportView(jLabel1); 

     javax.swing.GroupLayout panelLayout = new javax.swing.GroupLayout(this); 
     this.setLayout(panelLayout); 
     panelLayout.setHorizontalGroup(
       panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(panelLayout.createSequentialGroup() 
       .addComponent(textField, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addComponent(btn, javax.swing.GroupLayout.DEFAULT_SIZE, 84, Short.MAX_VALUE) 
       .addContainerGap()) 
       .addComponent(jScrollPane1)); 
     panelLayout.setVerticalGroup(
       panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(panelLayout.createSequentialGroup() 
       .addGroup(panelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(textField, javax.swing.GroupLayout.PREFERRED_SIZE, 47, javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(btn, javax.swing.GroupLayout.PREFERRED_SIZE, 37, javax.swing.GroupLayout.PREFERRED_SIZE)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 218, Short.MAX_VALUE))); 
    } 

    void connect(String portName) throws Exception { 
     CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName); 
     if (portIdentifier.isCurrentlyOwned()) { 
      System.out.println("Error: Port is currently in use"); 
     } else { 
      CommPort commPort = portIdentifier.open(this.getClass().getName(), 2000); 

      if (commPort instanceof SerialPort) { 
       SerialPort serialPort = (SerialPort) commPort; 
       serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); 
       serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE); 
       InputStream in = serialPort.getInputStream(); 
       out = serialPort.getOutputStream(); 

       (new Thread(new SerialReader(in))).start(); 
//    (new Thread(new SerialWriter(out))).start(); 

      } else { 
       System.out.println("Error: Only serial ports are handled by this example."); 
      } 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     serialwrite(); 
    } 

    public void serialwrite() { 
     try { 
      this.out.write(textField.getText().toString().getBytes()); 
      count = 00; 
//   tmr.start(); 
      tmr.start(); 
      this.out.flush(); 
     } catch (IOException ex) { 
      Logger.getLogger(TwoWaySerialComm.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    /** 
    * 
    */ 
    public static class SerialReader implements Runnable { 

     InputStream in; 

     public SerialReader(InputStream in) { 
      this.in = in; 
     } 

     public void run() { 
      byte[] buffer = new byte[1024]; 
      int len = -1; 
      try { 
       while ((len = this.in.read(buffer)) != -1) { 
//     textArea.append(" " + new String(buffer, 0, len)); 
        String str = new String(buffer, 0, len); 
        System.out.print(str); 
        if (!str.isEmpty()) { 
//      tmr.stop(); 
        } 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    /** 
    * 
    */ 
    public static class SerialWriter implements Runnable { 

     OutputStream out; 

     public SerialWriter(OutputStream out) { 
      this.out = out; 
     } 

     public void run() { 
      try { 
       int c = 0; 
       while ((c = System.in.read()) != -1) { 
//     this.out.write(c); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     TwoWaySerialComm tws = new TwoWaySerialComm(); 
     JFrame frame = new JFrame(); 
     frame.setSize(400, 300); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(tws); 
     try { 
      tws.connect("COM11"); 
     } catch (Exception ex) { 
      Logger.getLogger(TwoWaySerialComm.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     frame.setVisible(true); 
    } 
} 

risposta

20

String a Hex:

Integer.decode(hexString); 

Hex a String:

Integer.toHexString(integer); 
+2

'toHexString (i)' non è un metodo in classe 'STRING', Penso che tu intendessi 'Integer' – raffian

8

Per stringa esadecimale,

Integer.decode("0x4d2"); // output is 1234 

("0 x" deve essere aggiunto (prefisso) per stringa per la decodifica di esadecimale)

esadecimale in stringa,

Integer.toHexString(1234); // output is 4d2 
+0

Qualche soluzione per i formati ARGB che sono più grandi del limite int? 'Integer.decode (0xffff6600)' genera 'NumberFormatException int non valido int:" 0xffff6600 "'. Il wrapping di -39424 va bene perché mCanvas.drawColor (-39424) funziona. È solo 'Integer.decode' che non può gestire numeri più grandi. @CarlJohn – gotube

+1

@gotube decode prende una stringa come argomento, non come int. Il problema non è un numero troppo grande. – Mordechai