Java ile seri port işlemleri için yazılmış bir kütüphane mevcut ilk olarak buradaki RXTXcomm-2.2pre2 dosyadan sisteminize uygun klasör içerisindeki dosyayı işletim sisteminizin ana dizinine atınız (örn. windows için C:\windows\).
Buradaki örnek ile seri port üzerinden gelen verileri okumaya yarayan bir uygulama.
Kaynak kodlar için SerialPortReader
package serialportreader; import gnu.io.SerialPortEventListener; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import java.util.ArrayList; import java.util.Enumeration; import javax.swing.DefaultListModel; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JTextArea; import javax.swing.SwingConstants; /** * @author meSutPiskin */ public class UI_Main extends javax.swing.JFrame implements SerialPortEventListener { /** * @param aComPortName the comPortName to set */ public static void setComPortName(String aComPortName) { comPortName = aComPortName; } String inputLine; String[] readArray = new String[100]; SerialPort serialPort; int i = 0; private static String comPortName = "COM4"; public static String getComPortName() { return comPortName; } private static final String PORT_NAMES[] = {getComPortName(),}; private BufferedReader input; private static OutputStream output; private static int TIME_OUT = 2000; private static int DATA_RATE = 9600; public void initialize() { System.setProperty("gnu.io.rxtx.SerialPorts", getComPortName()); CommPortIdentifier portId = null; Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); while (portEnum.hasMoreElements()) { CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); for (String portName : PORT_NAMES) { if (currPortId.getName().equals(portName)) { portId = currPortId; break; } } } if (portId == null) { JOptionPane.showMessageDialog(null," PORTUNA BAĞLI CİHAZ YOK!","HATA",JOptionPane.ERROR_MESSAGE); System.out.println("PORTA BAĞLI CİHAZ YOK!"); return; } try { serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT); serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); input = new BufferedReader(new InputStreamReader(serialPort.getInputStream())); output = serialPort.getOutputStream(); serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); } catch (Exception e) { System.err.println(e.toString()); } } public synchronized void close() { if (serialPort != null) { serialPort.removeEventListener(); serialPort.close(); } } @Override public synchronized void serialEvent(SerialPortEvent oEvent) { if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) { try { if (input.ready() == true) { inputLine = input.readLine(); System.out.println("OKUNAN VERİ:" + inputLine); JOptionPane.showMessageDialog(null,inputLine,"OKUNAN VERİ",JOptionPane.INFORMATION_MESSAGE); } else { System.out.println("VERİ OKUNAMIYOR!"); JOptionPane.showMessageDialog(null,inputLine,"VERİ OKUNAMIYOR!",JOptionPane.INFORMATION_MESSAGE); } } catch (Exception e) { System.err.println(e.toString()); } } } public UI_Main() { initComponents(); } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { txtBoundRate = new javax.swing.JTextField(); txtComPortName = new javax.swing.JTextField(); jLabel1 = new javax.swing.JLabel(); jLabel2 = new javax.swing.JLabel(); btnConnect = new javax.swing.JButton(); txtTimeOut = new javax.swing.JTextField(); jLabel3 = new javax.swing.JLabel(); txtReadData = new java.awt.TextArea(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); setTitle("SERİ PORT VERİ OKU"); setResizable(false); setType(java.awt.Window.Type.UTILITY); txtBoundRate.setText("9600"); txtComPortName.setText("COM1"); jLabel1.setText("PORT İSMİ"); jLabel2.setText("BOUND RATE"); btnConnect.setText("BAĞLAN"); btnConnect.setCursor(new java.awt.Cursor(java.awt.Cursor.HAND_CURSOR)); btnConnect.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnConnectActionPerformed(evt); } }); txtTimeOut.setText("2000"); jLabel3.setText("TIME OUT"); txtReadData.setMinimumSize(new java.awt.Dimension(20, 80)); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jLabel3) .addComponent(jLabel1) .addComponent(jLabel2) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false) .addComponent(txtComPortName, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 136, Short.MAX_VALUE) .addComponent(txtBoundRate, javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtTimeOut, javax.swing.GroupLayout.Alignment.LEADING)) .addComponent(btnConnect, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtReadData, javax.swing.GroupLayout.DEFAULT_SIZE, 223, Short.MAX_VALUE) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(txtReadData, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addComponent(jLabel1) .addGap(5, 5, 5) .addComponent(txtComPortName, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(21, 21, 21) .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtBoundRate, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(28, 28, 28) .addComponent(jLabel3) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtTimeOut, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 73, Short.MAX_VALUE) .addComponent(btnConnect, javax.swing.GroupLayout.PREFERRED_SIZE, 42, javax.swing.GroupLayout.PREFERRED_SIZE))) .addContainerGap()) ); pack(); }// </editor-fold> private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) { setComPortName(txtComPortName.getText()); DATA_RATE = Integer.parseInt(txtBoundRate.getText()); TIME_OUT = Integer.parseInt(txtTimeOut.getText()); btnConnect.setText("TEKRAR BAĞLAN"); UI_Main main = new UI_Main(); main.initialize(); Thread t = new Thread() { public void run() { try { Thread.sleep(1000000); } catch (InterruptedException ie) { } } }; t.start(); txtReadData.setText(txtComPortName.getText()+" PORT AÇILDI\n"); txtReadData.setText(txtReadData.getText() + "Veri Bekleniyor...\n"); } public static void main(String args[]) { //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(UI_Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) { java.util.logging.Logger.getLogger(UI_Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(UI_Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(UI_Main.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } //</editor-fold> java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new UI_Main().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton btnConnect; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JLabel jLabel3; private javax.swing.JTextField txtBoundRate; private javax.swing.JTextField txtComPortName; private java.awt.TextArea txtReadData; private javax.swing.JTextField txtTimeOut; // End of variables declaration }