java串口编程,java串口通信,监听者模式解析
- 格式:docx
- 大小:23.25 KB
- 文档页数:11
java 串口监听实例
要实现Java串口监听,你需要使用Java提供的m或者Java Communications API来进行串口通讯。
首先你需要确保你的系统上已经安装了Java Communications API,并且你的开发环境已经配置好了相应的库文件。
接下来,你需要创建一个串口监听器类,这个类需要实现m的SerialPortEventListener接口。
在这个类中,你需要实现serialEvent方法,这个方法会在串口事件发生时被调用。
在这个方法中,你可以编写处理串口事件的代码,比如接收串口数据、处理数据等。
接下来,你需要打开串口并添加监听器。
首先获取一个串口对象,然后使用串口对象的addEventListener方法将你创建的串口监听器类实例添加进去。
然后打开串口并设置串口参数,最后就可以开始监听串口事件了。
在串口监听器类中,你可以编写逻辑来处理串口事件,比如读取串口数据、解析数据、做出相应的处理等。
需要注意的是,在串口通讯中,可能会涉及到一些线程同步的问题,你需要确保在处理
串口数据时是线程安全的。
除了上述方法,你还可以使用一些第三方库来简化串口通讯的操作,比如jSerialComm、RXTX等。
这些库提供了更加简洁易用的API,可以帮助你更快速地实现串口监听功能。
总的来说,实现Java串口监听需要你熟悉Java串口通讯的相关知识,了解串口事件的处理机制,以及如何使用相应的API来实现串口监听功能。
希望以上信息能够对你有所帮助。
Java串口通信详解序言说到开源,恐怕很少有人不挑大指称赞。
学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程,商家通过开源软件赚到了钱……,总之是皆大欢喜。
然而开源软件或类库的首要缺点就是大多缺乏详细的说明文档和使用的例子,或者就是软件代码随便你用,就是文档,例子和后期服务收钱。
这也难怪,毕竟就像某个著名NBA 球员说的那样:“我还要养家,所以千万美元以下的合同别找我谈,否则我宁可待业”。
是啊,支持开源的人也要养家,收点钱也不过分。
要想既不花钱又学到知识就只能借助网络和了,我只是想抛砖引玉,为开源事业做出点微薄共献,能为你的工程解决哪怕一个小问题,也就足够了。
虽然我的这个系列介绍的东西不是什么Web框架,也不是什么开源服务器,但是我相信,作为一个程序员,什么样的问题都会遇到。
有时候越是简单的问题反而越棘手;越是小的地方就越是找不到称手的家伙。
只要你不是整天只与“架构”、“构件”、“框架”打交道的话,相信我所说的东西你一定会用到。
1串口通信简介1.1常见的Java串口包1.2串口包的安装(Windows下)2串口API概览mPortmPortIdentifierm.SerialPort2.4串口API实例2.4.1列举出本机所有可用串口2.4.2串口参数的配置2.4.3串口的读写3串口通信的通用模式及其问题3.1事件监听模型3.2串口读数据的线程模型3.3第三种方法4结束语1串口通信简介嵌入式系统或传感器网络的很多应用和测试都需要通过PC机与嵌入式设备或传感器节点进行通信。
其中,最常用的接口就是RS-232串口和并口(鉴于USB接口的复杂性以及不需要很大的数据传输量,USB接口用在这里还是显得过于奢侈,况且目前除了SUN有一个支持USB 的包之外,我还没有看到其他直接支持USB的Java类库)。
SUN的CommAPI分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。
Java串口通信编程指导Java串口通信编程概述在java中,利用Java Communication包能够操作串口,但官方的包在3.0之后就只支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,只是在XP下还能使用。
另外,也能够用开源的Rxtx实现串口通信,那个地点仅以Java Communication包,在Windows平台实现串口通信进行讲明。
前期预备下载Java Communication包下载地址如下:/Jolt/javacomm20-win32.zip。
配置解压缩javacomm20-win32.zip把win32com.dll拷贝到{JA V A_HOME}\jre\bin把comm.jar拷贝到{JA V A_HOME}\jre\lib\extset CLASSPATH={JA V A_HOME}\jre \lib\ext \comm.jar;%classpath%实现过程要紧步骤包括:获得串口标识打开串口设置串行端口通讯参数猎取输入(出)流进行读写操作获得串口标识指定串口的端口号,生成串口的标识类的实例。
a. 通过驱动决定通讯端口是可用的。
b. 打开通讯端口为了I/O操作。
c. 决定端口的拥有者。
d. 解析端口拥有者的争夺。
e. 治理事件显示在端口拥有者的中的状态改变。
示例代码如下:代码:打开串口示例代码如下:代码:5000(毫秒)是超时时刻。
设置串行端口通讯参数设置串口传输的波特率、数据位、停止位、奇偶校验等参数。
示例代码如下:代码:try {// 通信条件の設定// 通信速度 9600 baud// データビット 8bit// ストップビット 1bit// パリティなし// フローコントロールの設定// 無制御を使用port.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);} catch (UnsupportedCommOperationException ex) {ex.printStackTrace();System.exit(1);}猎取输入(出)流利用getInputStream()以及getOutputStream()从每个串口产生对应的输入输出流对象。
java 串口通信案例Java串口通信是指使用Java编程语言实现与串口设备之间的数据通信。
串口通信在很多应用场景中都有广泛的应用,比如物联网、工业自动化、智能家居等领域。
本文将列举十个以Java串口通信为题的案例,介绍其实现方法和应用场景。
1. 串口读取数据通过Java编程语言实现串口读取数据的功能,可以使用Java的串口通信库,如RXTX、JavaComm等。
首先需要打开串口,并设置串口参数,然后通过监听串口数据的方式实时读取串口传入的数据。
这个案例适用于需要实时监控串口设备数据的应用场景,比如环境监测。
2. 串口发送数据通过Java编程语言实现串口发送数据的功能,可以使用Java的串口通信库。
首先需要打开串口,并设置串口参数,然后通过写入数据的方式将数据发送到串口设备。
这个案例适用于需要向串口设备发送指令或数据的应用场景,比如控制外部设备。
3. 串口数据解析通过Java编程语言实现串口数据解析的功能,可以将从串口读取的原始数据进行解析,提取出有用的信息。
可以根据数据格式进行解析,比如按照特定的协议解析数据。
这个案例适用于需要对串口设备传输的数据进行处理和分析的应用场景。
4. 串口数据存储通过Java编程语言实现串口数据存储的功能,可以将从串口读取的数据保存到本地文件或数据库中。
可以根据需求选择适当的存储方式,比如文本文件、二进制文件或数据库。
这个案例适用于需要对串口设备传输的数据进行长期存储和分析的应用场景。
5. 串口数据转发通过Java编程语言实现串口数据转发的功能,可以将从一个串口读取的数据转发到另一个串口。
可以实现串口设备之间的数据交互,比如串口设备之间的数据通信或设备之间的数据同步。
这个案例适用于需要多个串口设备之间进行数据交互的应用场景。
6. 串口数据监控通过Java编程语言实现串口数据监控的功能,可以监控串口设备的状态和传输数据。
可以实时显示串口设备的连接状态、波特率、数据位、停止位等信息,并实时显示串口传输的数据。
基于无线传感定位系统的通信软件一、运行环境:Windows操作系统下运行,由于作品是基于java虚拟机的,所以需要安装jvm 该作品是属于基于硬件的通信软件,所以在对数据的接收上要求无线传感器支持,这个软件主要任务是对无线传感器发送来的数据进行准确,形象的整理和分析。
二、开发环境:软件开发环境是在eclipse这个平台上,基于java的RXTX串口通信技术完成的。
三、功能说明:1、各类结点数据的接受处理和统计;2、界面面板缩进的控制;3、温度数据湿度数据的对比图像;4、图像的缩放功能。
5、室内平面图的上传和缩放以及定位。
6、节点位置信息处理,显示在相对位置图上,每个节点要能够通过颜色反映出节点周围的温度状况。
7、数据的发送功能,我及时的向底层硬件发送数据帧,实现软硬件的实时联系和交互。
8、常用信息的设置功能,比如室温,串口属性信息,数据接受格式等四、作品整体效果展示温湿度曲线显示、控制和对比结点位置信息和温度信息的图像反映五、操作以及功能说明:1、串口设置:要针对电脑接入串口时的属性,和底层数据发送帧的格式在如下面板中设置。
2、常用命令的设置,设置这些向底层发出请求的命令,可以灵活的控制我们所需要的数据,比如我们可以选择请求结点的温度信息,请求结点的湿度信息,或者是位置信息等等。
3、温湿度曲线的控制,设置好之后,点击ok,点击开始按钮,便会接受到底层硬件发来的数据,但是我们的硬件可能是很多个结点,如果都反映在图像上,可能略显混乱,所以我们可以在结点数据面板中控制哪个结点的显示状况。
4、结点位置信息的查看,下面的截图反映了结点的位置信息,大的圆圈是参考结点的位置和温度信息的反映,从内向外温度不断的接近室温,颜色越深的部分表示温度越高,小的绿园是我们要定位的盲几点的位置信息的反映,随着盲几点的实际位置信息的变化,图像中会做出准确的变化。
,5、盲结点和参考结点相关参数的设定,我们选中单选框,信息会出现在文本框中,设置好后,点击update,发送到底层。
小技巧:如何辨别TXD和RXD端口?搞电子的人手边应该常备一个电表,用来测测电压,电阻什么的会很有用。
你只要分别测一下RS232端口的2--5或3--5针脚之间的电压,通常TXD针脚与GND之间会有3~15V左右的负电压,表示它是TXD针脚。
安装JavaCommunicationsAPISun的J2SE中并没有直接提供以上提到的任何一种串行通讯协议的开发包,而是以独立的jar包形式发布在网站上(从这里下载)----即comm.jar,称之为Javatm CommunicationsAPI,它是J2SE的标准扩展。
comm.jar并不是最近才有,早在1998年时,sun就已经发布了这个开发包。
comm.jar分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。
目前sun发布的comm.jar只有Windows和Solaris平台两个版本,如果你需要Linux平台下的,可以在/~kevinh/linuxcomm.html找到。
在使用comm.jar之前,必须知道如何安装它。
这也是困扰许多初学javaRS232通讯者的一个难题。
如果我们电脑上安装了JDK,它将同时为我们安装一份JRE(Java RuntimeEntironment),通常我们运行程序时都是以JRE来运行的。
所以以下的安装适用于JRE。
如果你是用JDK来运行程序的,请将相应的改成。
下载了comm.jar开发包后,与之一起的还有两个重要的文件,win32com.dll和m.properties。
comm.jar提供了通讯用的javaAPI,而win32com.dll提供了供comm.jar调用的本地驱动接口。
而m.properties是这个驱动的类配置文件。
首先将comm.jar复制到\lib\ext目录。
再将win21com.dll复制到你的RS232应用程序运行的目录,即user.dir。
然后将m.properties复制到\lib目录。
java串口通信API说明java串口通信Java提供了 CommunicationAPI(包含于m包中)用于通过与机器无关的方式,控制各种外部设备。
Communications API,是标准的Java的扩展部分,它在JavaAPI中是没有附带的。
因此,必须先在SUN公司网站的Java站点()上下载这个扩展类库。
1.1Communications API 简介Communications API 的核心是抽象的CommPort类及其两个子类:SerialPort类和ParallePort类。
其中,SerialPort类是用于串口通信的类,ParallePort类是用于并行口通信的类。
CommPort类还提供了常规的通信模式和方法,例如:getInputStream( )方法和getOutputStream( )方法,专用于与端口上的设备进行通信。
然而,这些类的构造方法都被有意的设置为非公有的(non-public)。
所以,不能直接构造对象,而是先通过静态的CommPortIdentifer.getPortIdentifiers()获得端口列表;再从这个端口列表中选择所需要的端口,并调用CommPortIdentifer对象的Open( )方法,这样,就能得到一个CommPort对象。
当然,还要将这个CommPort对象的类型转换为某个非抽象的子类,表明是特定的通讯设备。
该子类可以是SerialPort类和ParallePort类中的一个。
下面将分别对CommPort类,CommPortIdentifier类,串口类SerialPort进行详细的介绍。
1.2 CommPortIdentifier类CommPortIdentifier类的方法如下:方法说明addPortName(String, int, CommDriver) 添加端口名到端口列表里addPortOwnershipListener(CommPortOwnershipListener) 添加端口拥有的监听器removePortOwnershipListener(CommPortOwnershipListener) 移除端口拥有的监听器getCurrentOwner() 得到当前占有端口的对象或应用程序getName() 得到端口名称getPortIdentifier(CommPort) 得到参数打开的端口的CommPortIdentifier类型对象getPortIdentifier(String) 得到以参数命名的端口的CommPortIdentifier类型对象getPortIdentifiers() 得到系统中的端口列表getPortType() 得到端口的类型isCurrentlyOwned() 判断当前端口是否被占用open(FileDescriptor) 用文件描述的类型打开端口open(String, int) 打开端口,两个参数:程序名称,延迟时间(毫秒数)1.3 SerialPort类SerialPort关于串口参数的静态成员变量成员变量说明成员变量说明成员变量说明DATABITS_5 数据位为5 STOPBITS_2 停止位为2 PARITY_ODD 奇检验DATABITS_6 数据位为6 STOPBITS_1 停止位为1 PARITY_MARK 标记检验DATABITS_7 数据位为7 STOPBITS_1_5 停止为1.5 PARITY_NONE 空格检验DATABITS_8 数据位为8 PARITY_EVEN 偶检验 PARITY_SPACE 无检验SerialPort对象的关于串口参数的函数方法说明方法说明getBaudRate() 得到波特率 getParity() 得到检验类型getDataBits() 得到数据位数 getStopBits() 得到停止位数setSerialPortParams(int, int, int, int) 设置串口参数依次为(波特率,数据位,停止位,奇偶检验)SerialPort关于事件的静态成员变量成员变量说明成员变量说明BI Break interrupt中断 FE Framing error错误CD Carrier detect载波侦听 OE Overrun error错误CTS Clear to send清除以传送 PE Parity error奇偶检验错误DSR Data set ready数据备妥 RI Ring indicator响铃侦测DATA_AVAILABLE 串口中的可用数据 OUTPUT_BUFFER_EMPTY 输出缓冲区空SerialPort中关于事件的方法方法说明方法说明方法说明isCD() 是否有载波 isCTS() 是否清除以传送 isDSR() 数据是否备妥isDTR() 是否数据端备妥 isRI() 是否响铃侦测 isRTS() 是否要求传送addEventListener(SerialPortEventListener) 向SerialPort对象中添加串口事件监听器removeEventListener() 移除SerialPort对象中的串口事件监听器notifyOnBreakInterrupt(boolean) 设置中断事件true有效,false 无效notifyOnCarrierDetect(boolean) 设置载波监听事件true有效,false无效notifyOnCTS(boolean) 设置清除发送事件true有效,false无效notifyOnDataAvailable(boolean) 设置串口有数据的事件true有效,false无效notifyOnDSR(boolean) 设置数据备妥事件true有效,false无效notifyOnFramingError(boolean) 设置发生错误事件true有效,false无效notifyOnOutputEmpty(boolean) 设置发送缓冲区为空事件true有效,false无效notifyOnParityError(boolean) 设置发生奇偶检验错误事件true 有效,false无效notifyOnRingIndicator(boolean) 设置响铃侦测事件true有效,false无效getEventType() 得到发生的事件类型返回值为int型sendBreak(int) 设置中断过程的时间,参数为毫秒值setRTS(boolean) 设置或清除RTS位setDTR(boolean) 设置或清除DTR位SerialPort中的其他常用方法方法说明close() 关闭串口getOutputStream() 得到OutputStream类型的输出流getInputStream() 得到InputStream类型的输入流一年半前在jbuilder2006下写过串口通信程序,最近做一个GPS-SMS 项目,用到串口通信,在JBUILDER 配置了comm.jar却发现找不到端口,经过几番查找才发现自己配置的路径错了,浪费了不少时间,有必要记下来,防止下次出错,此次还暴露了自己看文章一目十行,走马观花的毛病。
Java监听器Listener使⽤详解转载请注明原⽂地址:在我的项⽬中有具体应⽤:https:///ygj0930/CoupleSpace监听器⽤于监听web应⽤中某些对象、信息的创建、销毁、增加,修改,删除等动作的发⽣,然后作出相应的响应处理。
当范围对象的状态发⽣变化的时候,服务器⾃动调⽤监听器对象中的⽅法。
常⽤于统计在线⼈数和在线⽤户,系统加载时进⾏信息初始化,统计⽹站的访问量等等。
分类:按监听的对象划分,可以分为ServletContext对象监听器HttpSession对象监听器ServletRequest对象监听器按监听的事件划分对象⾃⾝的创建和销毁的监听器对象中属性的创建和消除的监听器session中的某个对象的状态变化的监听器⽰例:⽤监听器统计⽹站在线⼈数原理:每当有⼀个访问连接到服务器时,服务器就会创建⼀个session来管理会话。
那么我们就可以通过统计session的数量来获得当前在线⼈数。
所以这⾥⽤到的是HttpSessionListener。
1:创建监听器类,实现HttpSessionListener接⼝。
2:重写监听器类中的⽅法public class onLineCount implements HttpSessionListener {public int count=0;//记录session的数量public void sessionCreated(HttpSessionEvent arg0) {//监听session的创建count++;arg0.getSession().getServletContext().setAttribute("Count", count);}@Overridepublic void sessionDestroyed(HttpSessionEvent arg0) {//监听session的撤销count--;arg0.getSession().getServletContext().setAttribute("Count", count);}}3:在web.xml中配置监听器。
串口监听工作原理宝子们!今天咱们来唠唠串口监听这事儿,可有趣啦。
串口呢,就像是一个小窗口,数据就在这个小窗口里进进出出的。
串口监听就像是在这个小窗口旁边安了个小耳朵,偷偷地听数据在里面都说了啥。
你想啊,设备之间要交流数据,就像人说话一样。
串口就是它们说话的通道。
比如说,你的电脑和一个小设备,像什么传感器之类的要交换信息。
传感器就会把它测到的东西,像温度啊、湿度啊这些数据,通过串口这个通道发给电脑。
串口监听这个时候就在旁边,悄悄地把这些数据都听下来。
那它具体咋听的呢?这就涉及到一些小魔法啦。
串口有它自己的一些规则,就像我们说话有语法一样。
它有波特率这个东西,波特率就像是说话的速度。
如果波特率是9600,那就好比每秒说9600个小信号。
串口监听得知道这个速度,这样才能跟上数据的节奏,就像你听别人说话,得跟上人家的语速一样。
还有数据位、停止位这些小概念。
数据位就像是每个字的笔画数,不同的设备可能会设置不同的数据位,串口监听得搞清楚这个,才能准确地把数据这个“字”给识别出来。
停止位呢,就像是一句话说完后的停顿,它告诉监听者,这一组数据说完啦。
在硬件层面上,串口监听可能是通过一些专门的芯片或者电路来实现的。
这些电路就像是一个个小侦探,它们时刻准备着捕捉串口上的信号变化。
当有数据信号在串口的那些线上跑来跑去的时候,它们就开始工作啦。
从软件的角度看呢,就像是有个小秘书在电脑里。
这个小秘书程序知道串口的各种设置,它就在那等着数据来。
一旦有数据从串口进来,它就把数据接过来,然后可以做很多有趣的事儿。
比如把数据显示在屏幕上,让我们能看到那些神秘的数字和字母到底是啥意思。
或者呢,把数据存起来,以后可以慢慢分析。
有时候啊,串口监听还能发现一些小问题呢。
比如说,数据传错了。
就像人说话说错了字一样。
如果按照正常的规则,数据应该是某个样子,但是监听的时候发现不是,那就可能是传输过程中出了岔子。
这时候就可以提醒设备重新发送或者找找哪里出了问题。
串口通讯相关参数串口通讯是一种在计算机与外部设备之间进行数据传输的通信方式,它通过串行传输方式实现数据的双向传输。
在进行串口通讯时,需要设置一些相关的参数以确保通讯的稳定和数据的正确传输。
下面是一些常见的串口通讯相关参数:2.数据位(Data Bits):数据位指的是每个数据帧中有效数据位的数量。
常见的数据位有5位、6位、7位、8位,其中8位是最常用的。
3.停止位(Stop Bits):停止位指的是用于标识一个数据帧的结束的位数。
常见的停止位有1位、1.5位、2位,其中1位是最常用的。
4.校验位(Parity Bit):校验位用于检测数据传输过程中是否出现错误。
常见的校验方式有奇校验、偶校验、无校验等。
校验位的选择需要根据数据的重要性和传输环境的噪声情况来确定。
5.流控制(Flow Control):流控制用于保证数据的正常传输,在数据发送和接收的过程中,通过控制信号线的状态来实现对数据流的控制。
常见的流控制方式有硬件流控制和软件流控制。
6.串口模式(Serial Mode):串口模式指的是串口的工作方式,包括半双工模式和全双工模式。
在半双工模式下,数据的传输是单向的,而在全双工模式下,数据的传输是双向的。
7.缓冲区大小(Buffer Size):缓冲区大小指的是串口接收和发送数据时所使用的缓冲区的大小,它决定了串口能够一次性处理的数据量。
缓冲区大小的设置需要根据数据的传输速率和系统的处理能力来确定。
除了上述参数外,还有一些其他的串口通讯相关参数,如硬件控制信号的状态(如RTS、CTS、DTR、DSR等),数据的格式(如数据的编码方式、数据的格式化等)、串口的工作模式(如异步模式、同步模式等)。
这些参数的选择和设置需要根据具体的应用场景、硬件设备和软件平台来确定。
总之,串口通讯相关参数的设置是保证串口通讯稳定和数据准确传输的重要保障,需要根据具体的需求和硬件环境来进行选择和配置。
java调用coms端口串口通信的方法。
首先需要下到串口驱动。
javacomm20-win32.zip去sun的主页应该有下的。
在这个驱动中有comm.jar,m.properties,win32com.dll这么3个重要的文件。
1、首先配置驱动,把m.properties,win32com.dll拷贝到你的jdk 中具体位置为C:\Program Files\Java\jdk1.6.0_06\bin然后配置windows系统环境变量,在path中加入C:\ProgramFiles\Java\jdk1.6.0_06\bin;打开你的java工程,配置user library,并导入comm.jar包。
2、现在就可以开始写代码了。
串口读写代码如下CommPortIdentifier portID =CommPortIdentifier.getPortIdentifier(com);//1,先拿到Identifier//其中com是String类型的,传入的是串口名com="COM1";SerialPort port = (SerialPort)portID.open("MyComm", 100000000);//2,打开串口//"MyComm"是串口名,100000000是串口过期时间(ms)。
port.setSerialPortParams(rate, databits,stopbit, parity);//3,设置串口属性//rate 波特率(默认9600),databits载波位(默认8),stopbit停止位(默认1),parity校验位(默认0无校验)port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);//4(可选)设置数据流控制模式,默认为无port.close();//关闭串口3、串口读入写出流。
OutputStream os=port.getOutputStream();//拿到写出流。
写出流就随便写就行。
port.getOutputStream().flush();//写完要记得做一次冲一下缓冲区InputStream is= port.getInputStream();//拿到读入流。
is.read();//每次读入一个int,这个是个阻塞函数,在无数据的时候会中断。
4、串口读入轮询模式一种读取的方式是每次做byte b[]=new byte[1024];is.read(b);如果返回的是-1表示无数据。
可以中断几毫秒然后再去读。
比较低效的一种读取模式,但是在使用阻塞函数的时候还是很好用的。
5、串口的监听模式//5.1首先建立监听类public class CommListener implements SerialPortEventListener//继承自m.SerialPortEventListener;//实现监听方法public void serialEvent(SerialPortEvent arg0){}当有新数据进入的时候会被调用,传入m.SerialPortEvent对象参数。
if (arg0.getEventType()==SerialPortEvent.DATA_AVAILABLE)//如果是有效数据的话就做read{//read();}//5.2建立好监听类以后要在port上添加。
port.addEventListener(commListener);//其中port是上文打开的串口端口,commListener是上文的监听器实例port.notifyOnDataAvailable(true);//设置监听模式为当有数据到达时唤醒监听线程。
//千万注意一定要有这句代码,其他很多博文都没有介绍这个。
没这句话就不会唤醒监听线程了。
java操作com串口配置的一些问题2010-08-11 17:24从来没想过用java来操作底层!昨天接到一个小项目!从底层的串口读取数据,然后用web页面显示出来!很明显用C可以很好的处理底层的交互!可是对于web习惯也熟悉了jsp,所以想用java来处理串口!Google一下java和串口,可以找到很多关于java处理串口的文章,其中离不开两个技术一个是用sun提供的comm.jar,一个是RXTX提供的RXTXcomm.jar,其中后者是对前者完全的覆盖!不过麻烦的是这两个都需要安装,我的问题就是出在这里!配置了一个晚上不仅一团糟,而且还没办法运行,现在把几个可能遇到的问题总结下:1.首先需要弄清楚jdk和jre这两者的关系,要明白编译时候和运行时环境不同,一般安装jdk会有两个jre,而jre就是java程序运行时应该提供的环境,安装完jdk在java的目录下一般有两个文件夹jdk1.6.0_03和jre1.6.0_03,在jdk1.6.0_03目录下也有个jre目录,这是因为jdk工具本身就是一个java 的程序,所以他自己运行也需要jre的环境,那么本机运行java程序到底是哪个jre在作用?这个问题必须要搞清楚!这时候环境变量设置就有了作用一个是PATH,一个CLSASSPATH,这两个的设置就关系到底是哪个jre在作用,还有一个比较土的办法是修改其中一个jre名字,然后看是哪个使得java程序运行不正常即可!要搞清楚jre原因是因为comm.jar的程序运行需要在jre增加一些文件。
2.配置comm.jar环境,首先需要下载comm.jar以及和其相应的win32com.dll和m.properties这两个文件,由于sun已经停止了对comm的更新和维护,因此sun官网已经下载不到,不过可以上网去找!得到这三个文件之后,网络上有很多种关于comm.jar安装的方法说明,可是我试过很多都没用!导致后来修改太多自己都乱了,只有重装jdk来试!最后的结果是这样:在确定哪个jre情况下把win32com.dll放在jdk1.6.0_03/bin/的目录下,(我的jre是jdk目录下的)把comm.jar和m.properties放在jdk1.6.0_03\jre\lib\ext目录下注意是ext目录下,这也是我一直出错问题所在,网络上总是叫人放在jdk1.6.0_03\jre\lib\目录下!这样就可以了我的CLASSPATH=.;D:\Program Files\Java\jdk1.6.0_03\bin然后PATH 增加了D:\Program Files\Java\jdk1.6.0_03\bin这项,重启命令行,就可以了!3.配置RXTXcomm.jar,一样需要下载comm.jar和其相关的rxtxSerial.dll 这这个文件,一样的是rxtxSerial.dll放在jdk1.6.0_03/bin/的目录下,RXTXcomm.jarjdk1.6.0_03\jre\lib\ext目录下注意是ext目录下。
最终问题得以解决,终于可以读写串口了!WINDOWS环境下JAVA串口RXTX编程DEMO2010-08-11 16:44m在windows下的开发维护已经停止了,rxtx的旧版本支持在m-win32-2.0基础上的扩展,rxtx新版本支持对m的覆盖式支持,也就是说原来用m的把所有import m.*改成import gnu.io.*就可以正常使用了,其他只须相关的dll文件,不用properties文件,支持的端口类型也明显多了很多下载地址:ftp:///pub/rxtx/rxtx-2.1-7-bins-r2.zip里面的然后配置环境∙ copy rxtxSerial.dll into your c:\program files\java\jre-version\bin dir∙ copy RXTXcomm.jar into your c:\programfiles\java\jre-version\lib\ext dir把下载包中Windows\i368-mingw32\rxtxSerial.dll 放到你%java_home%\jre\bin下面把下载包中RXTXcomm.jar放到%java_home%\jre\lib\ext下面OK,可以写程序了/****/package cn.zhongxiaogang.test;import java.io.*;import java.util.*;import gnu.io.*;public class SimpleRead implements SerialPortEventListener{ //SerialPortEventListener 监听器,我的理解是独立开辟一个线程监听串口数据static CommPortIdentifier portId; //串口通信管理类static Enumeration portList; //已经连接上的端口的枚举InputStream inputStream; //从串口来的输入流OutputStream outputStream;//向串口输出的流SerialPort serialPort; //串口的引用public SimpleRead() {try {serialPort = (SerialPort) portId.open("myApp", 2000);//打开串口名字为myapp,延迟为2毫秒} catch (PortInUseException e) {}try {inputStream = serialPort.getInputStream();outputStream = serialPort.getOutputStream();} catch (IOException e) {}try {serialPort.addEventListener(this); //给当前串口天加一个监听器} catch (TooManyListenersException e) {}serialPort.notifyOnDataAvailable(true); //当有数据时通知try {serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8, //设置串口读写参数SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);} catch (UnsupportedCommOperationException e) {}}public void serialEvent(SerialPortEvent event){//SerialPortEventListener 的方法,监听的时候会不断执行switch (event.getEventType()) {case SerialPortEvent.BI:case SerialPortEvent.OE:case SerialPortEvent.FE:case SerialPortEvent.PE:case SerialPortEvent.CD:case SerialPortEvent.CTS:case SerialPortEvent.DSR:case SerialPortEvent.RI:case SerialPortEvent.OUTPUT_BUFFER_EMPTY:break;case SerialPortEvent.DATA_AVAILABLE://当有可用数据时读取数据,并且给串口返回数据byte[] readBuffer = new byte[20];try {while (inputStream.available() > 0) {int numBytes = inputStream.read(readBuffer);}outputStream.write("xiaogang".getBytes());System.out.println(new String(readBuffer));} catch (IOException e) {}break;}}public static void main(String[] args) {try {portList = CommPortIdentifier.getPortIdentifiers(); //得到当前连接上的端口while (portList.hasMoreElements()) {portId = (CommPortIdentifier) portList.nextElement();if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {//判断如果端口类型是串口if (portId.getName().equals("COM3")) { //判断如果COM3端口已经启动就连接SimpleRead reader = new SimpleRead(); //实例一个}}}} catch (Exception e) {e.printStackTrace();}}}程序调试成功,不过还有很多问题,比如有乱码,还有程序不面向对象,etc.java串口编程(短信modem)2010-03-02 09:04关键字: java串口编程, 短信modem, at指令最终目标:在Linux下提供一个稳定可靠的Java短信发送服务器。