Java串口通信程序程序及注释 可编译运行.docx
《Java串口通信程序程序及注释 可编译运行.docx》由会员分享,可在线阅读,更多相关《Java串口通信程序程序及注释 可编译运行.docx(8页珍藏版)》请在冰豆网上搜索。
Java串口通信程序程序及注释可编译运行
Java的串口通信程序
对于JVM来说,要正确的识别串口,将这几个文件放在系统中合适的位置使很重要的。
%JAVA_HOME%/lib
%JAVA_HOME%/jre/lib/ext
%windir%system32
%JAVA_HOME%/lib
%JAVA_HOME%/jre/lib
你可以通过编译和运行Sun的例程来验证串口是否可以使用了。
JBuilder中安装JavaCommunicationAPI
(以下在JBuilder2006中测试通过)
如果你使用JBuilder,那么还需要为JBuilder配置API。
\Borland\JBuilder2006\jdk
1.5的相应位置。
我使用的是JCreator,在打开Configure,然后点击option,选中jdkprofile然后双击选中的jdk文件,选择edit,在弹出的窗口中选择串口通信包所在的文件(.jar文件),这样配置就算完成了。
以下分别是接收和发送程序,CSDN上搜的,省的自己写了:
发送程序:
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjava.util.*;
classS_FrameextendsFrameimplementsRunnable,ActionListener{
/*检测系统中可用的通讯端口类*/
staticCommPortIdentifierportId;
/*Enumeration为枚举型类,在util中*/
staticEnumerationportList;
OutputStreamoutputStream;
/*RS-232的串行口*/
SerialPortserialPort;
ThreadreadThread;
Panelp=newPanel();
TextFieldin_message=newTextField("打开COM1,波特率9600,数据位8,停止位
1.");
TextAreaout_message=newTextArea();
ButtonbtnOpen=newButton("打开串口,发送数据");
ButtonbtnClose=newButton("关闭串口,停止发送数据");
bytedata[]=newbyte[10240];
/*设置判断要是否关闭串口的标志*/
booleanmark;
/*安排窗体*/
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
/*点击按扭打开串口.*/
publicvoidactionPerformed(ActionEventevent){
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
/*打开串口,并调用线程发送数据*/
publicvoidstart(){
/*获取系统中所有的通讯端口*/
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(PortInUseExceptione){}
/*设置串口输出流*/
try{
outputStream=serialPort.getOutputStream();}catch(IOExceptione){}
}//ifend
}//ifend
}//whileend
/*调用线程发送数据*/
try{
readThread=newThread(this);
//线程负责每发送一次数据,休眠2秒钟
readThread.start();}catch(Exceptione){}
}//start()end
/*发送数据,休眠2秒钟后重发*/
publicvoidrun(){
/*设置串口通讯参数*/
try{
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);}catch(UnsupportedCommOperationExceptione){}
/*发送数据流(将数组data[]中的数据发送出去)*/
try{
outputStream.write(data);}catch(IOExceptione){}
/*发送数据后休眠2秒钟,然后再重发*/
try{Thread.sleep
(2000);
if(mark)
{return;//结束run方法,导致线程死亡}start();}catch(InterruptedExceptione){}
}//run()end
}//类S_Frameend
publicclassSendComm
{publicstaticvoidmain(Stringargs[])
{S_FrameS_win=newS_Frame();
S_win.addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente)
{System.exit
(0);}
});
S_win.pack();}}
接收程序:
importjava.awt.*;
importjava.awt.event.*;
importjava.io.*;
importjava.util.*;
classR_FrameextendsFrameimplements
Runnable,ActionListener,SerialPortEventListener{/*检测系统中可用的通讯端口类*/
staticCommPortIdentifierportId;
/*Enumeration为枚举型类,在java.util中*/
staticEnumerationportList;
InputStreaminputStream;
/*声明RS-232串行端口的成员变量*/
SerialPortserialPort;
ThreadreadThread;
Stringstr="";
TextFieldout_message=newTextField("上面文本框显示接收到的数据");TextAreain_message=newTextArea();
ButtonbtnOpen=newButton("打开串口");
/*建立窗体*/
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
/*点击按扭所触发的事件:
打开串口,并监听串口.*/
publicvoidactionPerformed(ActionEventevent){/*获取系统中所有的通讯端口*/
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(PortInUseExceptione){}
/*设置串口监听器*/
try{
serialPort.addEventListener(this);}catch(TooManyListenersExceptione){}
/*侦听到串口有数据,触发串口事件*/
serialPort.notifyOnDataAvailable(true);
}//ifend
}//ifend
}//whileend
readThread=newThread(this);
readThread.start();//线程负责每接收一次数据休眠20秒钟
}//actionPerformed()end
/*接收数据后休眠20秒钟*/
publicvoidrun(){
try{
Thread.sleep
(200);}catch(InterruptedExceptione){}
}//run()end
/*串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中*/publicvoidserialEvent(SerialPortEventevent){
/*设置串口通讯参数:
波特率、数据位、停止位、奇偶校验*/
try
{serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);}
catch(UnsupportedCommOperationExceptione){}
byte[]readBuffer=newbyte[20];
try{
inputStream=serialPort.getInputStream();}catch(IOExceptione){}
try{/*从线路上读取数据流*/
while(inputStream.available()>0){
intnumBytes=inputStream.read(readBuffer);
}//whileend
str=newString(readBuffer);
/*接收到的数据存放到文本区中*/
in_message.append(str+"\n");}catch(IOExceptione){}
}//serialEvent()end
}//类R_Frameend
publicclassReadComm{publicstaticvoidmain(Stringargs[]){/*实例化接收串口数据的窗体类*/
R_FrameR_win=newR_Frame();
/*定义窗体适配器的关闭按钮功能*/
R_win.addWindowListener(newWindowAdapter()
{publicvoidwindowClosing(WindowEvente)
{System.exit
(0);}
});
R_win.pack();}}