zoukankan      html  css  js  c++  java
  • JAVA 串口编程 (三)

    四、实例分析

    同API一起下载的还有一个examples文件,里面有个最简单的读、写程序,对其进行注释,以增进了理。

    (1)读串口

    import java.io.*;
    import java.util.*;
    import javax.comm.*;
     
    public class SimpleRead implements Runnable, SerialPortEventListener {
     
        static CommPortIdentifier portId;
        static Enumeration portList;//枚举类
     
    10      InputStream inputStream;
    11      SerialPort serialPort;
    12      Thread readThread;
    13   
    14      public static void main(String[] args) {
    15   
    16          portList = CommPortIdentifier.getPortIdentifiers();/*不带参数的getPortIdentifiers方法获得一个枚举对象,该对象又包含了系统中管理每个端口的CommPortIdentifier对象。注意这里的端口不仅仅是指串口,也包括并口。这个方法还可以带参数。getPortIdentifiers(CommPort)获得与已经被应用程序打开的端口相对应的CommPortIdentifier对象。 getPortIdentifier(String portName)获取指定端口名(比如“COM1”)的CommPortIdentifier对象。*/
    17   
    18          while (portList.hasMoreElements()) {
    19              portId = (CommPortIdentifier) portList.nextElement();
    20              if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)/*getPortType方法返回端口类型*/ {
    21                  // if (portId.getName().equals("COM1"))/* 找Windows下的第一个串口*/ {
    22                  if (portId.getName().equals("/dev/term/a"))/*找Unix-like系统下的第一个串口*/ {
    23                      SimpleRead reader = new SimpleRead();
    24                  }
    25              }
    26          }
    27      }
    28   
    29      public SimpleRead() {
    30          try {
    31              serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);/* open方法打开通讯端口,获得一个CommPort对象。它使程序独占端口。如果端口正被其他应用程序占用,将使用 CommPortOwnershipListener事件机制,传递一个PORT_OWNERSHIP_REQUESTED事件。每个端口都关联一个 InputStream 何一个OutputStream。如果端口是用open方法打开的,那么任何的getInputStream都将返回相同的数据流对象,除非有close 被调用。有两个参数,第一个为应用程序名;第二个参数是在端口打开时阻塞等待的毫秒数。*/
    32          } catch (PortInUseException e) {}
    33          try {
    34              inputStream = serialPort.getInputStream();/*获取端口的输入流对象*/
    35          } catch (IOException e) {}
    36      try {
    37              serialPort.addEventListener(this);/*注册一个SerialPortEventListener事件来监听串口事件*/
    38      } catch (TooManyListenersException e) {}
    39   
    40          serialPort.notifyOnDataAvailable(true);/*数据可用*/
    41   
    42          try {
    43              serialPort.setSerialPortParams(9600,
    44                  SerialPort.DATABITS_8,
    45                  SerialPort.STOPBITS_1,
    46                  SerialPort.PARITY_NONE);/*设置串口初始化参数,依次是波特率,数据位,停止位和校验*/
    47          } catch (UnsupportedCommOperationException e) {}
    48   
    49          readThread = new Thread(this);
    50          readThread.start();
    51      }
    52   
    53      public void run() {
    54          try {
    55              Thread.sleep(20000);
    56          } catch (InterruptedException e) {}
    57      }
    58   
    59  //串口事件
    60      public void serialEvent(SerialPortEvent event) {
    61   
    62          switch(event.getEventType()) {
    63          case SerialPortEvent.BI:/*Break interrupt,通讯中断*/
    64          case SerialPortEvent.OE:/*Overrun error,溢位错误*/
    65          case SerialPortEvent.FE:/*Framing error,传帧错误*/
    66          case SerialPortEvent.PE:/*Parity error,校验错误*/
    67          case SerialPortEvent.CD:/*Carrier detect,载波检测*/
    68          case SerialPortEvent.CTS:/*Clear to send,清除发送*/
    69          case SerialPortEvent.DSR:/*Data set ready,数据设备就绪*/
    70          case SerialPortEvent.RI:/*Ring indicator,响铃指示*/
    71          case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Output buffer is empty,输出缓冲区清空*/
    72              break;
    73   
    74          case SerialPortEvent.DATA_AVAILABLE:/*Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端*/
    75              byte[] readBuffer = new byte[20];
    76   
    77              try {
    78                  while (inputStream.available() > 0) {
    79                      int numBytes = inputStream.read(readBuffer);
    80                  }
    81                  System.out.print(new String(readBuffer));
    82              } catch (IOException e) {}
    83              break;
    84          }
    85      }
    86  }
    87   

     

    (2)写串口

    import java.io.*;
    import java.util.*;
    import javax.comm.*;
     
    public class SimpleWrite {
        static Enumeration portList;
        static CommPortIdentifier portId;
        static String messageString = "Hello, world!/n";
        static SerialPort serialPort;
    10      static OutputStream outputStream;
    11   
    12      public static void main(String[] args) {
    13          portList = CommPortIdentifier.getPortIdentifiers();
    14   
    15          while (portList.hasMoreElements()) {
    16              portId = (CommPortIdentifier) portList.nextElement();
    17              if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
    18                  // if (portId.getName().equals("COM1")) {
    19                  if (portId.getName().equals("/dev/term/a")) {
    20                      try {
    21                          serialPort = (SerialPort)
    22                              portId.open("SimpleWriteApp", 2000);
    23                      } catch (PortInUseException e) {}
    24                      try {
    25                          outputStream = serialPort.getOutputStream();
    26                      } catch (IOException e) {}
    27                      try {
    28                          serialPort.setSerialPortParams(9600,
    29                              SerialPort.DATABITS_8,
    30                              SerialPort.STOPBITS_1,
    31                              SerialPort.PARITY_NONE);
    32                      } catch (UnsupportedCommOperationException e) {}
    33                      try {
    34                          outputStream.write(messageString.getBytes());
    35                      } catch (IOException e) {}
    36                  }
    37              }
    38          }
    39      }
    40  }
    41   
  • 相关阅读:
    Flume-NG源码分析-整体结构及配置载入分析
    Flume之核心架构深入解析
    使用maven构建scala项目
    大数据的一些面试题
    HBase原理和设计
    Hive UDAF开发详解
    Hive UDTF开发指南
    Hive UDF开发指南
    局域网访问电脑中VMware虚拟机
    百度面试-前端
  • 原文地址:https://www.cnblogs.com/dyufei/p/2573911.html
Copyright © 2011-2022 走看看