1.window7 64位操作系统的话 要使用java 64位的串口通信包:http://download.youkuaiyun.com/detail/likekobe2012/9149871
将里面的三个文件分别放到这里 <JAVA_HOME>代表你的jdk安装目录,比如我的是C:\Program Files (x86)\Java\jdk1.6.0_31
Copy RXTXcomm.jar —> <JAVA_HOME>/jre/lib/ext
Copy rxtxSerial.dll —> <JAVA_HOME>/jre/lib/i386/
Copy rxtxParallel.dll —> <JAVA_HOME>/jre/lib/i386/
2.再把rxtxSerial.dll、rxtxParallel.dll复制到C:\Windows\System32文件夹下
3.开启MyEclipse新建项目,BuildPath导入RXTXcomm.jar
4.利用虚拟串口工具建立一个虚拟串口对,http://download.youkuaiyun.com/detail/likekobe2012/9149879,这里将COM2、COM5建立串口对
5.利用串口调试工具,开启两个,进行测试,com2、com5是可以通信的,http://download.youkuaiyun.com/detail/likekobe2012/9149929
6.代码
package com;
import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;
/**
*
-
串口工具的调试
-
<功能详细描述>
-
@author like
-
@version [版本号, 2015-9-30]
-
@see [相关类/方法]
-
@since [产品/模块版本]
*/
public class CommTest implements Runnable, SerialPortEventListener
{
private String m_sAppName = “串口测试工具Like”;/**
- 端口的等待时间
*/
private int m_iWaitTime = 2000;
/**
- 线程时间
*/
private int m_iThreadTime = 0;
private CommPortIdentifier m_commPort;
private SerialPort m_serialPort;
private InputStream m_inputStream;
private OutputStream m_outputStream;
/**
-
列出所有端口
-
<功能详细描述>
-
@see [类、类#方法、类#成员]
*/
@SuppressWarnings(“rawtypes”)
public void listPort()
{
CommPortIdentifier commPortIdentifier;
Enumeration enumeration = CommPortIdentifier.getPortIdentifiers();
System.out.println(“现在列出所有PC端口:” + enumeration);while (enumeration.hasMoreElements())
{
commPortIdentifier = (CommPortIdentifier)enumeration.nextElement();
if (commPortIdentifier.getPortType() == CommPortIdentifier.PORT_SERIAL)
{
System.out.println(commPortIdentifier.getName() + “,” + commPortIdentifier.getCurrentOwner());
}
}
}
/**
-
根据端口名选中端口
-
<功能详细描述>
-
@param sPortName
-
@see [类、类#方法、类#成员]
*/
@SuppressWarnings(“rawtypes”)
public void selectPort(String sPortName)
{
m_commPort = null;
CommPortIdentifier commPortIdentifier;
Enumeration enumeration = CommPortIdentifier.getPortIdentifiers();while (enumeration.hasMoreElements())
{
commPortIdentifier = (CommPortIdentifier)enumeration.nextElement();if (commPortIdentifier.getPortType() == CommPortIdentifier.PORT_SERIAL && commPortIdentifier.getName().equals(sPortName)) { m_commPort = commPortIdentifier; openPort(); break; }
}
}
/**
-
打开端口
-
<功能详细描述>
-
@see [类、类#方法、类#成员]
*/
public void openPort()
{
if (m_commPort == null)
{
log(String.format(“无法找到名字为’%1$s’的串口”, m_commPort.getName()));}
else
{
log(“端口选择成功,当前端口:” + m_commPort.getName() + “,现在实例化 serialPort:”);try { m_serialPort = (SerialPort)m_commPort.open(m_sAppName, m_iWaitTime); log("实例化 serialPort成功!"); } catch (PortInUseException e) { throw new RuntimeException(String.format("端口'%1$s'正在使用中!", m_commPort.getName())); }
}
}
/**
-
检查端口是否正确连接
-
<功能详细描述>
-
@see [类、类#方法、类#成员]
*/
public void checkPort()
{
if (m_commPort == null)
{
throw new RuntimeException(“没有选择端口,请使用 selectPort(string sPortName)方法选择端口”);
}
if (m_serialPort == null)
{
throw new RuntimeException(“serialPort对象为null”);}
}
/**
-
向端口发送数据
-
<功能详细描述>
-
@param sMessage
-
@see [类、类#方法、类#成员]
*/
public void write(String sMessage)
{
checkPort();
try
{
m_outputStream = new BufferedOutputStream(m_serialPort.getOutputStream());
}
catch (IOException e)
{
throw new RuntimeException(“获取端口的OutputStream出错” + e.getMessage());
}try
{
m_outputStream.write(sMessage.getBytes());
log(“向端口发送信息成功:” + sMessage);
}
catch (IOException e)
{
throw new RuntimeException(“向端口发送信息时出错:” + e.getMessage());
}
finally
{
try
{
m_outputStream.close();
}
catch (Exception e)
{}
}
}
/**
-
开始监听从端口中接收的数据
-
<功能详细描述>
-
@param iTime
-
@see [类、类#方法、类#成员]
*/
public void startRead(int iTime)
{
checkPort();
try
{
m_inputStream = new BufferedInputStream(m_serialPort.getInputStream());
}
catch (IOException e)
{
throw new RuntimeException(“获取端口的InputStream出错:” + e.getMessage());
}try
{
m_serialPort.addEventListener(this);
}
catch (TooManyListenersException e)
{
throw new RuntimeException(e.getMessage());
}m_serialPort.notifyOnDataAvailable(true);
log(String.format(“开始监听来自’%1KaTeX parse error: Expected '}', got 'EOF' at end of input: …ormat("监听程序将在%1d秒后关闭”, m_iThreadTime));
}
}
public void close()
{
m_serialPort.close();
m_serialPort = null;
m_commPort = null;
}/**
- 记录日志
- <功能详细描述>
- @param sMessage 日志信息
- @see [类、类#方法、类#成员]
*/
public void log(String sMessage)
{
System.out.println(m_sAppName + “–>” + sMessage);
}
@Override
public void run()
{
try
{
Thread.sleep(m_iThreadTime);
m_serialPort.close();
log(String.format(“端口’%1$s’监听关闭了!”, m_commPort.getName()));
}
catch (Exception e)
{
e.printStackTrace();
}
}@Override
public void serialEvent(SerialPortEvent arg0)
{
switch (arg0.getEventType())
{
case SerialPortEvent.BI?Break interrupt,通讯中断/
case SerialPortEvent.OE:/Overrun error,溢位错误/
case SerialPortEvent.FE:/Framing error,传帧错误/
case SerialPortEvent.PE?Parity error,校验错误/
case SerialPortEvent.CD?Carrier detect,载波检测/
case SerialPortEvent.CTS:/Clear to send,清除发送/
case SerialPortEvent.DSR:/Data set ready,数据设备就绪/
case SerialPortEvent.RI:/Ring indicator,响铃指示/
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/Output buffer is empty,输出缓冲区清空/
break;
case SerialPortEvent.DATA_AVAILABLE:/Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端/
byte[] readBuffer = new byte[1024];
String readStr = “”;
String s2 = “”;try { while (m_inputStream.available() > 0) { m_inputStream.read(readBuffer); readStr += new String(readBuffer).trim(); } s2 = new String(readBuffer).trim(); log("接收到端口返回数据(长度为" + readStr.length() + "):" + readStr); log(s2); } catch (IOException e) { } }
}
- 端口的等待时间
}
7.由于com2、com5是连接的,我们测试的时候,向com2写数据,串口调试助手com5里面是可以接收到数据的
package com;
public class CommUseTest
{
public static void main(String[] args)
throws InstantiationException, IllegalAccessException
{
CommTest com = new CommTest();
com.listPort();
com.selectPort("COM2");
com.write("Too young Too simple,sometimes naive!!!");
com.startRead(10);
}
}
8.利用java程序接收从串口调试助手发来的信息,串口调试助手利用com5发送数据
package com;
public class CommUseTest
{
public static void main(String[] args)
throws InstantiationException, IllegalAccessException
{
CommTest com = new CommTest();
com.listPort();
com.selectPort("COM2");
//com.write("Too young Too simple,sometimes naive!!!");
com.startRead(100);
}
}
作者:奚学长又装死
来源:优快云
原文:https://blog.youkuaiyun.com/likekobe2012/article/details/48828619
版权声明:转载 奚学长又装死 的博客