ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:30.29KB ,
资源ID:4192896      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-4192896.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(串口通信Word格式.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

串口通信Word格式.docx

1、SUN的CommAPI分别提供了对常用的 RS232串行端口和 IEEE1284并行端口通讯的支持。目前,常见的Java串口包有SUN 在 1998 年发布的串口通信 API : comm2.0.jar(Windows 下)、 comm3.0.jar(Linux/Solaris);IBM 的串口通信 API 以及一个开源的 实现。鉴于在 Windows下SUN的API比较常用以及IBM的实 现和SUN的在API层面都是一样的,那个开源的实现又不像两 家大厂的产品那样让人放心,这里就只介绍SUN的串口通信API 在Windows平台下的使用。串口包的安装(Windows下)至U SUN的网站下载

2、javacomm20-win32.zip,包含的东西如 下所示:和加 解庄到 测试幻 J omm2O-Win32.zipVconimapi - ZIP压缩文件,解包大&各新令 大小 压茅j ayadocsj applesCOflllTi 了童23, 043F 7 changes:, html3,335O_li cense, tut3, 141i CMnAFI_FAQ. tut瓦374喝二j *輩电詹 camn. propertl的Jjdkl 2. html2, 132FlatfrmSpci fi c. html3,715Readme, html3,913621in32coni dlF-;27,

3、648文件密-命奇功 収意夹(U)选项 祜助QD按照其使用说明(Readme.html)的说法,要想使用串口包进行 串口通信,除了设置好环境变量之外, 还要将win32com.dll复制至Ubin 目录下;将 comm.jar 复制至U lib;把 m.properties 也 同样拷贝到lib目录下。然而在真正运行使用串口包的时候,仅 作这些是不够的。因为通常当运行“ java MyApp ”的时候,是由 JRE下的虚拟机启动MyApp的。而我们只复制上述文件到 JDK 相应目录下,所以应用程序将会提示找不到串口。 解决这个问题的方法很简单,我们只须将上面提到的文件放到 JRE相应的目录下就

4、可以了。串口 API介绍m.CommPort这是用于描述一个被底层系统支持的端口的抽象类。 它包含一些高层的10控制方法,这些方法对于所有不同的通讯端口来 说是通用的。SerialPort和ParallelPort都是它的子类,前者用于 控制串行端口而后者用于控这并口, 二者对于各自底层的物理端口都有不同的控制方法。这里我们只关心 SerialPort。m.CommPortlde ntifier这个类主要用于对串口进行管理和设置, 是对串口进行访问控制的核心类。主要包括以下方法确定是否有可用的通信端口为10操作打开通信端口决定端口的所有权处理端口所有权的争用管理端口所有权变化引发的事件(Eve

5、 nt)m.SerialPort这个类用于描述一个 RS-232串行通信端口的底层接口,它 定义了串口通信所需的最小功能集。 通过它,用户可以直接对串 口进行读、写及设置工作。串口 API实例压缩包中除了 api,还包括了几个小例子,下面我们就一起看 一下串口包自带的例子-SerialDemo中的一小段代码来加深对 串口 API核心类的使用方法的认识。列举出本机所有可用串口void listPortChoices() CommPortIde ntifier portId;Enu merati on en = CommPortIde ntifier.getPortlde ntifiers();/

6、 iterate through the ports.while (en .hasMoreEleme nts() portId = (CommPortIde ntifier) en.n extEleme nt();if (portld.getPortType()CommPortIde ntifier.PORT_SERIAL) System.out.pri ntln (portld.getName();portChoice.select(parameters.getPortName();以上代码可以列举出当前系统所有可用的串口名称, 我的机器上输出的结果是COM1和COM3。串口参数的配置串口一

7、般有如下参数可以在该串口打开以前配置进行配置:Port Name:CCW1* Baud Rate:115200Fiow Control In:None Flow Control OutData Bits:8* Stop Bits:Parity:打开哂口 |关闭炳口包括波特率,输入/输出流控制,数据位数,停止位和奇偶 校验SerialPort sPort;try sPort.setSerialPortParams(BaudRate,Databits,Stopbits,Parity);设置输入/输出控制流sPort.setFlowC on trolMode(FlowC on trolIn | Fl

8、owC on trolOut); catch (Un supportedCommOperatio nExcepti on e) 串口的读写对串口读写之前需要先打开一个串口:CommPortIde ntifier portId =CommPortIde ntifier.getPortlde ntifier(PortName);try SerialPort sPort = (SerialPort) portId.open(” 串口所有者名称超时等待时间); catch (PortlnUseException e) /如果端口被占用就抛出这个异常throw new SerialC onn ectio

9、 nExceptio n(e.getMessage();用于对串口写数据BufferedOutputStream(sPort.getOutputStream();os.write(i nt data);In putStream isnew用于从串口读数据Buffered In putStream(sPort.getl nputStream();int receivedData = is.read();读出来的是int型,你可以把它转换成需要的其他类型。这里要注意的是,由于 Java语言没有无符号类型,即所有 的类型都是带符号的,在由 byte到int的时候应该尤其注意。因为如果byte的最高位

10、是1,则转成int类型时将用1来占位。这 样,原本是 10000000的byte类型的数变成 int型就成了1111111110000000这是很严重的问题,应该注意避免。串口通信的通用模式及其问题下面开始我们本次的重点-串口应用的研究。由于向串口写 数据很简单,所以这里我们只关注于从串口读数据的情况。 通常,串口通信应用程序有两种模式,一种是实现 SerialPortEventListener接口,监听各种串口事件并作相应处理 ;另一种就是建立一个独立的接收线程专门负责数据的接收。 由于这两种方法在某些情况下存在很严重的问题, 所以我的实现是采用第三种方法来解决这个问题。事件监听模型现在我们

11、来看看事件监听模型是如何运作的:首先需要在你的端口控制类(例如SManager)加上“ impleme nts SerialPortEve ntListe ner ”在初始化时加入如下代码:SerialPort sPort.addEve ntListe ner(SMa nager);liste ners catch (TooMa nyListe nersExcepti on e) sPort.close();throw new SerialC onn ecti on Excepti on (too many added);sPort. notify On DataAvailable(true)

12、;覆写 public void serialEvent(SerialPortEvent e)方法,在其中对如下事件进行判断:BI -通讯中断.CD -载波检测.CTS -清除发送.DATA_AVAILABLE -有数据到达.DSR -数据设备准备好.FE -帧错误.OE -溢位错误.OUTPUT_BUFFER_EMPTY -输出缓冲区已清空PE -奇偶校验错.RI -振铃指示.一般最常用的就是 DATA_AVAILABLE-串口有数据到达事 件。也就是说当串口有数据到达时, 你可以在serialEvent中接收并处理所收到的数据。然而在我的实践中,遇到了一个十分严重 的问题。首先描述一下我的实

13、验:我的应用程序需要接收传感器节点 从串口发回的查询数据,并将结果以图标的形式显示出来。 串口设定的波特率是115200,串口每隔128毫秒返回一组数据(大约 是30字节左右),周期(即持续时间)为31秒。实测的时候在一个 周期内应该返回4900多个字节,而用事件监听模型我最多只能 收到不到1500字节,不知道这些字节都跑哪里去了,也不清楚 到底丢失的是那部分数据。值得注意的是,这是我将serialEvent() 中所有处理代码都注掉,只剩下打印代码所得的结果。 数据丢失的如此严重是我所不能忍受的,于是我决定采用其他方法。串口读数据的线程模型这个模型顾名思义,就是将接收数据的操作写成一个线程的

14、 形式:public void startReadi ngDataThread() Thread readDataProcess = new Thread( new Runn able() public void run() while (n ewData != -1) n ewData = is.read();System.out.pri ntln(n ewData);其他的处理过程J J J catch (IOExceptio n ex) System.err.pri ntl n(ex);return;readDataProcess.start();在我的应用程序中,我将收到的数据打包放到

15、一个缓存中,然后启动另一个线程从缓存中获取并处理数据。 两个线程以生产者一消费者模式协同工作,数据的流向如下图所示:这样,我就圆满解决了丢数据问题。然而,没高兴多久我就 又发现了一个同样严重的问题: 虽然这回不再丢数据了, 可是原本一个周期(31秒)之后,传感器节电已经停止传送数据了,但我 的串口线程依然在努力的执行读串口操作, 在控制台也可以看见收到的数据仍在不断的打印。 原来,由于传感器节点发送的数据 过快,而我的接收线程处理不过来,所以 InputStream就先把已到达却还没处理的字节缓存起来, 于是就导致了明明传感器节点 已经不再发数据了,而控制台却还能看见数据不断打印这一奇怪的现象

16、。唯一值得庆幸的是最后收到数据确实是 4900左右字节,没出现丢失现象。然而当处理完最后一个数据的时候已经快 1分半钟了,这个时间远远大于节点运行周期。 这一延迟对于一个实 时的显示系统来说简直是灾难!后来我想,是不是由于两个线程之间的同步和通信导致了数据接收缓慢呢?于是我在接收线程的代码中去掉了所有处理代 码,仅保留打印收到数据的语句,结果依然如故。看来并不是线 程间的通信阻碍了数据的接收速度, 而是用线程模型导致了对于发送端数据发送速率过快的情况下的数据接收延迟。 这里申明一点,就是对于数据发送速率不是如此快的情况下前面者两种模型 应该还是好用的,只是特殊情况还是应该特殊处理。第三种方法T

17、inyOS中有一部分是和我的应用程序类似的串口通信部分,于是我下载了它的1.x版的Java代码部分,参考了它的处理 方法。解决问题的方法说穿了其实很简单,就是从根源入手。根 源不就是接收线程导致的吗, 那好,我就干脆取消接收线程和作 为中介的共享缓存,而直接在处理线程中调用串口读数据的方法 来解决问题,于是程序变成了这样:public byte getPack()while (true) / PacketLe ngth为数据包长度byte msgPack = new bytePacketLe ngth;for(i nt i = 0; i PacketLe ngth; i+)if( (n ewD

18、ata = is.read() != -1)msgPack = (byte) n ewData;System.out.pri ntl n( msgPack);return msgPack;在处理线程中调用这个方法返回所需要的数据序列并处理之,这样不但没有丢失数据的现象行出现, 也没有数据接收延迟了。这里唯一需要注意的就是当串口停止发送数据或没有数据的 时候is.read()直都返回-1,如果一旦在开始接收数据的时候发 现-1就不要理它,继续接收,直到收到真正的数据为止。结束语本文介绍了串口通信的基本知识, 以及常用的几种模式。通过实践,提出了一些问题,并在最后加以解决。希望能对需要操 作串口数据的程序员能有所帮助

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2