我编写了一个简单的程序,用于在Java中向串行端口发送和接收数据。我通过回送测试(Rx到Tx)连接串行端口设备。它工作正常。但我无法发送和接收十六进制数据到串行端口和接收串行端口。在我的设备中使用了FT232BL芯片,因此是否需要任何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 十六进制:
String
Integer.decode(hexString);
十六进制为String:
Integer.toHexString(integer);