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);
}
}
String
to Hex:
Integer.decode(hexString);
String
への16進数:
Integer.toHexString(integer);
String to Hexadecimalの場合、
Integer.decode("0x4d2"); // output is 1234
(16進数にデコードするには、文字列に「0x」を追加(プレフィックス)する必要があります)
16進数から文字列、
Integer.toHexString(1234); // output is 4d2