FT4232H Android开发 2 - 建立一个FTDI设备的样板工程

6 篇文章 1 订阅

目录

1. 新建一个FTDevice的类

2. 导入用到的类

3.  添加变量

4. 定义构造函数

5. 成员函数selectDevice

6. 成员函数getDeviceType

7. 成员函数closeDevice

8. 成员函数openDevice

9. 成员函数getDeviceDesc

10. 验证


注意:d2xx.jar可以用在FTDI的USB产品上,不仅仅是FT4232H。

1. 新建一个FTDevice的类

2. 导入用到的类

import android.content.Context;
import android.content.IntentFilter;
import android.hardware.usb.UsbManager;
import android.util.Log;

import com.ftdi.j2xx.D2xxManager;
import com.ftdi.j2xx.FT_Device;

3.  添加变量

    D2xxManager ftD2xx;
    FT_Device ftDevice;
    static Context mContext;
    private static int deviceId = 0; //定义FT Device的ID,默认第1个设备

4. 定义构造函数

public FTDevice(Context context)
{
    mContext = context;
    try{
        ftD2xx = D2xxManager.getInstance(mContext);
    }
    catch (D2xxManager.D2xxException ex)   {
        Log.e("FTDevice", "get instatance fail");
        return;
    }
}

通过getInstance获取FTDI设备的实例。

5. 成员函数selectDevice

public void selectDevice(int sel){
    deviceId = sel;
}

用于选择FTDI设备,一般情况只会有一个设备,即默认为0,可以不用调用这个函数设置。

6. 成员函数getDeviceType

public String getDeviceType(){
    String type = "";

    if(ftD2xx == null){
        Log.e("FTDevice", "getDeviceName: get instatance fail");
        return type;
    }

    int devCount = 0;
    devCount = ftD2xx.createDeviceInfoList(mContext);
    D2xxManager.FtDeviceInfoListNode[] deviceList = new D2xxManager.FtDeviceInfoListNode[devCount];
    ftD2xx.getDeviceInfoList(devCount, deviceList);
    switch (deviceList[deviceId].type) {
        case D2xxManager.FT_DEVICE_232B:
            type = "FT232B";
            break;
        case D2xxManager.FT_DEVICE_8U232AM:
            type = "FT8U232AM";
            break;
        case D2xxManager.FT_DEVICE_UNKNOWN:
            type = "Unknown";
            break;
        case D2xxManager.FT_DEVICE_2232:
            type = "FT2232";
            break;
        case D2xxManager.FT_DEVICE_232R:
            type = "FT232R";
            break;
        case D2xxManager.FT_DEVICE_2232H:
            type = "FT2232H";
            break;
        case D2xxManager.FT_DEVICE_4232H:
            type = "FT4232H";
            break;
        case D2xxManager.FT_DEVICE_232H:
            type = "FT232H";
            break;
        case D2xxManager.FT_DEVICE_X_SERIES:
            type = "FTDI X_SERIES";
            break;
        default:
            break;
    }
    return type;
}

用于获取FTDI设备的类型,用于判断当前设备是否符合程序定义的设备。也可以通过类似的方式(deviceList[deviceId])获取设备的序列号之类到信息。

7. 成员函数closeDevice

先添加一些返回值变量。

public static final int
    ERROR_GET_INSTANCE = -1,
    ERROR_NO_DEVICE= -2,
    ERROR_NULL_DEVICE= -3,
    ERROR_RESET_DEVICE= -4,
    ERROR_SET_BITMODE= -5,
    RETURN_OK = 0;
public int closeDevice(){
    if(ftD2xx == null){
        Log.e("FTDevice", "closeDevice: get instatance fail");
        return ERROR_GET_INSTANCE;
    }
    if(ftDevice == null){
        Log.e("FTDevice", "closeDevice: device is null");
        return ERROR_NULL_DEVICE;
    }
    ftDevice.close();
    ftDevice = null;
    return RETURN_OK;
}

关闭已经打开的设备。

8. 成员函数openDevice

public int openDevice(byte bitMode){
    if(ftD2xx == null){
        Log.e("FTDevice", "openDevice: get instatance fail");
        return ERROR_GET_INSTANCE;
    }
    int devCount = 0;
    devCount = ftD2xx.createDeviceInfoList(mContext);
    if(devCount <= 0){
        Log.e("FTDevice", "openDevice: no device");
        return ERROR_NO_DEVICE;
    }
    ftDevice = ftD2xx.openByIndex(mContext, deviceId);
    if(null == ftDevice) {
        Log.e("FTDevice", "openDevice: open device fail");
        return ERROR_NULL_DEVICE;
    }
// Reset port
    if (!ftDevice.setBitMode((byte) 0xFF, D2xxManager.FT_BITMODE_RESET)){
        Log.e("FTDevice", "openDevice: reset device fail");
        closeDevice();
        return ERROR_RESET_DEVICE;
    }
// Configure port to bit mode
    if (!ftDevice.setBitMode((byte) 0xFF, bitMode)){
        Log.e("FTDevice", "openDevice: set device bitmode fail");
        closeDevice();
        return ERROR_SET_BITMODE;
    }
// delay
    try {
        Thread.sleep(50);
    }
    catch (InterruptedException e) {
    }

//Clear the rx/tx buffer
    ftDevice.purge((byte)(D2xxManager.FT_PURGE_RX | D2xxManager.FT_PURGE_TX));
// delay
    try {
        Thread.sleep(30);
    }
    catch (InterruptedException e) {
    }
    return RETURN_OK;
}

打开一个FTDI的USB设备,复位设备并设置设备的工作模式,参数bitMode就是设备的模式,支持的模式如下:

D2xxManager.FT_BITMODE_RESET

D2xxManager.FT_BITMODE_ASYNC_BITBANG

D2xxManager.FT_BITMODE_CBUS_BITBANG

D2xxManager.FT_BITMODE_FAST_SERIAL

D2xxManager.FT_BITMODE_MCU_HOST

D2xxManager.FT_BITMODE_MPSSE

D2xxManager.FT_BITMODE_SYNC_BITBANG

D2xxManager.FT_BITMODE_SYNC_FIFO

具体含义可以参照FTDI的D2XX_Programmer's_Guide(FT_000071).pdf

9. 成员函数getDeviceDesc

    public String getDeviceDesc(){
        if(ftD2xx == null){
            Log.e("FTDevice", "getDeviceName: get instatance fail");
            return "";
        }

        int devCount = 0;
        devCount = ftD2xx.createDeviceInfoList(mContext);
        D2xxManager.FtDeviceInfoListNode[] deviceList = new D2xxManager.FtDeviceInfoListNode[devCount];
        ftD2xx.getDeviceInfoList(devCount, deviceList);
        return deviceList[deviceId].description;
    }

 获取设备描述符。

10. 验证

定义一个FTDevice的实例

FTDevice ftD2xxDev;

在OnCreate()中添加

ftD2xxDev = new FTDevice(this);

在Spinner的onItemSelected中读取设备的类型和描述符

ftD2xxDev.selectDevice(i);
String type = ftD2xxDev.getDeviceType();
String desc = ftD2xxDev.getDeviceDesc();

 FT4232H的设备会识别到4个设备,每个设备的类型都为FT4232H,描述符分别为FT2232H MiniModule A~D(这4个描述符是可以配置的,这里被配置成FT2232H了而已,实际是FT4232H)。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值