欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java 串口通信详细及简单实例

程序员文章站 2024-03-08 12:26:34
java 实现串口通信 最近做了一个与硬件相关的项目,刚开始听说用java和硬件打交道,着实下了一大跳。java也可以操作硬件? 后来接触到是用java通过串口通信控制...

java 实现串口通信

最近做了一个与硬件相关的项目,刚开始听说用java和硬件打交道,着实下了一大跳。java也可以操作硬件?

后来接触到是用java通过串口通信控制硬件感觉使用起来还不错,也很方便。

特拿出来和大家一起分享一下。

准备工作:

首先到sun官网下载一个zip包:javacomm20-win32.zip

其中重要的有这几个文件:

win32com.dll

comm.jar

javax.comm.properties

按照说明配置好环境,如下:

将win32com.dll复制到<jdk>\bin目录下;将comm.jar复制到<jdk>\lib;把 javax.comm.properties也同样拷贝到<jdk>\lib目录下。然而在真正运行使用串口包的时候,仅作这些是不够的。因 为通常当运行“java myapp”的时候,是由jre下的虚拟机启动myapp的。而我们只复制上述文件到jdk相应目录下,所以应用程序将会提示找不到串口。解决这个问题的 方法很简单,我们只须将上面提到的文件放到jre相应的目录下就可以了

到这一个可以java 串口开发环境就搭建完成了

确认本机可以使用的串口:

package test;

import java.util.enumeration;
import java.util.hashmap;

import javax.comm.commportidentifier;
import javax.comm.serialport;

public class getserialports {

  public void listportchoices() {
    commportidentifier portid;
    enumeration en = commportidentifier.getportidentifiers();
    // iterate through the ports.
    while (en.hasmoreelements()) {
      portid = (commportidentifier) en.nextelement();
      if (portid.getporttype() == commportidentifier.port_serial) {
        system.out.println(portid.getname());
      }
    }

  }

  public static void main(string[] args) {

    getserialports gsp = new getserialports();
    gsp.listportchoices();

  }

}



打开串口,关闭串口:

package test;

import java.io.ioexception;
import java.io.inputstream;
import java.io.outputstream;
import java.util.enumeration;
import java.util.hashmap;

import javax.comm.commportidentifier;
import javax.comm.portinuseexception;
import javax.comm.serialport;
import javax.comm.unsupportedcommoperationexception;

public class getserialports {

  private commportidentifier portid;

  private serialport testport;

  private commportidentifier myport;

  private inputstream is;

  private outputstream os;

  public void listportchoices() {

    enumeration en = commportidentifier.getportidentifiers();
    // iterate through the ports.
    while (en.hasmoreelements()) {
      portid = (commportidentifier) en.nextelement();
      if (portid.getporttype() == commportidentifier.port_serial) {
        system.out.println(portid.getname());
      }
      myport = portid;// 任意取一个串口,比如com1
    }

  }

  public boolean openport() {
    try {
      testport = (serialport) myport.open("com1", 500);// 注意这里必须换成一个真实的串口
      try {
        this.testport.setserialportparams(38400, serialport.databits_8,
            serialport.stopbits_1, serialport.parity_even);
      } catch (unsupportedcommoperationexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
      }
      try {
        this.testport.enablereceivetimeout(30);
      } catch (unsupportedcommoperationexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
      }
      this.testport.setoutputbuffersize(1024);
      this.testport.setinputbuffersize(1024);

      try {
        this.is = this.testport.getinputstream();
      } catch (ioexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
      }
      try {
        this.os = this.testport.getoutputstream();
      } catch (ioexception e) {
        // todo auto-generated catch block
        e.printstacktrace();
      }
      this.testport.notifyondataavailable(true);
      this.testport.notifyonoutputempty(true);
      this.testport.notifyonbreakinterrupt(true);

      // this.printerport.addeventlistener(new printportlistener(is));
      system.out.println("打开com1机串口成功");
      return true;
    } catch (portinuseexception e) {
      // todo auto-generated catch block
      e.printstacktrace();
      return false;
    }

  }

  /**
   * todo 关闭端口
   * 
   * @param
   * @return map
   * @throws
   */
  public boolean closeport() {
    // todo auto-generated method stub
    try {
      if (null != this.testport) {
        is.close();
        os.close();
        this.testport.close();
      }
      system.out.println("关闭com1串口成功");
      return true;
    } catch (exception e) {
      // todo auto-generated catch block
      // e.printstacktrace();
      system.out.println("关闭com1串口失败");
      return false;
    }
  }

  public static void main(string[] args) {

    getserialports gsp = new getserialports();
    gsp.listportchoices();
    gsp.openport();

  }

}

读数据:

/**
   * todo 接收端口數據
   * 
   * @param inputstream
   * @return string
   * @throws
   */
  public string readdata(inputstream is) {
    // 读取缓冲区域
    byte[] readbuffer = new byte[4096];
    int readdatalength = 0;
    try {
      readdatalength = is.read(readbuffer);
      // for (byte b : readbuffer) {
      // system.out.print(b);
      // }
      // system.out.println();
    } catch (ioexception e) {
      // todo auto-generated catch block
      e.printstacktrace();
      return null;
    }
    // 将真实数据保存到零时数组中
    byte[] readtemp = new byte[readdatalength];
    for (int i = 0; i < readdatalength; i++) {
      readtemp[i] = readbuffer[i];
    }

    // 将byte数组转换为16进制字符串
    string stringtemp = feelthebase.bytestohexstring(readtemp);
    // system.out.println("指令返回值" + stringtemp);

    return stringtemp;

  }


感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!