Java串口通信详细解释
学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜。
然而开源软件或类库的首要缺点就是大多缺乏具体的说明文档和使用的样例,或者就是软件代码随便你用。就是文档,样例和后期服务收钱。这也难怪,毕竟就像某个著名NBA球员说的那样:“我还要养家。所以千万美元下面的合同别找我谈。否则我宁可待业”。是啊,支持开源的人也要养家,收点钱也只是分。要想既不花钱又学到知识就仅仅能借助网络和了,我仅仅是想抛砖引玉,为开源事业做出点微薄共献,能为你的project解决哪怕一个小问题,也就足够了。
仅仅要你不是整天仅仅与“架构”、“构件”、“框架”打交道的话,相信我所说的东西你一定会用到。
当中,最经常使用的接口就是RS-232串口和并口(鉴于USB接口的复杂性以及不须要非常大的传输数据量。USB接口用在这里还是显得过于奢侈。况且眼下除了SUN有一个支持USB的包之外。我还没有看到其它直接支持USB的Java类库)。
SUN的CommAPI分别提供了对经常使用的RS232串行port和IEEE1284并行port通讯的支持。
RS-232-C(又称EIA RS-232-C。下面简称RS232)是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。
RS232是一个全双工的通讯协议。它能够同一时候进行数据接收和发送的工作。

主要包含下面方法

这样,原本是10000000的byte类型的数变成int型就成了1111111110000000,这是非常严重的问题。应该注意避免。
因为向串口写数据非常easy,所以这里我们仅仅关注于从串口读数据的情况。通常。串口通信应用程序有两种模式,一种是实现SerialPortEventListener接口,监听各种串口事件并作对应处理;还有一种就是建立一个独立的接收线程专门负责数据的接收。
因为这两种方法在某些情况下存在非常严重的问题(至于什么问题这里先卖个关子J)。所以我的实现是採用第三种方法来解决问题。
也就是说当串口有数据到达时,你能够在serialEvent中接收并处理所收到的数据。然而在我的实践中,遇到了一个十分严重的问题。
串口设定的波特率是115200,川口每隔128毫秒返回一组数据(大约是30字节左右),周期(即持续时间)为31秒。实測的时候在一个周期内应该返回4900多个字节,而用事件监听模型我最多仅仅能收到不到1500字节,不知道这些字节都跑哪里去了,也不清楚究竟丢失的是那部分数据。值得注意的是。这是我将serialEvent()中全部处理代码都注掉。仅仅剩下打印代码所得的结果。数据丢失的如此严重是我所不能忍受的,于是我决定採用其它方法。
两个线程以生产者—消费者模式协同工作。数据的流向例如以下图所看到的:
这一延迟对于一个实时的显示系统来说简直是灾难!
解决这个问题的方法说穿了事实上非常easy。就是从根源入手。根源不就是接收线程导致的吗,那好。我就干脆取消接收线程和作为中介的共享缓存,而直接在处理线程中调用串口读数据的方法来解决这个问题(什么,为什么不把处理线程也一并取消?----都取消应用程序界面不就锁死了吗?所以必须保留)于是程序变成了这样:
本文介绍了串口通信的基本知识,以及经常使用的几种模式。通过实践,提出了一些问题,并在最后加以解决。值得注意的是对于第一种方法。我曾将传感器发送的时间由128毫秒添加到512毫秒。仍然有非常严重的数据丢失现象发生,所以假设你的应用程序须要非常精密的结果。数据传输的速率又非常快的话,就最好不要用第一种方法。对于另外一种方法,因为是线程导致的问题,所以对于不同的机器应该会有不同的表现。对于那些处理多线程比較好的机器来说,应该会好一些。可是我的机器是Inter 奔四3.0双核CPU+512DDR内存。这样都延迟这么厉害。还强得多CPU才行啊?因此,对于大量的数据传输的,第三种方法是用它。但是,这是非常多的世界难题,还有更多悬而未决的问题比已知问题,也许还有什么其他问题。通过以下联系方式欢迎你和我一起学习。
Java串口通信详细解释的更多相关文章
- Java串口通信具体解释
序言 说到开源,恐怕非常少有人不挑大指称赞.学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱……,总之是皆大欢喜.然而开源软 ...
- 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释
迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...
- java串口通信丢包
java串口通信丢包问题 前段时间公司要求做一个java应用和pos串口通信的工具,调试好了好久每次都是只能接收到一包数据后续的数据都丢失了. 经过修改读写的流的缓存大小亲测都正常代码如下: seri ...
- Java 串口通信
在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...
- java 串口通信 代码
下面是我自己实现的串口接收的类,串口发送比较简单,就直接发送就可以了.下面的这个类可以直接使用. package com.boomdts.weather_monitor.util; import ja ...
- Java串口通信--------基于RXTX (附带资源地址)
最近帮老师做了一个小项目,一个牧场公司想用传感器收集一些环境信息,记录到数据库里去,然后加以分析查看.这里面和传感器通信用到了串口通信,我也是接触了一下,把用到的东西分享出来. 准备工作: RXTX: ...
- Java串口通信 RXTX 解决过程
背景介绍: 由于第一次用Java与硬件通信,网上查了许多资料,在这进行整理,便于以后学习.本人串口测试是USB串口设备连接电脑,在设备管理器中找到端口名称(也可以通过一些虚拟串口工具模拟). 下面主要 ...
- java 串口通信实现流程
1.下载64位rxtx for java 链接:http://fizzed.com/oss/rxtx-for-java 2.下载下来的包解压后按照说明放到JAVA_HOME即JAVA的安装路径下面去 ...
- java Socket使用详细解释
客户/server通信模式, client需要主动创造和server Socket(套接字), server端收到了client的连接请求, 也会创建与客户连接的 Socket. Socket可看做是 ...
随机推荐
- async And await异步编程活用基础
原文:async And await异步编程活用基础 好久没写博客了,时隔5个月,奉上一篇精心准备的文章,希望大家能有所收获,对async 和 await 的理解有更深一层的理解. async 和 a ...
- Android学习路径(两)项目文件本身使用场景和文件演示
ios讨论群1群:135718460 1.src文件:java源码存放文件夹 2.gen 文件:自己主动生成全部由android开发工具自己主动生成的文件,文件夹中最重要的就是R.java文件,这个 ...
- Android截图
Android截图很好的实现,从文档的发展,查看View有一个接口getDrawingCache(),这个接口可以得到View当调用这个接口的位图图像Bitmap. 抓取截图View在图像的某一个时刻 ...
- Android ListView分页载入(服务端+android端)Demo
Android ListView分页载入功能 在实际开发中经经常使用到,是每一个开发人员必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了測试. 服务端使用MyEcli ...
- 【原创】构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测CLR性能
原文:[原创]构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)-托管资源优化-监测CLR性能 构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)—托管资源优化—监测C ...
- 【java基础】==与equals()方法比较
1.八种基本类型 只有"=="方法进行判断是否相等,比较的是基本数据类型的值,没有equals()方法 2.Java类库中的类 "=="比较的是对象的句柄,即内 ...
- 在SQL2008中,如何让id自动生成并自动递增?如何让时间默认生成?
id自动递增: 如果是用语句操作,这样定义:ID INT IDENTITY,如果是要生成一对数字,这样定义:ID INT IDENTITY(1,1) 如果要在SQL Server的表中设置 ...
- uva 10831 - Gerg's Cake(勒让德符号)
题目链接:uva 10831 - Gerg's Cake 题目大意:给定a和p.p为素数,问说是否存在x,使得x2≡a%p 解题思路:勒让德记号,推断ap−12≡1%p #include <cs ...
- SELECT 场 FROM 表 WHERE 字段 Like 条件
间有关的条件,SQL它提供了四种匹配模式: 1.%: 表示随意0个或多个字符.可匹配随意类型和长度的字符.有些情况下若是中文,请使用两个百分号(%%)表示. 比方 SELECT * FROM [use ...
- 给Activity设置Dialog属性,点击区域外消失;
1.在AndroidManifest.xml中给Activity设置样式: <activity android:name=".MyActivity" ...