a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 111|回复: 1

[基础知识] JAVA基础:Java串行端口通讯技术慨论

[复制链接]
发表于 2012-8-4 12:37:27 | 显示全部楼层 |阅读模式
串行通信和谈有良多种,像RS232,RS485,RS422,甚至现今风行的USB等都是串行通信和谈。而串行通信手艺的应用无处不在。可能巨论价的最多就是电脑的串口与Modem的通信。记得在PC机刚起头在中国风行起来时(年夜约是在90年月前五年),那时甚至有人用一条串行线进行两台电脑之间的数据共享。除了这些,手机,PDA,USB鼠标、键盘等等都是以串行通信的体例与电脑毗连。而笔者工作性质的关系,所接触到的就更多了,像多串口卡,各类种类的具有串口通信接口的检测与测量仪器,串口通信的收集设备等。   虽然串行通信有良多种,但笔者所知的在整个电子通信产物方面,以RS232的腿獠式最为多见。虽然USB接口的电子产物也是层出不穷,但体味一下Java在串行腿獠面的手艺还有有需要的,说不定有哪位读者还想用此手艺写一个PDA与电脑之间数据共享的轨范呢。9 }/ t# B) P4 b: r
  本文首要以RS232为主来讲解Java的串行通信手艺。
6 i3 C- E5 z, \" Q+ K  RS232通信基本
0 l) Y; K; k5 L2 h+ M0 |  RS-232-C(又称 EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA)连系贝尔系统、调制解调器厂家及计较机终端出产厂家配合拟定的用于串行通信的尺度。RS232是一个全双工的通信和谈,它可以同时进行数据领受和发送的工作。RS232的端口凡是有两种:9针(DB9)和25针(DB25)。, d! j. \% u+ Y& p
  DB9和DB25的常用针脚界说/ m  N, v8 K9 c2 g" Q& S! U9 ]$ L
$ j' h% B! A3 F! h! P
  常见的边线体例, O8 H3 z% g; [, Y
  常见的腿獠式是三线式,这种体例是将两个RS232设备的发送端(TXD)和领受端(RXD)及接地端(GND)互相毗连,也是良多读者所知道的毗连体例:8 J! |% G0 Y( d; Z/ Z: n, Q! Q4 A

7 ^: \% H+ G" E+ r" u  这种体例分袂将两头的RS232接口的2--3,3---2,5(7)---5(7)针脚毗连起来。其中2是数据领受线(RXD),3是数据发送线(TXD),5(7)是接地(RND)。如不美观有一台式PC,和一部NoteBook电脑,就可以用这种体例连线了。用三线式可以将年夜年夜都的RS232 设备毗连起来。但如不美观你认死了2--3,3--2,5(7)--5(7)对接这个理,会发此刻连某些RS232设备时并不奏效。这是因为有些设备在电路内部已将2和3线更调过来了,你只要2,3,5(7)针一一对应就行了。7 q% ^- N/ O5 L2 i5 N! u4 U
  小技巧:若何分辩TXD和RXD端口?: M  T- T( I$ ^$ D6 F# V: X# X: f
  搞电子的人手边应该常备一个电表,用来测测电压,电阻什么的会很有用。你只要分袂测一下RS232端口的2--5或3--5针脚之间的电压,凡是TXD针脚与GND之间会有3~15V摆布的负电压,暗示它是TXD针脚。0 N9 w3 m' o: O
  安装Java Communications API# Y$ c; S$ N& v
  Sun的J2SE中并没有直接供给以上提到的任何一种串行通信和谈的开发包,而是以自力的jar包形式发布在java.sun.com网站上(年夜这里下载)---- 即comm.jar,称之为Javatm Communications API,它是J2SE的尺度扩展。comm.jar并不是比来才有,早在1998年时,sun就已经发布了这个开发包。comm.jar分袂供给了对常用的RS232串行端口和IEEE1284并行端口通信的撑持。今朝sun发布的comm.jar只有Windows和Solaris平台两个版本,如不美观你需要Linux平台下的,可以在linuxcomm.html">http://www.geeksville.com/~kevinh/linuxcomm.html找到。0 |7 i2 k- z4 Z) t
  在使用comm.jar之前,必需知道若何安装它。这也是困扰良多初学java RS232通信者的一个难题。如不美观我们电脑上安装了JDK, 它将同时为我们安装一份JRE(Java Runtime Entironment),凡是我们运行轨范时都是以JRE来运行的。所以以下的安装合用于JRE。如不美观你是用JDK来运行轨范的,请将响应的改成。
% |# B4 m, |, I# z$ _+ D  下载了 comm.jar开发包后,与之一路的还有两个主要的文件,win32com.dll和javax.comm.properties。 comm.jar供给了通信用的java API,而win32com.dll供给了供comm.jar挪用的当地驱动接口。而javax.comm.properties是这个驱动的类设置装备摆设文件。首先将comm.jar复制到libext目录。再将win21com.dll复制到你的RS232应用轨范运行的目录,即user.dir。然后将javax.comm.properties复制到lib目录。2 v" D' D- o8 O3 u+ F
  通信前的筹备
0 U% ?' A5 m4 V; W' g  {5 C; ^6 k' V  如不美观你手头膳缦慊有现成的供给了尺度RS232串口的设备,你可以将自己的电脑模拟成两台分歧的串口设备。凡是电脑主机后面的面板供给了两个9针的串口,请将这两个串口的2,3,5脚按前面介绍的体例毗连。电子市场都有现成的毗连头卖,请不要买那种封装的严严实实的接头,而要乱用螺丝封装可以拆开的毗连头,这样可以便利自己按照需要毗连各个针脚。
6 z" Z+ q, A  f) b4 Q9 s, K  当然也可使用模拟串口软件(如:Virtual Serial Port Driver),模拟出两个互相毗连的串口,然后使用串口调试软件(如:SSCOM 串口调试)来底时井口发送和领受。
/ P; k% b, W8 y% Q  Comm API基本
- L* E; }! l0 V# U) o/ U. f+ t/ [2 S! e
  我无意于在此具体描述Comm API每个类和接口的用法,但我会介绍Comm API的类结构和几个主要的API用法。
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:37:28 | 显示全部楼层

JAVA基础:Java串行端口通讯技术慨论

</p>  所有的comm API位于javax.comm包下面。年夜Comm API的javadoc来看,它介绍给我们的只有戋戋以下13个类或接口:
& F7 B! `* B- c; H0 m, l  javax.comm.CommDriver$ ^8 `! F# X* J
  javax.comm.CommPort
! V0 l+ e- a" y- v" K  javax.comm.ParallelPort6 ~- N: e4 Q' J2 @0 P: j
  javax.comm.SerialPort
! A/ x, l: s2 x  javax.comm.CommPortIdentifier
" D3 a6 q+ ~! R" {& ?; v7 b  javax.comm.CommPortOwnershipListener
) ]& D$ B+ Y9 T& w  javax.comm.ParallelPortEvent
$ V- S, @. l* t' `  |2 ?' }8 Q  javax.comm.SerialPortEvent" N7 [# t$ V: k+ s6 y! I
  javax.comm.ParallelPortEventListener (extends java.util.EventListener)' W8 W& l2 y% l, W6 e& ?
  javax.comm.SerialPortEventListener (extends java.util.EventListener)
; M- ^8 I7 e! z( C  javax.comm.NoSuchPortException4 j& L6 A% W' z; o1 E. A
  javax.comm.PortInUseException$ I# i" A$ @/ C5 O9 l) T  ~, A
  javax.comm.UnsupportedCommOperationException4 l$ A" o% ]1 T, m  Y  U
  下面讲解一下几个首要类或接口。2 L& G6 U0 I& ]& x8 d, n
  1.列举出系统所有的RS232端口
* Y: u; j4 E; o/ `# [  在起头使用RS232端口通信之前,我们想知道系统有哪些端口是可用的,以下代码列出系统中所有可用的RS232端口:- Z; j/ d/ \$ w+ i% {1 N+ I
  Enumeration en = CommPortIdentifier.getPortIdentifiers();
$ s. F( h1 x! h: [  CommPortIdentifier portId;
" {! [' Z( s9 A& k3 Q  while (en.hasMoreElements())
; G, M+ L9 {- f4 K* n$ i2 \2 u  {
* E4 H; U4 ]/ ?+ Y# k  portId = (CommPortIdentifier) en.nextElement();
% y, X, X" O5 P% J( W# a, C  /*如不美观端口类型是串口,则打印出其端口信息*/
! z' e2 M$ V4 \$ b  r5 U  if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)9 M) U7 u# z* ~7 g4 n+ |  {; h
  {
1 i* t/ L5 L) _  i) A5 Z  System.out.println(portId.getName());
$ F7 w: ?, x2 A2 u  }
  n$ T# q$ n! f( `2 N  u- f' S: O  }
  Q, F4 H+ K- E1 q, w  在我的电脑上以上轨范输出以下结不美观:
7 u$ z- J+ ?8 h4 d8 l  COM1
, P8 p- f5 @/ G  N# _& O' F  COM2$ M; s; A0 b$ ]. m0 P; A, V
  CommPortIdentifier类的getPortIdentifiers体例可以找到系统所有的串口,每个串口对应一个CommPortIdentifier类的实例。
: \( g: b" D' T" Y! A+ C  2.打初步口
1 l' @2 H, B3 a/ Y5 i  如不美观你使用端口,必需先打开它。
. L1 L. ~" p: J% d" P' F. Q& `2 p: P  try{
4 M% Q3 Y( D' q2 n  CommPort serialPort = portId.open("My App", 60);
2 L# l1 d3 ]7 [1 x# Q  /* 年夜端口中篡夺数据*/2 I. T2 Z! h0 U. A) G1 b
  InputStream input = serialPort.getInputStream();  t  y! u* M/ t3 o
  input.read(...);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-15 15:39 , Processed in 0.384657 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表