7

Javaでシリアルポートとデータを送受信するための簡単なプログラムを作成しました。シリアルポートデバイスをループバックテスト(RxからTx)で接続します。それはうまくいきます。しかし、16進データをシリアルポートと受信シリアルポートに送受信できません。私のデバイスにはFT232BLチップが使用されています。シリアルポートデバイスとの16進データの送受信に必要なdllまたはその他のライブラリはありますか。私のコードは以下の通りです。

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);
    }
}
4

2 に答える 2

22

String16進数へ:

Integer.decode(hexString);

16進数String

Integer.toHexString(integer);
于 2013-02-22T09:32:57.680 に答える
9

文字列から16進数の場合、

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

(16進数にデコードするには、文字列に「0x」を追加(プレフィックス)する必要があります)

16進数から文字列

Integer.toHexString(1234); // output is 4d2
于 2013-10-22T11:05:58.617 に答える