目录
注意: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)。