java串口程序---------------------------------------------------站等高手答疑解惑!!!
各位高手好,小弟初次接触串口,是一头雾水不知如何下手,在网上找了一些示例,但也还是云里雾里的。
小弟本次要实现在本地通过串口向对应的LED屏发送实时信息,但是不知道该怎么具体实现?很是苦恼,所以在本地想测试一下网上现成的示例,了解一下串口程序是如何发送信息的过程,但不知如何搭建测试环境,求各位高手指点解惑,感激之情无以言表!谢谢!
如下是网上现成示例:
发送程序
/******************************************
* 程序文件名称:SendComm.java
* 功能:从串行口COM1中发送数据
******************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;
class S_Frame extends Frame implements Runnable, ActionListener {
/* 检测系统中可用的通讯端口类 */
static CommPortIdentifier portId;
/* Enumeration 为枚举型类,在util中 */
static Enumeration portList;
OutputStream outputStream;
/* RS-232的串行口 */
SerialPort serialPort;
Thread readThread;
Panel p = new Panel();
TextField in_message = new TextField("打开COM1,波特率9600,数据位8,停止位1.");
TextArea out_message = new TextArea();
Button btnOpen = new Button("Open打开串口, 发送数据");
Button btnClose = new Button("Close关闭串口, 停止发送数据");
byte data[] = new byte[10240];
/* 设置判断要是否关闭串口的标志 */
boolean mark;
/* 安排窗体 */
S_Frame() {
super("串口发送数据");
setSize(200, 200);
setVisible(true);
add(out_message, "Center");
add(p, "North");
p.add(btnOpen);
p.add(btnClose);
add(in_message, "South");
btnOpen.addActionListener(this);
btnClose.addActionListener(this);
} // R_Frame() end
/* 点击按扭打开串口. */
public void actionPerformed(ActionEvent event) {
if (event.getSource() == btnClose) {
serialPort.close();// 关闭串口
mark = true; // 用于中止线程的run()方法
in_message.setText("串口COM1已经关闭,停止发送数据.");
} else {
mark = false;
/* 从文本区按字节读取数据 */
data = out_message.getText().getBytes();
/* 打开串口 */
start();
in_message.setText("串口COM1已经打开,正在每2秒钟发送一次数据.....");
}
} // actionPerformed() end
/* 打开串口,并调用线程发送数据 */
public void start() {
/* 获取系统中所有的通讯端口 */
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("ReadComm", 2000);
} catch (PortInUseException e) {
e.printStackTrace();
}
/* 设置串口输出流 */
try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
} // if end
} // if end
} // while end
/* 调用线程发送数据 */
try {
readThread = new Thread(this);
// 线程负责每发送一次数据,休眠2秒钟
readThread.start();
} catch (Exception e) {
}
} // start() end
/* 发送数据,休眠2秒钟后重发 */
public void run() {
/* 设置串口通讯参数 */
try {
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {
}
/* 发送数据流(将数组data[]中的数据发送出去) */
try {
outputStream.write(data);
} catch (IOException e) {
}
/* 发送数据后休眠2秒钟,然后再重发 */
try {
Thread.sleep(2000);
if (mark) {
return; // 结束run方法,导致线程死亡
}
start();
} catch (InterruptedException e) {
}
} // run() end
} // 类S_Frame end
public class SendComm {
public static void main(String args[]) {
S_Frame S_win = new S_Frame();
S_win.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
S_win.pack();
}
} 接收程序
/******************************************
* 程序文件名称:ReadComm.java
* 功能:从串行口COM1中接收数据
******************************************/
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import javax.comm.*;
class R_Frame extends Frame implements Runnable, ActionListener,
SerialPortEventListener {
/* 检测系统中可用的通讯端口类 */
static CommPortIdentifier portId;
/* Enumeration 为枚举型类,在java.util中 */
static Enumeration portList;
InputStream inputStream;
/* 声明RS-232串行端口的成员变量 */
SerialPort serialPort;
Thread readThread;
String str = "";
TextField out_message = new TextField("上面文本框显示接收到的数据");
TextArea in_message = new TextArea();
Button btnOpen = new Button("Open Serial打开串口");
/* 建立窗体 */
R_Frame() {
super("串口接收数据");
setSize(200, 200);
setVisible(true);
btnOpen.addActionListener(this);
add(out_message, "South");
add(in_message, "Center");
add(btnOpen, "North");
} // R_Frame() end
/* 点击按扭所触发的事件:打开串口,并监听串口. */
public void actionPerformed(ActionEvent event) {
/* 获取系统中所有的通讯端口 */
portList = CommPortIdentifier.getPortIdentifiers();
/* 用循环结构找出串口 */
while (portList.hasMoreElements()) {
/* 强制转换为通讯端口类型 */
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals("COM1")) {
try {
serialPort = (SerialPort) portId.open("ReadComm", 2000);
out_message.setText("已打开端口COM1 ,正在接收数据..... ");
} catch (PortInUseException e) {
}
/* 设置串口监听器 */
try {
serialPort.addEventListener(this);
} catch (TooManyListenersException e) {
}
/* 侦听到串口有数据,触发串口事件 */
serialPort.notifyOnDataAvailable(true);
} // if end
} // if end
} // while end
readThread = new Thread(this);
readThread.start();// 线程负责每接收一次数据休眠20秒钟
} // actionPerformed() end
/* 接收数据后休眠20秒钟 */
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
}
} // run() end
/* 串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中 */
public void serialEvent(SerialPortEvent event) {
/*设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/
try {
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
}catch (UnsupportedCommOperationException e) {}
byte[] readBuffer = new byte[20];
try {
inputStream = serialPort.getInputStream();
}catch (IOException e) {}
try {
/* 从线路上读取数据流 */
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
} //while end
str=new String(readBuffer);
/*接收到的数据存放到文本区中*/
in_message.append(str+"\n");
}catch (IOException e) { }
} //serialEvent() end
} // 类R_Frame end
public class ReadComm {
public static void main(String args[]) {
/* 实例化接收串口数据的窗体类 */
R_Frame R_win = new R_Frame();
/* 定义窗体适配器的关闭按钮功能 */
R_win.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
R_win.pack();
}
}
以上就是现成的类实现,不知道我在本地要怎么要才能与另外一个测试电脑来测试这个程序,求高手不吝赐教。
在线等高手赐教,急呀!!!