1. 安装D2XX驱动
引用dll中的API函数的方式,参考例子:
[DllImport("ftd2xx.dll")]
public static extern eDeviceStatus FT_CreateDeviceInfoList(ref UInt32 numdevs);
2. 遍历FTDI USB设备得到描述符信息
a) 获取FTDI USB设备数量
UInt32 numOfDevices = 0;
CFTD2xx.eDeviceStatus ftStatus = 0;
ftStatus = CFTD2xx.FT_CreateDeviceInfoList(ref numOfDevices);
b) 遍历所有的FTDI USB设备,得到每个设备的信息,将描述符信息加入到一个ComboBox中
cbDeviceList.Items.Clear();
for (UInt32 iDev = 0; iDev < numOfDevices; ++iDev)
{
ftStatus = CFTD2xx.FT_GetDeviceInfoDetail(iDev, ref flags,
ref chiptype,
ref id, ref locid,
serialnumber,
description,
ref ftHandle);
if (ftStatus == CFTD2xx.eDeviceStatus.FT_OK)
{
string tmp;
tmp = System.Text.Encoding.Default.GetString(description);
tmp = tmp.Substring(0, tmp.IndexOf("\0"));
if (string.IsNullOrEmpty(tmp))
continue;
cbDeviceList.Items.Add(tmp);
}
}
3. 打开设备
在comboBox中选中需要打开设备的描述符
IntPtr init = Marshal.StringToHGlobalAnsi(cbDeviceList.Text);
ftStatus = CFTD2xx.FT_OpenEx(init,
CFTD2xx.FT_OPEN_BY_DESCRIPTION,
ref ftHandle);
Marshal.FreeHGlobal(init);
4. 设置一些参数(可选)
CFTD2xx.FT_SetUSBParameters(ftHandle, 4096, 4096);
CFTD2xx.FT_SetTimeouts(ftHandle, 5000, 5000); // Set read/write timeouts to 5 sec
CFTD2xx.FT_SetLatencyTimer(ftHandle, 0); // Latency timer at default 1ms
5. 写数据
UInt32 lpBytesWrtitten = 0;
CFTD2xx.FT_Write(ftHandle, buf, (UInt32)buf.Length, ref lpBytesWrtitten);
6. 读数据
private void loopRecvData()
{
UInt32 count = 1024;
UInt32 byteRead = 0;
CFTD2xx.eDeviceStatus ftStatus = 0;
ftStatus = CFTD2xx.FT_GetQueueStatus(ftHandle, ref byteRead);
if (byteRead > 0)
{
byte[] rdBuf = new byte[byteRead];
ftStatus = CFTD2xx.FT_Read(ftHandle, rdBuf, (UInt32)rdBuf.Length, ref byteRead);
lock (loopLocker)
{
for (int i = 0; i < byteRead; i++)
{
loopQueue.Enqueue(rdBuf[i]);
}
}
}
}
USB的读写数据的速度,PC写MCU的速度可以达到7MB/S(因为MCU端是采用loop的方式,因此理论上速度应该更快),理论上PC从MCU读数据应该是差不多的速度。