当前位置:  编程技术>移动开发
本页文章导读:
    ▪超火候制        超时机制     static final int OP_PENDING = 0;     static final int OP_ACKNOWLEDGED = 1;     static final int OP_TIMEOUT = -1;    final Object mCurrentOpLock = new Object();       //代码调用就开始等待 在while中等待,直.........
    ▪ 0延时RS-485接口电路的设计与应用        零延时RS-485接口电路的设计与应用 根据在研制节能灯寿命检测系统中,实际检测环境传输数据量大,实时性强的特点,对物理总线的拓扑结构和通信协议提出要求。采用零延时RS一485接口电.........
    ▪ 多页单个tif文件转换为多个jpg资料       多页单个tif文件转换为多个jpg文件 import java.io.*; import com.sun.media.jai.codec.FileSeekableStream;import com.sun.media.jai.codec.ImageDecoder;import com.sun.media.jai.codec.ImageCodec;import com.sun.media.jai.codec.TIFFEncodeParam;impo.........

[1]超火候制
    来源: 互联网  发布时间: 2014-02-18
超时机制

    static final int OP_PENDING = 0;
    static final int OP_ACKNOWLEDGED = 1;
    static final int OP_TIMEOUT = -1;

 

 final Object mCurrentOpLock = new Object();

 

 

 

//代码调用就开始等待 在while中等待,直到 超时或者代码执行已经返回。

 boolean waitUntilOperationComplete(int token) {
        int finalState = OP_PENDING;
        synchronized (mCurrentOpLock) {
            try {
                while ((finalState = mCurrentOperations.get(token, OP_TIMEOUT)) == OP_PENDING) {
                    try {
                        mCurrentOpLock.wait();
                    } catch (InterruptedException e) {}
                }
            } catch (IndexOutOfBoundsException e) {
                // the operation has been mysteriously cleared from our
                // bookkeeping -- consider this a success and ignore it.
            }
        }
        mBackupHandler.removeMessages(MSG_TIMEOUT);
        if (DEBUG) Slog.v(TAG, "operation " + Integer.toHexString(token)
                + " complete: finalState=" + finalState);
        return finalState == OP_ACKNOWLEDGED;
    }

 

 

 

public void opComplete(int token) {
        synchronized (mCurrentOpLock) {
            if (DEBUG) Slog.v(TAG, "opComplete: " + Integer.toHexString(token));
            mCurrentOperations.put(token, OP_ACKNOWLEDGED);
            mCurrentOpLock.notifyAll();
        }
    }

 

 

private class BackupHandler extends Handler {
        public BackupHandler(Looper looper) {
            super(looper);
        }

 

      case MSG_TIMEOUT:
            {
                synchronized (mCurrentOpLock) {
                    final int token = msg.arg1;
                    int state = mCurrentOperations.get(token, OP_TIMEOUT);
                    if (state == OP_PENDING) {
                        if (DEBUG) Slog.v(TAG, "TIMEOUT: token=" + token);
                        mCurrentOperations.put(token, OP_TIMEOUT);
                    }
                    mCurrentOpLock.notifyAll();
                }
                break;
            }
}

 

 

 

 

 

 


    
[2] 0延时RS-485接口电路的设计与应用
    来源: 互联网  发布时间: 2014-02-18
零延时RS-485接口电路的设计与应用

根据在研制节能灯寿命检测系统中,实际检测环境传输数据量大,实时性强的特点,对物理总线的拓扑结构和通信协议提出要求。采用零延时RS一485接口电路,逻辑上采用主从式网络结构,物理结构上采用星型网络拓扑结构;设计出一种支持主从式网络结构的485HUB,经过通信协议的帧校验和帧超时的设计,进一步提高软件抗干扰的能力。测试结果表明,系统稳定可靠,抗干扰能力强。
关键词 零延时 RS一485 节能灯寿命检测

1 概述
    RS一485接口是一种基于平衡发送和差分接收的串行总线,具有很强的抗共模干扰能力,在适当的波特率下传输距离远;同时易于进行网络扩展,被广泛的应用在很多工业现场。

    节能灯寿命检测环境中,主要干扰来自开关和寿命检测的强电干扰、开关产生的电磁干扰、空气循环设备的干扰等等;同时由于寿命检测环境温度高,强电系统复杂,也给系统的运行提出更高的要求。寿命检测系统要求实时报告每一盏节能灯的运行状态、环境温度、电压等,并在寿终计算出节能灯寿命、光通等参数。可见系统的传输数据量大,实时性强,因此物理总线的拓扑结构和通信协议尤为关键。

2 接口设计
    良好的接口设计,应该在硬件上保证系统有良好的抗干扰性、稳定性和易扩展性。本系统选用了性价比很高的半双工接口芯片SN65HVD3082。它具有以下特点[1]:
    ①满足或超出TIA/EIA-485A标准的要求;
    ②低静态电流消耗——有效模式为小于0.3 mA,关闭模式为l nA;
    ③优化的驱动器输出信号,传输率达200kbps时保持低EMI;
    ④1/8单元负载——1条总线上多达256个节点;
    ⑤总线引脚ESD保护超过16 kv;
    ⑥工业标准SN75176覆盖范围;
    ⑦失效保护功能。
    基于SN65HVD3082的RS-485接口电路,通常有三种方案。

(1)直接控制收发的RS-485接口电路
    此方法使用控制器切换发送使能和接收使能端,控制接口电路数据的发送和接收。由于采用直接收发,因此需要发送和接收时的转换,只能加入额外的控制器来控制发送和接收的转换;同时,需要用控制器存储转发所有的传输数据,这样,每传输1帧数据,至少损失1个单位的接收时间(储存转发1帧数据的时间)。此方案不利于数据量大的实时通信,而且在发送和接收的切换过程中,在VA和VB(VA和VB分别是Rs一485总线的A、B端的电压)有阶跃电压的产生。这个阶跃电压对接收器的接收有干扰产生。

(2)自动收发转换的RS-485接口电路
    图l所示的虚线框中为接口电路,通过对真值表进行分析,其发送和接收过程为:
    当发送端DI=O时,DE/RE=1发送O电平,接收端RO=O;当发送端DI=1时,DE/RE=0,VA=VB=2.5V,接收端由于上拉电阻的作用RO=1。

    在此接口电路的TXo端加入1kHz的TTL方波对电路进行测试。未加入120Ω端电阻时,接口芯片的485-A和485-B脚都有约50μs的电压变化过程,如图2所示。接收端Ro波形的上升沿有明显的延迟约30~40μs(和数据发送端DI比较),造成很大的传输误差;加入120Ω端电阻时,延迟明显缩小,约3μs。

    此电路在发送高电平时,发送器处于高阻状态,总线上所有接口处于接收状态,总线是空闲的,允许其他接口发送数据,因此容易引入总线冲突。特别是连续发送商电平比特时,发送器处于高阻状态的时间越长,引入总线冲突的几率就越大。

(3)零延时的RS-485接口电路
    零延时RS-4185接口电路主要采用74HCl4和电路中的电阻、电容等元件构成一个延时很短的电路,其主要作用是:
    ①发送器在发送高电平的时候,在短延时内不再是处于高阻状态,仍有驱动电流存在,这样在一定程度上可以增加接口的抗干扰能力。
    ②从真值表可以看出.对于接收器,当VID=VA-VR≥一O.01 V时,RO=1;在发送端,当DE/RE=0,发送驱动器的VA和VB都是高阻态,此时VA=VB=2.5V,因此,这时对于接收端RO=1;而在短延时的时间内,由千DI=1且DE/RE=1.所以RO=1.可见在短延时和DE/RE=0的时间内接收端RO=l,这样就完成了对高电平的发送和接收,而且在接收端的上升沿不会有延迟,即零延时,如图3所示。

    把图l中自动收发转换的RS-485接口电路换成零延时的RS-485接口电路,如图4所示。同样在TX0端加入1 kHz的方波对电路进行测试,结果是接收端RO的上升沿不会有延迟。这和是否接入120Ω的端电阻没有关系,证实了以上的分析。

    图2、3中虚线箭头指向处的电压为2.5 V。

    图4中,根据系统所确定的传输速度来选择R3和C0参数,以达到零延时。传输速度越高,延时越小。这里选择R3=22 kΩ,C0=1000 pF。

    自动收发转换的RS-4t85接口电路和零延时的RS-485接口电路都有不足之处,即在发送端发送连续的高电平时,逻辑上发送端是处于发送状态,接收端处于接收状态;但实际上,此时所有SN75HVl53082接口的DE/RE=0,所以,所有的发送端和接收端都处于接收状态。这在对等的网络结构中是不能忽视的,因为在这段时间内,总线是空闲的,是允许节点发送数据的。

    这里采用的是主从式的网络结构,因此这个问题不会影响系统工作。

3 网络拓扑结构
    网络拓扑结构的设计是根据寿命检测系统的实际需要提出的,设计目标是:满足lO个寿命架,每个寿命架64个节点的检测要求,在硬件和软件上做到容易扩展,走线合理。因此逻辑上采用主从式网络结构,物理结构上采用星型拓扑结构,如图5所示。这个拓扑结构有两级总线,主要由以下设备组成:
    ①RS-232转RS-485。实现RS-232到RS-485电气信号的转换,这是第一级RS-485总线。
    ②10口的485HIJB(集线器)。如图6所示,485HUB是由1个主机和10个从机的零延时的RS-485接口组成,这是在逻辑上实现主从式结构的基础。当主机端下行发送数据时,连接在10个从机接口上的所有接口都可以接收到数据;而当某个从机接口上挂接的节点上行发送数据时,只有主机节点(PS端)和挂接在同一个从机接口上的其他节点可以接收到数据。这是第二级RS-485总线。
    ③单片机节点。有4种节点,即节能灯状态采集节点、温度采集节点、供电电压采集节点和模式控制节点。每个单片机节点的通信接口都采用零延时的RS-485接口电路,每一个节点都有自己的地址,用于PC端寻址。

    理论上,SN75HVD3082的一条总线可以连接多达256个节点,因此在每个从机接口上可以扩展更多的节点;同时在RS-232转RS-485转换器的总线上也可以连接更多的485HUB。这样就可以实现硬件上的扩展。


4 通信协议
    采用9600 bps的波特率,固定长度帧结构,帧长度10字节。帧信息定义如下:帧头(0x55 0xAA)、命令(1字节)、数据(4字节)、从机地址(2字节)、校验(1字节)。

    在通信协议中采用帧校验和帧超时,以达到软件抗干扰的目的。
    ①帧校验:采用累加和校验。在发送时,把帧头、命令、数据、从机地址几个域相加并取最低字节填充到校验域。如果节点不处于接收状态,则启动发送,否则等待;如果在未超时,并完整地接收到10字节时,把帧头、命令、数据、从机地址几个域相加,并与校验域比较,相同表示成功接收到1帧数据。
    ②帧超时:帧超时定义是,在接收到第一个字节时,进入接收状态,并设置8ms定时,以后每接收到一个字节,重置8ms定时。正常情况下,接收一个字节约1 ms时间。如果超过8ms,则退出接收状态,丢弃当前接收帧,回到空闲状态,等待下一帧的接收。

    在程序设计中,帧超时的定义与程序的架构和波特率有关,原则上只要大于1个字节的接收时间就可以了。这里选择8ms与程序的架构有关。

5 测试结论和应用前景
    在设置了所有节点的地址后,即可在现场对系统进行测试。测试方案是,在PC机端运行测试软件,约每隔50ms发送一次测试命令轮询所有的节点。每一次发送都要求有数据返回,否则视为通信错误。软件连续运行7天,没有发现错误,说明系统稳定可靠。

    目前设计的节能灯寿命检测系统已经在现场成功投入使用,运行效果良好。此系统设计思想对于设计具有大量节点、大数据量的实时智能检测系统起到借鉴作用,在自动化检测领域中将有较为广泛的应用价值。


 


    
[3] 多页单个tif文件转换为多个jpg资料
    来源: 互联网  发布时间: 2014-02-18
多页单个tif文件转换为多个jpg文件

import java.io.*;

import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.TIFFEncodeParam;
import com.sun.media.jai.codec.TIFFDecodeParam;
import com.sun.media.jai.codec.JPEGEncodeParam;
 
import java.awt.image.RenderedImage;
import javax.media.jai.RenderedOp;
import javax.media.jai.JAI;
import java.awt.image.renderable.ParameterBlock;

public class MultiPageRead {

    public static void main(String[] args) throws IOException {
        new MultiPageRead().doitJAI();
    }
 
    public void  doitJAI() throws IOException {
        FileSeekableStream ss = new FileSeekableStream("./zhaoming.tif");
        TIFFDecodeParam param0 = null;
        TIFFEncodeParam param = new TIFFEncodeParam();
        JPEGEncodeParam param1 = new JPEGEncodeParam();
        ImageDecoder dec = ImageCodec.createImageDecoder("tiff", ss, param0);
        int count = dec.getNumPages();
        param.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);
        param.setLittleEndian(false); // Intel
        System.out.println("This TIF has " + count + " image(s)");
        for (int i = 0; i < count; i++) {
            RenderedImage page = dec.decodeAsRenderedImage(i);
            File f = new File("./fk_" + i + ".jpg");
            System.out.println("Saving " + f.getCanonicalPath());
            ParameterBlock pb = new ParameterBlock();
            pb.addSource(page);
            pb.add(f.toString());
            pb.add("JPEG");
            pb.add(param1);
            //JAI.create("filestore",pb);
            RenderedOp r = JAI.create("filestore",pb);
            r.dispose();
           
            //RenderedOp op = JAI.create("filestore", page, "./zhaoming_" + i + ".jpg", "JPEG", param1);
        }
    }
}


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android消息处理机制Looper和Handler详解 iis7站长之家
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,