JR 精品文章 - java串口通讯
AD: jr (at) javaresearch.org


首页 | 动态 | 文章 | FAQ  | 新闻 | 下载 | 代码 | 工作 | 调查 | 术语 | 站点 | 图书 | 论坛 | 帮助 | 全部  

TOP | 交流 | 软件 | 专栏 | 开源 | 译/著 | 源码 | API  | 推荐 | FTP  | 积分 | 统计 | 搜索 | Blog | 我们  
首页 » 研究文集 » I/O及网络 搜索标题相关文章 搜索标题相关文章    评论此文章 发表评论     开始监控此文章 开始监控   加入收藏夹  加入收藏夹
java串口通讯
wty_703 原创   更新:2007-09-27 08:31:49  版本: 1.0   

/******************************************
* 程序文件名称:SendComm.java
* 功能:从串行口COM1中发送数据
******************************************/
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 
import java.util.*; 
import javax.comm.*; //可以使用开源的RXTX
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("打开串口, 发送数据"); 
Button btnClose=new Button("关闭串口, 停止发送数据"); 
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("COM1")) {
/*打开串口 */
try {
serialPort = (SerialPort) portId.open("ReadComm", 2000); 

catch (PortInUseException e) { }
/*设置串口输出流*/
try { 
outputStream = serialPort.getOutputStream(); 

catch (IOException e) {}
} //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("打开串口"); 
/*建立窗体*/
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(); 
}
}

版权声明   给作者写信
本篇文章对您是否有帮助?  投票:         投票结果:     18       0
作者其它文章: 作者全部文章
评论人:yongbing 发表时间: Thu Sep 27 12:18:08 CST 2007
恩,不错!

这个文章共有 1 条评论
主题: 提高byte的生成效率 上一篇文章
返回文章列表 返回〔I/O及网络〕
下一篇文章 主题: 网格技术及应用一览


文字广告链接
        自主、快速定制基于JAVA的B/S业务系统          重量级企业在线自定义WEB报表平台
        Excel制表、零代码发布、打印、图表结合——快逸报表,免费、稳定、功能强大的java工具
        技术圈: 关于Java、dotNet、PHP、Ruby、奇客、Web2.0等更多资讯博客精选文章

关于 JR  |  版权声明  |  联系我们 

©2002-2006 JR 版权所有 沪ICP备05019622号