modbus串口调试

1.window7 64位操作系统的话 要使用java 64位的串口通信包:http://download.csdn.net/detail/likekobe2012/9149871

将里面的三个文件分别放到这里 代表你的jdk安装目录,比如我的是C:\Program Files (x86)\Java\jdk1.6.0_31

Copy RXTXcomm.jar —> /jre/lib/ext
Copy rxtxSerial.dll —> /jre/lib/i386/
Copy rxtxParallel.dll —> /jre/lib/i386/

2.再把rxtxSerial.dll、rxtxParallel.dll复制到C:\Windows\System32文件夹下

3.开启MyEclipse新建项目,BuildPath导入RXTXcomm.jar

4.利用虚拟串口工具建立一个虚拟串口对,http://download.csdn.net/detail/likekobe2012/9149879,这里将COM2、COM5建立串口对

5.利用串口调试工具,开启两个,进行测试,com2、com5是可以通信的,http://download.csdn.net/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);
}

}


作者:奚学长又装死
来源:CSDN
原文:https://blog.csdn.net/likekobe2012/article/details/48828619
版权声明:转载 奚学长又装死 的博客

你可能感兴趣的:(modbus)