`
pichcar
  • 浏览: 287599 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java串行端口技术协议(2)

阅读更多

Comm API基础

  我无意于在此详细描述Comm API每个类和接口的用法,但我会介绍Comm API的类结构和几个重要的API用法。

  所有的comm API位于javax.comm包下面。从Comm API的javadoc来看,它介绍给我们的只有区区以下13个类或接口:

  javax.comm.CommDriver

  javax.comm.CommPort

  javax.comm.ParallelPort

  javax.comm.SerialPort

  javax.comm.CommPortIdentifier

  javax.comm.CommPortOwnershipListener

  javax.comm.ParallelPortEvent

  javax.comm.SerialPortEvent

  javax.comm.ParallelPortEventListener (extends java.util.EventListener)

  javax.comm.SerialPortEventListener (extends java.util.EventListener)

  javax.comm.NoSuchPortException

  javax.comm.PortInUseException

  javax.comm.UnsupportedCommOperationException

  下面讲解一下几个主要类或接口。

  1.枚举出系统所有的RS232端口

  在开始使用RS232端口通讯之前,我们想知道系统有哪些端口是可用的,以下代码列出系统中所有可用的RS232端口:

  Enumeration en = CommPortIdentifier.getPortIdentifiers();

  CommPortIdentifier portId;

  while (en.hasMoreElements())

  {

  portId = (CommPortIdentifier) en.nextElement();

  /*如果端口类型是串口,则打印出其端口信息*/

  if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)

  {

  System.out.println(portId.getName());

  }

  }


  在我的电脑上以上程序输出以下结果:

  COM1

  COM2

  CommPortIdentifier类的getPortIdentifiers方法可以找到系统所有的串口,每个串口对应一个CommPortIdentifier类的实例。

  2.打开端口

  如果你使用端口,必须先打开它。

  try{

  CommPort serialPort = portId.open("My App", 60);

  /*从端口中读取数据*/

  InputStream input = serialPort.getInputStream();

  input.read(...);

  /*往端口中写数据*/

  OutputStream output = serialPort.getOutputStream();

  output.write(...)

  ...

  }catch(PortInUseException ex)

  { ... }


  通过CommPortIdentifier的open方法可以返回一个CommPort对象。open方法有两个参数,第一个是String,通常设置为你的应用程序的名字。第二个参数是时间,即开启端口超时的毫秒数。当端口被另外的应用程序占用时,将抛出PortInUseException异常。

  在这里CommPortIdentifier类和CommPort类有什么区别呢?其实它们两者是一一对应的关系。CommPortIdentifier主要负责端口的初始化和开启,以及管理它们的占有权。而CommPort则是跟实际的输入和输出功能有关的。通过CommPort的getInputStream()可以取得端口的输入流,它是java.io.InputStream接口的一个实例。我们可以用标准的InputStream的操作接口来读取流中的数据,就像通过FileInputSteam读取文件的内容一样。相应的,CommPort的getOutputStream可以获得端口的输出流,这样就可以往串口输出数据了。

  3.关闭端口

  使用完的端口,必须记得将其关闭,这样可以让其它的程序有机会使用它,不然其它程序使用该端口时可能会抛出端口正在使用中的错误。很奇怪的是,CommPortIdentifier类只提供了开启端口的方法,而要关闭端口,则要调用CommPort类的close()方法。
CommPort的输入流的读取方式与文件的输入流有些不一样,那就是你可能永远不知这个InputStream何时结束,除非对方的OutputStream向你发送了一个特定数据表示发送结束,你收到这个特定字符后,再行关闭你的InputStream。而comm.jar提供了两种灵活的方式让你读取数据。

  1.轮询方式(Polling)

  举个例子,你同GF相约一起出门去看电影,但你的GF好打扮,这一打扮可能就是半小时甚至一小时以上。这时你就耐不住了,每两分钟就催问一次“好了没?”,如此这样,直到你的GF说OK了才算完。这个就叫轮询(Polling)。

  在程序中,轮询通常设计成一个封闭的循环,当满足某个条件时即结束循环。刚才那个例子中,你的GF说“OK了!”,这个就是结束你轮询的条件。在单线程的程序中,当循环一直执行某项任务而又无法预知它何时结束时,此时你的程序看起来可能就像死机一样。在VB程序中,这个问题可以用在循环结构中插入一个doEvent语句来解决。而Java中,最好的方式是使用线程,就像以下代码片断一样。

  public TestPort extend Thread

  {

  ...

  InputStream input = serialPort.getInputStream();

  StringBuffer buf = new StringBuffer();

  boolean stopped = false;

  ...

  public void run()

  {

  try {

  while( !stopped )

  int ch = input.read();

  if ( ch=='q' || ch=='Q' )

  {

  /*结束读取,关闭端口...*/

  stopped = true;

  ...

  }

  else

  {

  buf.append((char)ch);

  ...

  }

  }catch (InterruptedException e) { }

  }

  }

 

分享到:
评论

相关推荐

    浅谈Java串行端口技术协议

    浅谈Java串行端口技术协议 浅谈JAVA串行端口技术协议 1 一、串行通讯慨述 2 二、RS232通讯基础 2 三、常见的边线方式 2 四、小技巧:如何辨别TXD和RXD端口? 3 五、安装JAVA COMMUNICATIONS API 3 六、通讯前的准备...

    2022年Java串行端口技术协议Java教程.docx

    2022年Java串行端口技术协议Java教程.docx

    网络通讯更自由 谈Java串行端口技术协议.doc

    网络通讯更自由 谈Java串行端口技术协议.doc

    Javax.comm简介 Java串行端口技术协议 javacomm20 SMSLib串口通信 虚拟串口

    收集的comm串口通信调试的技术文档 Javax.comm简介.doc 浅谈Java串行端口技术协议.doc 关于java使用javacomm20.doc SMSLib串口通信.doc KEIL中如何用虚拟串口调试串口程序.doc

    java串口通讯 短信测试 comm编程 PDU编码 进制转换 AT命令

    13751069146 Saro Modem 短信测试.txt Java Comm API编程指南.doc Javax.comm简介.doc KEIL中如何用虚拟串口调试...浅谈Java串行端口技术协议.doc 短信 AT 命令参考.doc 短信PDU编码解码.doc 通过串口收发短消息.doc

    串行端口

    您将获得具有read() , write()和其他基本功能的原始串行端口,以与您自己的协议一起使用。 快速开始 1.将库添加到您的项目: 将jitpack.io存储库添加到您的根build.gradle中: allprojects { repositories { ....

    Java串口通信详解

    对常用的 RS232 串行端口和 IEEE1284 并行端口通讯的支持。 RS-232-C(又称 EIA RS-232-C,以下简称 RS232)是在 1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解 调器厂家及计算机终端生产厂家共同制定的用于...

    NetLightServer:用于应用程序通信的轻量级 http 服务。 然后,服务器将以格式化的方式将数据发送到串行端口,在该端口上连接有带有适当读取软件的 LED 设备。 led设备控制led条纹

    然后,服务器将以格式化的方式将数据发送到串行端口,带有适当读取软件的 LED 设备连接到串行端口。 LED 设备控制 LED 条纹。协议该服务器的协议非常简单。 将使用这些常量: deviceAddress :the address for the ...

    串口监视软件

    CommMonitor 侦测、拦截、逆向分析串口通信协议, 是侦测RS232/422/485串行端口的专业工具软件,是软硬件工程师的最佳助手。CommMonitor 能侦听、拦截、记录、分析串行通信协议,让您对应用程序操作串行端口的过程和...

    TCP-IP详解卷1:协议

    1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 ...

    matlab向串口发送指令代码-tsa-usb-adapter:该项目允许计算机使用通过USB端口发送的串行协议与MedocTSAII通信

    该项目允许计算机使用通过USB端口发送的串行协议与进行通信。 快速开始 您还应该阅读《 TSA II操作手册》(TSA2OperationManual.pdf),以了解如何构建发送和接收TTL信号的TSA程序。 设置 OSX和Linux 用USB线将...

    串口监视精灵

    CommMonitor 能侦听、拦截、记录、分析串行通信协议,让您对应用程序操作串行端口的过程和细节,让您及时的模拟被侦听程序或设备的数据、控制流,提高工作效率。 二次开发接口DEMO 详细调用方法请参看: Demo\ ...

    jsr80 java 访问 usb

    像串行端口一样,计算机上每一个 USB 端口都由 USB 控制器指定了一个惟一的标识数字(端口 ID)。当 USB 设备附加到 USB 端口上时,就将这个 惟一端口 ID 分配给这台设备,并且 USB 控制器会读取 设备描述符。设备描述...

    TCP/IP技术大全

    17.3.1 串行线路接口协议(SLIP) 179 17.3.2 压缩的SLIP(CSLIP) 180 17.3.3 点到点协议(PPP) 180 17.4 隧道远程访问 184 17.4.1 点到点隧道协议(PPTP) 185 17.4.2 两层隧道协议(L2TP) 188 17.4.3 IPSec 192 17.5 小结...

    CSerialPort:基于C ++的轻量级开源跨平台串口类库基于C ++的轻量级跨平台串行端口库

    支持其他语言,如C,C#,Python,Java,Golang等 6.同步串口通信 7.全新的跨平台串口调试助手 8.增加一个类库的介绍和使用视频 9.串口侦听钩 短期目标 1.跨平台操作系统识别库 2.跨平台多线程类库 3.跨平台...

    TCPIP协议详解(4-1)

    据报文 179 17.3.1 串行线路接口协议(SLIP) 179 17.3.2 压缩的SLIP(CSLIP) 180 17.3.3 点到点协议(PPP) 180 17.4 隧道远程访问 184 17.4.1 点到点隧道协议(PPTP) 185 17.4.2 两层隧道协议(L2TP) ...

    jcctalk:cctalk协议的Java库-开源

    该项目实现了用于硬币接收器和其他接收器的cctalk协议。 当前,它具有非常基本的功能,并且大多数命令... 但是,可以识别硬币输入(通过仿真串行端口在EMP-800硬币接收器上测试)。 该库使用RXTXcomm库进行串行通信。

    firmata4j:用Java编写的Firmata客户端

    通过串行端口,网络或自定义传输层进行通信 协议细节的抽象 提供一个UI组件,以可视化每个引脚的当前状态并允许更改其模式和状态 允许与I2C设备通信 安装 Maven 将以下依赖项添加到项目的pom.xml中: < groupId>...

    TCP-IP技术大全

    据报文 179 17.3.1 串行线路接口协议(SLIP) 179 17.3.2 压缩的SLIP(CSLIP) 180 17.3.3 点到点协议(PPP) 180 17.4 隧道远程访问 184 17.4.1 点到点隧道协议(PPTP) 185 17.4.2 两层隧道协议(L2TP) ...

    usb-serial-for-android:适用于CDC,FTDI,Arduino和其他设备的Android USB主机串行驱动程序库

    您将获得带有read() , write()和的原始串行端口,以与您自己的协议一起使用。 快速开始 1.将库添加到您的项目: 将jitpack.io存储库添加到您的根build.gradle中: allprojects { repositories { .. . maven {...

Global site tag (gtag.js) - Google Analytics