追随Java
简单的事情重复做,就会产生累积效应!
BlogJava
首页
新文章
新随笔
聚合
管理
posts - 260, comments - 338, trackbacks - 0
关于java使用javacomm20-win32实践总结
关于java使用javacomm20-win32实践总结
由于这几天要通过java调用通过串口或并口连接的硬件资源,所以我就要用到和底层的硬件进行通讯。通过RS-232的通讯协议,了解电脑和外设是怎样进行通讯的。在应用中我们也可以通过JNI来实现(详情请见http://www.blogjava.net/hgq0011/archive/2005/09/21/13637.html),这样的话,就必须知道更多的知识。由于
java已经提供我们一个javacomm20-win32通用的API我们还是实行 “拿来主义”
吧。我就把整个应用的过程详细的说一下,希望给需要的人一点帮助。
我们经过串口和外设通讯,下面我就以
串口为例进行解说
。
1)我们要准备相应的设备。
电脑,外设,通过数据线把他们连接起来。
2)检验外设到底是用的那个COM口和电脑通讯的。
也就是说,他们有没有真确的连接上。我们可以通过下载串口通讯口测试软件,我用的是
"SuperCommTool.exe"的绿色软件,进行测试的
。这软件很适应,如果选中的某个COM已经被使用了,它会给你一个相应的提示(端口以被占用)。如果你不知道到底是使用的那个端口,那么你可以通过superCommTool软件一个一个的试,如果正常的话,那么你可以看到有数据显示在数据接收窗口。也许,有些主板的串口坏了,那么你就要买一个转接卡,通过PCI插口转接。
3)察看外设使用说明书知道外设的相关参数。
比如,波特率,数据位,停止位,校验位,等等。只有正确参数,才能显示正确的数据。当然,你可以在通讯测试软件上调试这些参数的。比如:波特率 = 2400,数据位 = 8,停止位 = 2 ,校验位 = 1。
4)准备开发环境。
最基本的JDK了,你可以使用自己钟爱的IDE,帮助你开发。IDE可能自带了JDK,那么 你要把相应的javaComm20-win32放到运行时使用的JDK中。 下载JAVAcomm20-win32。
5)了解javaComm20-win32。
你必须把win32com.dll复制到java.home/bin下;把javax.comm.properties 复制到java.home/lib下;把comm.jar添加到你classPath下。
前面两个都是非常重要的
。
下面说明用到的几个类:
javax.comm.CommPortIdentifier
通讯端口管理器,CommPortIdentifier是控制访问到通讯端口的中 心类。
它包括的方法有:
a. 通过驱动决定通讯端口是可用的。
b. 打开通讯端口为了I/O操作。
c. 决定端口的拥有者。
d. 解析端口拥有者的争夺。
e. 管理事件显示在端口拥有者的中的状态改变。
一个应用程序首先使用CommPortIdentifier中的方法,通过相关的驱动去获取那些通讯端口是可用的 并且选择一个端口便于开始。然后它使用方法在其它类中想CommPort,ParallelPort和SerialPort通过 这个端口进行通讯。
javax.comm.SerialPort
一个RS-232串口通讯端口。SerialPort 描述底层的接口到一个串口通讯端口 变得有效的通过底层的系统。SerialPort定义最小的必需的功能便于串口通讯端口。
javax.comm.SerialPortEventListener
串行端口事件传播。
javax.comm.CommDriver
6)代码的编写。
a. 获取SerialPort sPort对象的两种方法。
1)
System.loadLibrary(
"
win32com
"
);
javax.comm.CommDriver driver
=
null
;
String driverName
=
"
com.sun.comm.Win32Driver
"
;
SerialPort sPort
=
(SerialPort) driver.getCommPort(
"
COM4
"
, CommPortIdentifier.PORT_SERIAL);
2)
CommPortIdentifier portId
=
CommPortIdentifier.getPortIdentifier(
"
COM4
"
);
SerialPort sPort
=
(SerialPort)portId.open(
"
shipment
"
,
1000
);
以上两种方法都可以。不过一般都会采用第二种。方法说明我们获取了对串行端口(COM4),可以和它进行通讯了。
b. 设置串行端口通讯参数。
sPort.setSerialPortParams(
2400
,SerialPort.DATABITS_8,SerialPort.STOPBITS_2,SerialPort.PARITY_NONE);
c. 获取输入(出)流。
InputStream is
=
sPort.getInputStream();
//
从外设获取数据
OutputStream os = sPort.getOutputStream()
;
//
发送命令到外设
d.通过监听器就可以得到数据了。
1
//
Set notifyOnDataAvailable to true to allow event driven input.
2
sPort.notifyOnDataAvailable(
true
);
3
4
//
Set notifyOnBreakInterrup to allow event driven break handling.
5
sPort.notifyOnBreakInterrupt(
true
);
6
7
//
Set receive timeout to allow breaking out of polling loop during input handling.
8
sPort.enableReceiveTimeout(
30
);
9
StringBuffer linkWgt
=
new
StringBuffer();
//
存放获取的数据
10
sPort.addEventListener(
11
new
SerialPortEventListener()
{
12
public
void
serialEvent(SerialPortEvent e)
{
13
int
newData
=
0
;
14
//
Determine type of event.
15
switch
(e.getEventType())
{
16
//
Read data until -1 is returned. If \r is received substitute
17
//
\n for correct newline handling.
18
case
SerialPortEvent.DATA_AVAILABLE:
19
while
(newData
!=
-
1
)
{
20
try
{
21
newData
=
is.read();
22
if
(newData
==
-
1
)
{
23
break
;
24
}
25
if
(
'
\r
'
==
(
char
)newData)
{
26
}
else
{
27
linkWgt.append((
char
)newData);
28
}
29
}
catch
(IOException ex)
{
30
System.err.println(ex);
31
return
;
32
}
33
}
34
35
//
Append received data to messageAreaIn.
36
37
try
{
38
System.out.println(
"
linkWgt ---------|||||
"
+
Double.valueOf(linkWgt.toString()));
39
40
}
catch
(Exception ew)
{
41
ew.printStackTrace();
42
}
finally
{
43
try
{
44
//
用完了,记得关闭端口。
45
is.close();
46
sPort.close();
47
}
catch
(Exception c)
{
48
c.printStackTrace();
49
}
50
}
51
break
;
52
//
If break event append BREAK RECEIVED message.
53
case
SerialPortEvent.BI:
54
System.out.println(
"
\n--- BREAK RECEIVED ---\n
"
);
55
}
56
}
57
58
}
59
);
7)常见的异常
a. javax.comm.NoSuchPortException 这个说明你的javax.comm.properties没有放到正确的位置。
如果有什么不正确的地方,欢迎批评指正,谢谢!
posted on 2007-03-23 09:48
Harryson
阅读(5940)
评论(4)
编辑
收藏
所属分类:
Jni--Communication
、
J2SE
FeedBack:
#
re: 关于java使用javacomm20-win32实践总结
2007-03-23 12:18 |
turbochen
没什么可补充的,有兴趣可以参考一下我2004年写的文章:
http://blog.csdn.net/turbochen/archive/2004/05/07/8105.aspx
关于win32com.dll可以就放在你的应用程序(.jar)所在的目录。不用拔山涉水的放到java.home/bin下,破坏原目录的内容。
回复
更多评论
#
re: 关于java使用javacomm20-win32实践总结
2007-03-23 17:15 |
Christ Chang
原来那篇文章是你写的,严重顶一下!!
回复
更多评论
#
re: 关于java使用javacomm20-win32实践总结
2007-09-21 00:16 |
dxr
顶一下!!!
不过我没有javax.comm类库,从网上也下载不了,能给我传一个吗?
我的邮箱是dxianr@163.com 先谢了!
回复
更多评论
#
re: 关于java使用javacomm20-win32实践总结
2013-01-31 12:28 |
lsc
javax.comm.CommDriver driver = null; diver没有初始化吧?
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
关于java使用javacomm20-win32实践总结
javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构下实现与硬件(读卡器)通讯
串口通讯
<
2007年3月
>
日
一
二
三
四
五
六
25
26
27
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(10)
给我留言
查看公开留言
查看私人留言
随笔分类
(319)
AJAX(4)
Coffee House(78)
cvs(2)
cygwin(2)
Eclipse(5)
EJB(13)
ERP(2)
Hibernate(15)
Html(9)
iBatis(3)
IDE(5)
J2SE(17)
Javascript(14)
Jboss(10)
Jdbc(4)
Jni--Communication(3)
Management(18)
NetWork(7)
Oracle
PowerDesigner(2)
Proxool(1)
Question(12)
SoftwareEngineering(20)
Spring(17)
SqlServer(18)
Struts(4)
Tutorial(15)
VFP(1)
Web Service (1)
WebWork(6)
WSAD(11)
AJAX
Buffalo
DWR
Coffee House
CCTV
slashdotcn
verycd
凯迪网络
联合早报
蓝牙耳机
CSS
bindows
netvtm
Onestab
openwebdesign
UI设计
walterzorn
WebFx
蓝色经典论坛
Java
IBM
Java.net
Java.sun
JavaWorld
JAVA天下
onjava
sourceforge
JavaScript
JavaScript论坛
Open Source
Apache
bjug
Codehaus
crack
eclipse-plugins
grails
Hibernate
Jboss
laszlo
Midwinter
OpenOffice
Spring
theserverside
WebWork
webworkSc
源码网
一个不错的源码发布与下载网站
ProjectManagement
domain-driven design
信息资源
软件架构
项目管理者联盟
友情Blog
@misseye
BuggyBean
Gavin King
James Strachan
JC
liuruhong
Rami
Rory Ye
techno.blog("Dion")
utopian
Waterye
平和大度 探索追求
梦想风暴
独钓寒江
透明思考
最新随笔
1. 工作认真就够了吗?
2. 出门在外请多注意安全
3. 物业管理公司太不负责任,真让人气愤
4. 你是否还在为学历在担心?
5. 公司准备上ERP的情况
6. WAS非常奇怪的问题
7. 系统上线感悟
8. 关注自己的职业发展方向
9. 硬盘资料整理好了吗?备份了吗?
10. 说说公司给大家工作PC的配置?
11. CVS使用注意
12. 空调噪音问题严重
13. 私活就那么难搞定吗?
14. 用groovy你能做一些酷的事情
15. acegi是一个很好的开源项目,通过认证和授权来保护资源
最新评论
1. re: spring初始化时出错了,[未登录]
没有编译好
--ff
2. re: Error creating bean with name
@呵呵
缺少包。commons-pool.jar
--tlj
3. re: 正则表达式(限制text只允许输入int ,float)
去你妈逼滴
--操你妈
4. re: 正则表达式(限制text只允许输入int ,float)
1212
--ht
5. dddddddddddd
ddddddddddddddddd
--ddddddddddddd
6. re: 关于java使用javacomm20-win32实践总结
javax.comm.CommDriver driver = null; diver没有初始化吧?
--lsc
7. re: spring+hibernate初始化出错,错误真是隐蔽得很,让人郁闷,,,
太感谢了,这个问题弄了我超久
--qiuzhiye51
8. re: org.hibernate.PropertyNotFoundException: Could not find a getter for empDeptId in class com.legend.shipment.Temployee
太谢谢了 这个问题我找了很久 谢谢
--sos
9. re: javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构下实现与硬件(读卡器)通讯
与硬件通讯的dll还需要自己写吗?
--南无
10. re: 太不负责任,真让人气愤
评论内容较长,点击标题查看
--8989899
阅读排行榜
1. 当 IDENTITY_INSERT 设置为 OFF 时,不能向表 中的标识列插入显式值。(30164)
2. Error creating bean with name (18536)
3. CPU使用率不高,内存怎么使用率也不高,但系统假死了(9247)
4. org.hibernate.PropertyNotFoundException: Could not find a getter for empDeptId in class com.legend.shipment.Temployee(8682)
5. PowerDesigner学习指南(8198)
6. spring+hibernate初始化出错,错误真是隐蔽得很,让人郁闷,,,(7921)
7. 私活就那么难搞定吗?(7688)
8. javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构下实现与硬件(读卡器)通讯(6195)
9. 用hibernate作为持久层,update是出现了重复记录(6174)
10. 关于java使用javacomm20-win32实践总结(5940)
11. 正则表达式(限制text只允许输入int ,float)(5589)
12. spring+hibernate下连接两个以上的数据库(5299)
13. Cannot create JDBC driver of class (4900)
14. jboss+eclipse+jboss-IDE部署运行EJB3(4882)
15. ResultSet can not re-read row data for column(4813)
评论排行榜
1. GMail邀请函(43)
2. 私活就那么难搞定吗?(19)
3. 合同期满,是留还是跳,怎样抉择?(16)
4. javascript 与applet的通讯 和java与c(dll文件)通讯,最终在b/s架构下实现与硬件(读卡器)通讯(13)
5. ResultSet can not re-read row data for column(11)
6. 当 IDENTITY_INSERT 设置为 OFF 时,不能向表 中的标识列插入显式值。(11)
7. 出事了,盗版被抓,(11)
8. PowerDesigner学习指南(9)
9. 奇怪的死机??(9)
10. 项目(框架)架构的抉择(8)