将字符串发送到 COM 端口

Sending a string to a COM port

第一个项目,只是出于兴趣,所以我可以学习。

我正在尝试制作一个可以通过通信端口发送字符串的应用程序。下面是我的 GUI(第一次尝试!)

我已经创建了按钮,它们可以执行某些操作,但现在我需要添加 com 端口功能。

有人可以指点一下吗?请用最简单的语言。我是自学的。

import java.awt.GridLayout;
import java.io.*;
import javax.swing.*;

import java.util.*;



public class AlarmGenerator extends javax.swing.JFrame {

public AlarmGenerator() {
    initComponents();
}


private void initComponents() {

    jTextField1 = new javax.swing.JTextField();
    jTextField2 = new javax.swing.JTextField();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();
    jButton3 = new javax.swing.JButton();
    jButton4 = new javax.swing.JButton();


    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    jTextField1.setText("Enter Custom String Here");
    jTextField2.setText("Result");
    jButton1.setText("Alarm1");
    jButton2.setText("Alarm2");
    jButton3.setText("Alarm3");
    jButton4.setText("Custom Alarm");

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()               

                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)    
                    .addComponent(jButton1)
                    .addComponent(jButton2)
                    .addComponent(jButton3)
                    .addComponent(jButton4)
                    .addComponent(jTextField1)
                    .addComponent(jTextField2)

    )));
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()

            .addComponent(jButton1)
            .addComponent(jButton2)
            .addComponent(jButton3)
            .addComponent(jButton4)
            .addComponent(jTextField1)
            .addComponent(jTextField2)

            .addContainerGap(0, Short.MAX_VALUE))
    );

    pack();

    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }

        private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
            jTextField2.setText("Alarm 1 Activated, String: "+alarm1);
        }
    });

    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }

        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
            jTextField2.setText("Alarm 2 Activated, String: "+alarm2);
        }
    });

    jButton3.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton3ActionPerformed(evt);
        }

        private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
            jTextField2.setText("Alarm 3 Activated, String: "+alarm3);
        }
    });

    jButton4.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton4ActionPerformed(evt);
        }

        private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {
            jTextField2.setText("Custom alarm, string sent: "+jTextField1.getText ());
        }
    });
}                       

public static void main(String args[]) {        

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            new AlarmGenerator().setVisible(true);


        }
    });


}

// Variables declaration                    
private static javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JButton jButton3;
private javax.swing.JButton jButton4;
private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
String alarm1 = "Hello";
String alarm2 = "Bye";
String alarm3 = "Custom";
// End of variables declaration                   
}

Class 2

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.FileDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class TwoWaySerialComm {
public TwoWaySerialComm() {
    super();
}

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

            InputStream in = serialPort.getInputStream();
            OutputStream 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.");
        }
    }
}

/** */
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) {
                System.out.print(new String(buffer, 0, len));
            }
        } 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) {
    try {
        (new TwoWaySerialComm()).connect("COM3");
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

看看这个link。

它将更深入地了解如何通过 COM 端口发送数据

How to send data to COM PORT using JAVA?

此页面 link 一些可能的答案

Java Serial Communication on Windows

Is there Java library or framework for accessing Serial ports?

Reading serial port in Java

和另外两个答案基本等同于读取串口的答案

private TwoWaySerialComm twoWaySerCom;

public AlarmGenerator() {

    initComponents();   

    twoWaySerCom = new TwoWaySerialComm();

    try {

        twoWaySerCom.connect("COM1");
    } 
    catch (Exception e) {

        e.printStackTrace();
    }
}

我注意到你有多个

 public static void Main(string[] args)

在您的项目中,这些是项目条目,一个就足够了。

如果您使用 Linux,我已经创建了一个 Java 包 j232 和本机库 libj232,它们是开源的并托管在 GitHub 上。它应该被认为是 'work-in-progress',目前只处理同步串行数据。

主要的 Java 软件包是 here and its associated native library here. Also take a look at the wiki for j232 and finally the example page