java的串口通信

串口介绍说明:


  1. 串行通信方式作为一种灵活、方便且可靠通信方式,被广泛应用于工业控制领域。我们可以在PC上通过上位机软件建立与被控制系统的全双工通信,下面就对基于java的串口通信进行简单介绍。
    由于Sun公司没有直接提供串行通信协议的开发包,而是发布的独立的comm.jar。因此在开发串口相关通信应用之前应当对comm.jar进行安装配置,[comm.jar下载链接,里面对comm.jar的安装配置做了相关说明。](http://pan.baidu.com/s/1ntGFAhr 密码:10r0)。
**这里需要注意的一点是 基于window7系统32位 JDK版本1.7 的环境下。**

相关使用类的简介:

  1. javax.comm.CommPortIdentifier类是管理和控制通信端口类,决定通信端口的驱动工作模式、打开通信端口进行I/O操作、决定通信端口的所有权、管理在端口发生的事件变化。
    该类经常使用过的方法有:
    getPortIdentifiers():获取系统所有的串口。
    getPortType():返回通信端口的类型,PROT_SERIAL(串行口)、 PORT_PARALLEL(并行口)。
    open(String ApplicationName, int Timeout):打开由String规定的应用通信端口,并设置打开端口的超时时间,这个方法会抛出PortInUseException。

  2. javax.comm.SerialPort类是用来描述和设置RS-232串行通信端口参数的类。
    该类使用setSerialPortParams(int baudrate, int dataBits, int stopBits, int parity )方法用于设置串口通信的参数:波特率、数据位、停止位、奇偶检验位。
    如果应用程序的系统不支持所设定的波特率,系统将抛出UnsupportedCommOperationException异常。

代码说明

  1. 窗体位置控制
//窗体位置控制
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;

public class Middle_Frame {
    public Middle_Frame(JFrame frame) {
    // 获取显示尺寸
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    // 获取窗体尺寸
    Dimension frameSize = frame.getSize();
    // 对相关参数进行判断
    if (frameSize.height > screenSize.height) {
        frameSize.height = screenSize.height;
    }
    if (frameSize.width > screenSize.width) {
        frameSize.width = screenSize.width;
    }
    // 使窗体居中显示
    frame.setLocation((screenSize.width - frameSize.width) / 2,
        (screenSize.height - frameSize.height) / 2);
    }
}
  1. 主类
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.comm.*;

public class R_Frame extends JFrame implements ActionListener,
    SerialPortEventListener, Runnable {
    // 检测 获取 系统中可以使用过的通信端口
    static CommPortIdentifier portID;
    // 用于接收系统中所有可以使用的通信端口
    static Enumeration portList;
    InputStream inputStream;
    // 创建RS-232成员对象
    SerialPort serialPort;
    Thread readThread;
    String str = "";
    // 用于打开串口 及接收显示数据的文本区
    JButton button = new JButton("打开串口");
    JTextArea in_message = new JTextArea();
    JTextField out_message = new JTextField("上面文本框显示接收到的数据");

    public R_Frame() {
    // 窗体初始化 并让其居中显示
    setTitle("串口接收数据");
    setSize(500, 300);
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    new Middle_Frame(this);
    setVisible(true);
    // 为打开串口按钮绑定监听器
    button.addActionListener(this);
    // 添加相关组件
    add(out_message, "South");
    add(in_message, "Center");
    add(button, "North");
    }

    // 打开串口 并监听串口
    @Override
    public void actionPerformed(ActionEvent e) {
    // TODO Auto-generated method stub
    // 获取 所有的通信端口
    portList = CommPortIdentifier.getPortIdentifiers();
    while (portList.hasMoreElements()) {
        // 遍历通信端口
        portID = (CommPortIdentifier) portList.nextElement();
        // 判断当前端口是否为串口
        if (portID.getPortType() == CommPortIdentifier.PORT_SERIAL) {
        // 这里我调试的时候在本机上安装了虚拟串口软件 并固定使用串口对三四进行通信
        if (portID.getName().equals("COM3")) {
            try {
            serialPort = (SerialPort) portID
                .open("Readcomm1", 2000);
            out_message.setText("已经打开串口3,正在接收数据 .");
            try {
                // 设置串口监听器 这里会抛出相关异常 根据应用需要
                // 可以设置相关处理操作
                serialPort.addEventListener(this);
            } catch (TooManyListenersException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            // 当检测到串口有数据的时候 会触发相关事件
            serialPort.notifyOnDataAvailable(true);
            } catch (PortInUseException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            }
        }
        }
    }
    readThread = new Thread(this);
    // 启动数据接收线程
    readThread.start();
    }

    // 串口监听器触发的事件,设置串口通信参数 读取数据并写到文本区中
    public void serialEvent(SerialPortEvent event) {
    // 设置串口通信参数 波特率 数据位 停止位 奇偶校验
    try {
        /*
         * 波特率 9600 数据位 8 停止位 1 没有奇偶检验
         */
        serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
            SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
    } catch (UnsupportedCommOperationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    byte[] readBuffer = new byte[20];
    try {
        inputStream = serialPort.getInputStream();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        while (inputStream.available() > 0) {
        // 从串口线上读取数据流
        int numBytes = inputStream.read(readBuffer);
        }
        str = new String(readBuffer);
        in_message.append(str + "\n");
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

    @Override
    public void run() {
    // TODO Auto-generated method stub
    try {
        Thread.sleep(20000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    }

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    new R_Frame();
    }
}

需要注意的是 我的电脑安装了虚拟串口软件 在代码中直接使用串口3进行数据传输,在与实际硬件相连接的时候请注意做相应修改。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值