这里有新鲜出炉的 Java 函数式编程, 程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
这篇文章主要介绍了 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;
- }
来源: http://www.phperz.com/article/18/0227/358871.html