知识大全 浅谈Java串行端口技术协议
Posted 通讯
篇首语:人之相识,贵在相知;人之相知,贵在知心。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 浅谈Java串行端口技术协议相关的知识,希望对你有一定的参考价值。
浅谈Java串行端口技术协议 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
串行通讯慨述 串行通讯协议有很多种 像RS RS RS 甚至现今流行的USB等都是串行通讯协议 而串行通讯技术的应用无处不在 可能大家见的最多就是电脑的串口与Modem的通讯 记得在PC机刚开始在中国流行起来时(大约是在 年代前五年) 那时甚至有人用一条串行线进行两台电脑之间的数据共享 除了这些 手机 PDA USB鼠标 键盘等等都是以串行通讯的方式与电脑连接 而笔者工作性质的关系 所接触到的就更多了 像多串口卡 各种种类的具有串口通讯接口的检测与测量仪器 串口通讯的网络设备等 虽然串行通讯有很多种 但笔者所知的在整个电子通讯产品方面 以RS 的通讯方式最为多见 虽然USB接口的电子产品也是层出不穷 但了解一下Java在串行通讯方面的技术还有有必要的 说不定有哪位读者还想用此技术写一个PDA与电脑之间数据共享的程序呢 本文主要以RS 为主来讲解Java的串行通讯技术 RS 通讯基础 RS C(又称EIA RS C 以下简称RS )是在 年由美国电子工业协会(EIA)联合贝尔系统 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准 RS 是一个全双工的通讯协议 它可以同时进行数据接收和发送的工作 RS 的端口通常有两种 针(DB )和 针(DB ) DB 和DB 的常用针脚定义 > > 常见的边线方式 常见的通讯方式是三线式 这种方式是将两个RS 设备的发送端(TXD)和接收端(RXD)及接地端(GND)互相连接 也是许多读者所知道的连接方式 > > 这种方式分别将两端的RS 接口的 ( ) ( )针脚连接起来 其中 是数据接收线(RXD) 是数据发送线(TXD) ( )是接地(RND) 如果有一台式PC 和一部NoteBook电脑 就可以用这种方式连线了 用三线式可以将大多数的RS 设备连接起来 但如果你认死了 ( ) ( )对接这个理 会发现在连某些RS 设备时并不奏效 这是因为有些设备在电路内部已将 和 线调换过来了 你只要 ( )针一一对应就行了 小技巧 如何辨别TXD和RXD端口? 搞电子的人手边应该常备一个电表 用来测测电压 电阻什么的会很有用 你只要分别测一下RS 端口的 或 针脚之间的电压 通常TXD针脚与GND之间会有 ~ V左右的负电压 表示它是TXD针脚 安装Java Communications API Sun的J SE中并没有直接提供以上提到的任何一种串行通讯协议的开发包 而是以独立的jar包形式发布在网站上(从这里下载) 即m jar 称之为Javatm Communications API 它是J SE的标准扩展 m jar并不是最近才有 早在 年时 sun就已经发布了这个开发包 m jar分别提供了对常用的RS 串行端口和IEEE 并行端口通讯的支持 目前sun发布的m jar只有Windows和Solaris平台两个版本 如果你需要Linux平台下的 可以在找到 在使用m jar之前 必须知道如何安装它 这也是困扰许多初学java RS 通讯者的一个难题 如果我们电脑上安装了JDK 它将同时为我们安装一份JRE(Java Runtime Entironment) 通常我们运行程序时都是以JRE来运行的 所以以下的安装适用于JRE 如果你是用JDK来运行程序的 请将相应的改成 下载了m jar开发包后 与之一起的还有两个重要的文件 win dll和m properties m jar提供了通讯用的java API 而win dll提供了供m jar调用的本地驱动接口 而m properties是这个驱动的类配置文件 首先将m jar复制到\\lib\\ext目录 再将win dll复制到你的RS 应用程序运行的目录 即user dir 然后将m properties复制到\\lib目录 通讯前的准备 如果你手头上没有现成的提供了标准RS 串口的设备 你可以将自己的电脑模拟成两台不同的串口设备 通常电脑主机后面的面板提供了两个 针的串口 请将这两个串口的 脚按前面介绍的方法连接 电子市场都有现成的连接头卖 请不要买那种封装的严严实实的接头 而要买用螺丝封装可以拆开的连接头 这样可以方便自己根据需要连接各个针脚 Comm API基础 我无意于在此详细描述Comm API每个类和接口的用法 但我会介绍Comm API的类结构和几个重要的API用法 所有的m API位于m包下面 从Comm API的javadoc来看 它介绍给我们的只有区区以下 个类或接口 m CommDriver m CommPort m ParallelPort m SerialPort m CommPortIdentifier m CommPortOwnershipListener m ParallelPortEvent m SerialPortEvent m ParallelPortEventListener (extends java util EventListener) m SerialPortEventListener (extends java util EventListener) m NoSuchPortException m PortInUseException m UnsupportedCommOperationException 下面讲解一下几个主要类或接口 枚举出系统所有的RS 端口 在开始使用RS 端口通讯之前 我们想知道系统有哪些端口是可用的 以下代码列出系统中所有可用的RS 端口: Enumeration en = CommPortIdentifier getPortIdentifiers(); CommPortIdentifier portId; while (en hasMoreElements()) portId = (CommPortIdentifier) en nextElement(); /*如果端口类型是串口 则打印出其端口信息*/ if (portId getPortType() == CommPortIdentifier PORT_SERIAL) System out println(portId getName()); 在我的电脑上以上程序输出以下结果 CommPortIdentifier类的getPortIdentifiers方法可以找到系统所有的串口 每个串口对应一个CommPortIdentifier类的实例 打开端口 如果你使用端口 必须先打开它 try CommPort serialPort = portId open( My App ); /*从端口中读取数据*/ 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可以获得端口的输出流 这样就可以往串口输出数据了 关闭端口 使用完的端口 必须记得将其关闭 这样可以让其它的程序有机会使用它 不然其它程序使用该端口时可能会抛出端口正在使用中的错误 很奇怪的是 CommPortIdentifier类只提供了开启端口的方法 而要关闭端口 则要调用CommPort类的close()方法 CommPort的输入流的读取方式与文件的输入流有些不一样 那就是你可能永远不知这个InputStream何时结束 除非对方的OutputStream向你发送了一个特定数据表示发送结束 你收到这个特定字符后 再行关闭你的InputStream 而m jar提供了两种灵活的方式让你读取数据 轮询方式(Polling) 举个例子 你同GF相约一起出门去看电影 但你的GF好打扮 这一打扮可能就是半小时甚至一小时以上 这时你就耐不住了 每两分钟就催问一次 好了没? 如此这样 直到你的GF说OK了才算完 这个就叫轮询(Polling) 在程序中 轮询通常设计成一个封闭的循环 当满足某个条件时即结束循环 刚才那个例子中 你的GF说 OK了! 这个就是结束你轮询的条件 在单线程的程序中 当循环一直执行某项任务而又无法预知它何时结束时 此时你的程序看起来可能就像死机一样 在VB程序中 这个问题可以用在循环结构中插入一个doEvent语句来解决 而Java中 最好的方式是使用线程 就像以下代码片断一样 public TestPort extend Thread InputStream input = serial cha138/Article/program/Java/hx/201311/26696相关参考
Java线程池技术实现TCP端口扫描 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
Java程序性能优化-并行替代串行 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 并
Javaswing组件的串行化和读取 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 由于JBut
JavaSocket通信如何摆平自身端口问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Ja
PHP是一种功能强大的Web开发语言开发效率高语法简单为动态网站量身定做加强面向对象(向C++靠拢与JAVA搭了点边)可惜单线程(这是至命弱点据说PHP是用CC++编写的)也能用CC++JAVA开
使用Java控制UDP协议 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 什么是UDP协议 U
浅谈Java的输入输出流 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n
浅谈Java中this的使用 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! this是指当前对
浅谈Java多线程的同步问题 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 多线程的同步依靠的是
浅谈Java网站开发过程中的优势 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! Java是一种被