串口介绍说明:
-
串行通信方式作为一种灵活、方便且可靠通信方式,被广泛应用于工业控制领域。我们可以在PC上通过上位机软件建立与被控制系统的全双工通信,下面就对基于java的串口通信进行简单介绍。
由于Sun公司没有直接提供串行通信协议的开发包,而是发布的独立的comm.jar。因此在开发串口相关通信应用之前应当对comm.jar进行安装配置,[comm.jar下载链接,里面对comm.jar的安装配置做了相关说明。](http://pan.baidu.com/s/1ntGFAhr 密码:10r0)。
**这里需要注意的一点是 基于window7系统32位 JDK版本1.7 的环境下。**
相关使用类的简介:
javax.comm.CommPortIdentifier类是管理和控制通信端口类,决定通信端口的驱动工作模式、打开通信端口进行I/O操作、决定通信端口的所有权、管理在端口发生的事件变化。
该类经常使用过的方法有:
getPortIdentifiers():获取系统所有的串口。
getPortType():返回通信端口的类型,PROT_SERIAL(串行口)、 PORT_PARALLEL(并行口)。
open(String ApplicationName, int Timeout):打开由String规定的应用通信端口,并设置打开端口的超时时间,这个方法会抛出PortInUseException。javax.comm.SerialPort类是用来描述和设置RS-232串行通信端口参数的类。
该类使用setSerialPortParams(int baudrate, int dataBits, int stopBits, int parity )方法用于设置串口通信的参数:波特率、数据位、停止位、奇偶检验位。
如果应用程序的系统不支持所设定的波特率,系统将抛出UnsupportedCommOperationException异常。
代码说明
- 窗体位置控制
//窗体位置控制
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);
}
}
- 主类
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进行数据传输,在与实际硬件相连接的时候请注意做相应修改。