惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Cisco Blogs
爱范儿
爱范儿
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
Jina AI
Jina AI
Project Zero
Project Zero
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
Simon Willison's Weblog
Simon Willison's Weblog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
T
Tenable Blog
F
Fortinet All Blogs
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
月光博客
月光博客
雷峰网
雷峰网
G
Google Developers Blog
V
V2EX
T
Tor Project blog
罗磊的独立博客
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
W
WeLiveSecurity
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Privacy International News Feed
S
Securelist
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
小众软件
小众软件
Scott Helme
Scott Helme
I
Intezer
T
Threat Research - Cisco Blogs
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
C
CERT Recently Published Vulnerability Notes
Security Archives - TechRepublic
Security Archives - TechRepublic
酷 壳 – CoolShell
酷 壳 – CoolShell
L
LINUX DO - 最新话题
N
News | PayPal Newsroom
L
Lohrmann on Cybersecurity
T
Troy Hunt's Blog
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Latest news
Latest news
AWS News Blog
AWS News Blog
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - 简单飞扬-

vim个人配置 Docker 开发线程安全的Spring Web应用(转) 1 游戏外挂原理和技术分析(关于魔力宝贝) Java 串口编程 有几件事情 C#开发ActiveX可行性研究 动态编译 利用Java动态编译计算数学表达式 - 简单飞扬- - 博客园 mysql存储过程学习及java调用存储过程 将数据库操作封装MAP 宁静 会一直存在么 java 项目中遇到的错误 toncat配置文件 - 简单飞扬- - 博客园 struts分页 - 简单飞扬- - 博客园 用户中心 - 博客园 自动递归删除 数据库连接
关于java使用javacomm20-win32实践总结 (转)
简单飞扬- · 2009-03-23 · via 博客园 - 简单飞扬-

 由于这几天要通过java调用通过串口或并口连接的硬件资源,所以我就要用到和底层的硬件进行通讯。通过RS-232的通讯协议,了解电脑和外设是怎样进行通讯的。在应用中我们也可以通过JNI来实现(详情请见http://hgq0011.javaeye.com/blog/31508),这样的话,就必须知道更多的知识。由于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)                      2)

java 代码
System.loadLibrary("win32com");   
javax.comm.CommDriver driver = null;   
String driverName = "com.sun.comm.Win32Driver";   
SerialPort sPort = (SerialPort) driver.getCommPort("COM4", ommPortIdentifier.PORT_SERIAL);  

java 代码
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM4");   
SerialPort sPort = (SerialPort)portId.open("shipment",1000);      

                     以上两种方法都可以。不过一般都会采用第二种。方法说明我们获取了对串行端口(COM4),可以和它进行通讯了。
                    b. 设置串行端口通讯参数。

java 代码
sPort.setSerialPortParams(2400,SerialPort.DATABITS_8,SerialPort.STOPBITS_2,SerialPort.PARITY_NONE);  

                          c. 获取输入(出)流。

java 代码
InputStream is = sPort.getInputStream();//从外设获取数据   
OutputStream os = sPort.getOutputStream();//发送命令到外设  

                          d.通过监听器就可以得到数据了。

java 代码
//Set notifyOnDataAvailable to true to allow event driven input.   
            sPort.notifyOnDataAvailable(true);   
  
             // Set notifyOnBreakInterrup to allow event driven break handling.   
            sPort.notifyOnBreakInterrupt(true);   
  
             // Set receive timeout to allow breaking out of polling loop during  input handling.   
            sPort.enableReceiveTimeout(30);   
            StringBuffer linkWgt = new StringBuffer();//存放获取的数据   
            sPort.addEventListener(    
                new SerialPortEventListener(){   
                    public void serialEvent(SerialPortEvent e){   
                        int newData = 0;   
                        // Determine type of event.   
                        switch (e.getEventType()) {   
                        // Read data until -1 is returned. If \r is received substitute   
                            // \n for correct newline handling.   
                            case SerialPortEvent.DATA_AVAILABLE:   
                                while (newData != -1) {   
                                    try {   
                                        newData = is.read();   
                                        if (newData == -1) {   
                                            break;   
                                         
                                        if ('\r' == (char)newData) {   
                                        } else {   
                                            linkWgt.append((char)newData);   
                                         
                                    } catch (IOException ex) {   
                                        System.err.println(ex);   
                                        return;   
                                     
                                 
  
                            // Append received data to messageAreaIn.   
                               
                             try{   
                                System.out.println("linkWgt ---------|||||          "+Double.valueOf(linkWgt.toString()));   
                                   
                             }catch(Exception ew){   
                                ew.printStackTrace();   
                             }finally{   
                                try{   
                                    //用完了,记得关闭端口。   
                                    is.close();   
                                    sPort.close();   
                                }catch(Exception c){   
                                    c.printStackTrace();   
                                 
                              
                            break;   
                            // If break event append BREAK RECEIVED message.   
                            case SerialPortEvent.BI:   
                                System.out.println("\n--- BREAK RECEIVED ---\n");   
                         
                     
  
                 
            );  

                7)常见的异常

                     a. javax.comm.NoSuchPortException   这个说明你的javax.comm.properties没有放到正确的位置。