java串口通信.docx
《java串口通信.docx》由会员分享,可在线阅读,更多相关《java串口通信.docx(45页珍藏版)》请在冰豆网上搜索。
java串口通信
Java串口通信实例
前言:
如果你对串口了解的不是太多,还请你稍微拿出点时间来学习点(大致了解下就行,毕竟本篇文档主要是软件的通信开发)。
在初次做这个java串口实现时,如果你用的是台式机,那么机箱后面一般有一个串口的(笔记本现在一般很少有了,USB技术通信逐渐流行开来)。
在真正用java实现串口之前,大家可以下载一个虚拟串口生成工具,以及串口调试工具,来模拟一下串口通信的大致情况。
正文:
这是一个用java代码实现的串口通信的小实例,仅供大家学习参考。
下面共有六个java文件
(SerialDemo.java,SerialConnection.java,AlertDialog.java,PortRequestedDialog.java,SerialConnectionException.java,SerialParameters.java)
以下的java代码放在一个java包下面即可。
Java串口,本实例大致工作流程是:
将以下的所有java类都放在一个包下面,runas---javaapplication,打开的是一个图形化界面,最上面的是一个输入文本框(也就是你要发射的指令输入框),下面是一个接收的返回数据显示框,最下面的是串口的配置参数设置,最低端是几个按钮(打开串口,发送指令,关闭串口,发送中断,将接收数据框清空)。
图形化界面的左上角有个File字样,这是个menu点击后可以看到有,save,load,exit(save用于以文件的形式保存设置的串口通信参数,load正好相反,是读取串口通信的参数文件,exit是退出整个程序)。
使用此代码之前的环境配置:
首先用的是javacomm20-win32.zip这个压缩包(m,自己可以到网上下载)
前提条件是:
将这种配置放在外部的JDK环境之下(供参考)
①.解压完之后将win32com.dll放到C:
\ProgramFiles\Java\jdk1.7.0_03\bin下
②.将comm.jar价包拷贝到C:
\ProgramFiles\Java\jre7\lib\ext
③m.properties拷贝到C:
\ProgramFiles\Java\jre7\lib
用rxtxComm来配置环境的话步骤如下:
step1.在eclipse中新建一个工程(根据你自己的需要,Applet,tomcat,java工程等均可)。
step2.在工程下建一个lib文件夹。
step3.将rxtx-2.1-7-bins-r2.zip解压缩,得到文件夹[rxtx-2.1-7-bins-r2]。
step4.将[rxtx-2.1-7-bins-r2]/RXTXcomm.jar这个文件copy到step2创建的lib中。
step5.将[rxtx-2.1-7-bins-r2]/Windows/i368-mingw32目录下的两个dll文件copy到step2创建的lib中。
step6.在工程上右键->Properties->JavaBuilderPath->Libraries->AddJARs->选择step2中创建的lib目录下的RXTXcomm.jar->OK。
step7.最关键的一步。
点RXTXcomm.jar前面的小加号(+)->选择Nativelibrarylocation->点右边一列按钮中的Edit…->选择step2中创建的lib目录->OK。
补充:
如果你的代码需要调用本地dll,你可以通过同样的方式设置Nativelibrarylocation。
注意:
电脑上有一个默认的物理串口COM1,使用虚拟串口生成器时,会自动从COM2开始(一般一次生成两个虚拟的,与COM1有区别),用JavaxComm环境配置时(由于其版本的不再升级),可能做的程序界面上不会显示COM1,可以用RxtxComm来配置,或者两种配置都用上(应该不会出现不兼容)。
自己在测试时用的是COM1串口(直接就是在机箱后面接上通信线)。
Ps:
java串口实现有很多种方法,希望这个实例能帮助java开发专业人员及爱好者进一步地学习。
代码:
SerialDemo.java
importjava.awt.Button;
importjava.awt.Choice;
importjava.awt.Cursor;
importjava.awt.Dimension;
importjava.awt.FileDialog;
importjava.awt.Frame;
importjava.awt.GridBagConstraints;
importjava.awt.GridBagLayout;
importjava.awt.GridLayout;
importjava.awt.Label;
importjava.awt.Menu;
importjava.awt.MenuBar;
importjava.awt.MenuItem;
importjava.awt.Panel;
importjava.awt.TextArea;
importjava.awt.Toolkit;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.ItemEvent;
importjava.awt.event.ItemListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.io.File;
importjava.io.FileInputStream;
importjava.io.FileNotFoundException;
importjava.io.FileOutputStream;
importjava.io.IOException;
importjava.util.Enumeration;
importjava.util.Properties;
importm.CommPortIdentifier;
importjavax.swing.JComboBox;
/**
*MainfileforSerialDemoprogram.Thisprogramillustratesmanyofthe
*abilitiesofthemapi.ThisfilecontainstheGUIframeworkthat
*theprogramrunsin.
*/
publicclassSerialDemoextendsFrameimplementsActionListener{
finalintHEIGHT=450;
finalintWIDTH=410;
privateMenuBarmb;
privateMenufileMenu;
privateMenuItemopenItem;
privateMenuItemsaveItem;
privateMenuItemexitItem;
privateJComboBoxtype;
privateButtonopenButton;
privateButtoncloseButton;
privateButtonbreakButton;
privateButtonsendButton;
privateButtonclearButton;
privatePanelbuttonPanel;
privatePanelmessagePanel;
privateTextAreamessageAreaOut;
privateTextAreamessageAreaIn;
privateConfigurationPanelconfigurationPanel;
privateSerialParametersparameters;
privateSerialConnectionconnection;
privatePropertiesprops=null;
/**
*Mainmethod.Checkstoseeifthecommandlineagrumentisrequesting
*usageinformaition(-h,-help),ifitis,displayausagemessageand
*exit,otherwisecreateanewSerialDemo
andsetitvisible.
*/
publicstaticvoidmain(String[]args){
System.out.println("进入主函数");
if((args.length>0)
&&(args[0].equals("-h")||args[0].equals("-help"))){
System.out.println("usage:
javaSerialDemo[configurationFile]");
System.exit
(1);
}
SerialDemoserialDemo=newSerialDemo(args);
serialDemo.setVisible(true);
serialDemo.repaint();
}
/**
*CreatenewSerialDemo
andinitilizesit.Parsesargstofind
*configurationfile.Iffound,initialstateitsettoparametersin
*configurationfile.
*
*@paramargs
*commandlineargumentsusedwhenprogramwasinvoked.
*/
publicSerialDemo(String[]args){
super("SerialDemo");
if(!
(args.length>0)){
System.out.println("serialdemo的args传过来还是为空");
}
//添加到面板的初始化参数
parameters=newSerialParameters();
//SetuptheGUIfortheprogram
addWindowListener(newCloseHandler(this));
mb=newMenuBar();
fileMenu=newMenu("File");
openItem=newMenuItem("Load");
openItem.addActionListener(this);
fileMenu.add(openItem);
saveItem=newMenuItem("Save");
saveItem.addActionListener(this);
fileMenu.add(saveItem);
exitItem=newMenuItem("Exit");
exitItem.addActionListener(this);
fileMenu.add(exitItem);
mb.add(fileMenu);
setMenuBar(mb);
messagePanel=newPanel();
messagePanel.setLayout(newGridLayout(2,1));
//信息码的输入(并且应该是可以编辑的):
messageAreaOut=newTextArea();
messagePanel.add(messageAreaOut);
//解析信息码(只可接收不可编辑)
messageAreaIn=newTextArea();
messageAreaIn.setEditable(false);
messagePanel.add(messageAreaIn);
add(messagePanel,"Center");
//底面的button
configurationPanel=newConfigurationPanel(this);
buttonPanel=newPanel();
openButton=newButton("OpenPort");
openButton.addActionListener(this);
buttonPanel.add(openButton);
sendButton=newButton("SendData");
sendButton.addActionListener(this);
sendButton.setEnabled(false);
buttonPanel.add(sendButton);
closeButton=newButton("ClosePort");
closeButton.addActionListener(this);
closeButton.setEnabled(false);
buttonPanel.add(closeButton);
breakButton=newButton("SendBreak");
breakButton.addActionListener(this);
breakButton.setEnabled(false);
buttonPanel.add(breakButton);
clearButton=newButton("Clear");
clearButton.addActionListener(this);
clearButton.setEnabled(false);
buttonPanel.add(clearButton);
PanelsouthPanel=newPanel();
GridBagLayoutgridBag=newGridBagLayout();
GridBagConstraintscons=newGridBagConstraints();
southPanel.setLayout(gridBag);
cons.gridwidth=GridBagConstraints.REMAINDER;
gridBag.setConstraints(configurationPanel,cons);
cons.weightx=1.0;
southPanel.add(configurationPanel);
gridBag.setConstraints(buttonPanel,cons);
southPanel.add(buttonPanel);
add(southPanel,"South");
parseArgs(args);
connection=newSerialConnection(this,parameters,messageAreaOut,
messageAreaIn);
//将设置好的参数传到connection
setConfigurationPanel();
DimensionscreenSize=Toolkit.getDefaultToolkit().getScreenSize();
setLocation(screenSize.width/2-WIDTH/2,screenSize.height/2
-HEIGHT/2);
setSize(WIDTH,HEIGHT);
}
/**
*SetstheGUIelementsontheconfigurationPanel.
*/
publicvoidsetConfigurationPanel(){
configurationPanel.setConfigurationPanel();
}
/**
*Respondstothemenuitemsandbuttons.
*/
//监听选择及按钮操作
publicvoidactionPerformed(ActionEvente){
Stringcmd=e.getActionCommand();
//Loadsaconfigurationfile.应该就是将配置好的参数的文件从外部直接导入
if(cmd.equals("Load")){
if(connection.isOpen()){
AlertDialogad=newAlertDialog(this,"PortOpen!
",
"Configurationmaynot","beloaded",
"whileaportisopen.");
}else{
FileDialogfd=newFileDialog(this,"LoadPortConfiguration",
FileDialog.LOAD);
fd.setVisible(true);
Stringfile=fd.getFile();
if(file!
=null){
Stringdir=fd.getDirectory();
Filef=newFile(dir+file);
try{
FileInputStreamfis=newFileInputStream(f);
props=newProperties();
props.load(fis);
fis.close();
}catch(FileNotFoundExceptione1){
System.err.println(e1);
}catch(IOExceptione2){
System.err.println(e2);
}
loadParams();
}
}
}
//Savesaconfigurationfile.应该就是将配置好的参数以文件的形式保存
if(cmd.equals("Save")){
configurationPanel.setParameters();
FileDialogfd=newFileDialog(this,"SavePortConfiguration",
FileDialog.SAVE);
fd.setFile("serialdemo.properties");
fd.setVisible(true);
StringfileName=fd.getFile();
Stringdirectory=fd.getDirectory();
if((fileName!
=null)&&(directory!
=null)){
writeFile(directory+fileName);
}
}
//Callsshutdown,whichexitstheprogram.
if(cmd.equals("Exit")){
shutdown();
}
//Opensaport.打开串口
if(cmd.equals("OpenPort")){
portOpened();
}
if(cmd.equals("SendData")){
openButton.setEnabled(false);
//将光标等待
CursorpreviousCursor=getCursor();
setNewCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
//参数已经设置完成,然后再打开串口后将参数一并记录下来
configurationPanel.setParameters();
try{
connection.openConnection();
}catch(SerialConnectionExceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
setNewCursor(previousCursor);
}
//Closesaport.
if(cmd.equals("ClosePort")){
portClosed();
}
//Sendsabreaksignaltotheport.
if(cmd.equals("SendBreak")){
connection.sendBreak();
}
//将接收到得数据清空处理
if(cmd.equals("Clear")){
clear_data();
}
}
/**
*Togglesthebuttonstoanopenportstate.
*/
publicvoidportOpened(){
openButton.setEnabled(false);
closeButton.setEnabled(true);
breakButton.setEnabled(true);
sendButton.setEnabled(true);
clearButton.setEnabled(true);
}
/**
*CallscloseConnectionontheS