static extern unsafe FT_STATUS FT_GetDeviceInfo(FT_HANDLE ftHandle, ref FT_DEVICE ftDevice, ref UInt32 deviceID, void *SerialNumber, void *Description, UInt32 Flag);
//************************************************************************** // GetDeviceType //************************************************************************** // Intellisense comments /// <summary> /// Gets the chip type of the current device. /// </summary> /// <returns>FT_STATUS value from FT_GetDeviceInfo in FTD2XX.DLL</returns> /// <param name="DeviceType">The FTDI chip type of the current device.</param> public FT_STATUS GetDeviceType(ref FT_DEVICE DeviceType) { // Initialise ftStatus to something other than FT_OK FT_STATUS ftStatus = FT_STATUS.FT_OTHER_ERROR; // If the DLL hasn't been loaded, just return here if (hFTD2XXDLL == IntPtr.Zero) return ftStatus; // Check for our required function pointers being set up if (pFT_GetDeviceInfo != IntPtr.Zero) { tFT_GetDeviceInfo FT_GetDeviceInfo = (tFT_GetDeviceInfo)Marshal.GetDelegateForFunctionPointer(pFT_GetDeviceInfo, typeof(tFT_GetDeviceInfo)); UInt32 DeviceID = 0; byte[] sernum = new byte[16]; byte[] desc = new byte[64]; DeviceType = FT_DEVICE.FT_DEVICE_UNKNOWN; if (ftHandle != IntPtr.Zero) { // Call FT_GetDeviceInfo ftStatus = FT_GetDeviceInfo(ftHandle, ref DeviceType, ref DeviceID, sernum, desc, IntPtr.Zero); } } else { if (pFT_GetDeviceInfo == IntPtr.Zero) { MessageBox.Show("Failed to load function FT_GetDeviceInfo."); } } return ftStatus; }
private Int16 SearchDevice() { //cmbDevList.SelectedIndex = iCurrentIndex; FT_HANDLE ftHandle = new FT_HANDLE(); FT_STATUS ftStatus; Int16 numDevs; string MyText = ""; unsafe { ftStatus = FT_ListDevices(&numDevs, null, FT_LIST_NUMBER_ONLY); if (ftStatus == FT_STATUS.FT_OK) { MyText += "Number of devices is: " + numDevs.ToString() + "\n"; } else { MyText += "Error"; } DevInformation = new DevData[numDevs]; //pN->NumDeviceInLine=numDevs; for (int i = 0; i < numDevs; i++) { ftStatus = FT_Open((uint)i, ref ftHandle); if (ftStatus != FT_STATUS.FT_OK) { MyText += "Open failed\n"; continue; } byte Tim = 1; ftStatus = FT_SetLatencyTimer(ftHandle, Tim); Tim = 0; ftStatus = FT_GetLatencyTimer(ftHandle, ref Tim); MyText += "Dev " + i.ToString() + " - "; if (ftStatus == FT_STATUS.FT_OK) { MyText += "\tTim="; MyText += Tim; } else { MyText += "FAILED\n"; } string devSerial = ""; string devDescription = ""; byte[] SerialNumber = new byte[16]; byte[] sDescription = new byte[64]; uint devID = 0; FT_DEVICE devType = FT_DEVICE.FT_DEVICE_UNKNOWN; fixed(byte *pS = &SerialNumber[0]) fixed(byte *pD = &sDescription[0]) { ftStatus = FT_GetDeviceInfo( ftHandle , ref devType , ref devID , pS , pD , 0); } for (int j = 0; j < SerialNumber.Length; j++) { if ((char)SerialNumber[j] == '\0') { break; } devSerial += (char)SerialNumber[j]; } for (int j = 0; j < sDescription.Length; j++) { if ((char)sDescription[j] == '\0') { break; } devDescription += (char)sDescription[j]; } DevData CurDev = new DevData() { DevDescription = devDescription, DevID = devID, DevInfo = devType, DevSerial = devSerial }; DevInformation[i] = CurDev; FT_Close(ftHandle); } } return(numDevs); }
static unsafe extern FT_STATUS FT_GetDeviceInfo(FT_HANDLE ftHandle, ref FT_DEVICE ftDevice, ref UInt32 deviceID, void* SerialNumber, void* Description, UInt32 Flag);
public TBalancerGroup(ISettings settings) { uint numDevices = 0; try { if (FTD2XX.FT_CreateDeviceInfoList(out numDevices) != FT_STATUS.FT_OK) { report.AppendLine("Status: FT_CreateDeviceInfoList failed"); return; } } catch (DllNotFoundException) { return; } catch (EntryPointNotFoundException) { return; } catch (BadImageFormatException) { return; } for (int i = 0; i < numDevices; i++) { byte[] serialNumberBuf = new byte[255]; byte[] descriptionBuf = new byte[255]; FT_HANDLE ftHandle = default; uint flags = 0; uint type = 0; uint id = 0; uint locId = 0; if (FTD2XX.FT_GetDeviceInfoDetail(i, ref flags, ref type, ref id, ref locId, serialNumberBuf, descriptionBuf, out ftHandle) != FT_STATUS.FT_OK) { continue; } // For whatever reason, the returned strings contain lots of garbage past the first binary 0 string serialNumber = Encoding.UTF8.GetString(serialNumberBuf); string description = Encoding.UTF8.GetString(descriptionBuf); TrimToSize(ref serialNumber); TrimToSize(ref description); FT_DEVICE deviceType = (FT_DEVICE)type; report.Append("Device Index: "); report.AppendLine(i.ToString(CultureInfo.InvariantCulture)); report.Append("Device Type: "); report.AppendLine(deviceType.ToString()); report.Append("Description: "); report.AppendLine(description); report.Append("Serial number: "); report.AppendLine(serialNumber); FTD2XX.FT_Close(ftHandle); ftHandle = default; // the T-Balancer always uses an FT232BM if (deviceType != FT_DEVICE.FT_DEVICE_232BM) { report.AppendLine("Status: Wrong device type"); continue; } FT_HANDLE handle; FT_STATUS status = FTD2XX.FT_Open(i, out handle); if (status != FT_STATUS.FT_OK) { report.AppendLine("Open Status: " + status); continue; } FTD2XX.FT_SetBaudRate(handle, 19200); FTD2XX.FT_SetDataCharacteristics(handle, 8, 1, 0); FTD2XX.FT_SetFlowControl(handle, FT_FLOW_CONTROL.FT_FLOW_RTS_CTS, 0x11, 0x13); FTD2XX.FT_SetTimeouts(handle, 1000, 1000); FTD2XX.FT_Purge(handle, FT_PURGE.FT_PURGE_ALL); status = FTD2XX.Write(handle, new byte[] { 0x38 }); if (status != FT_STATUS.FT_OK) { report.AppendLine("Write Status: " + status); FTD2XX.FT_Close(handle); continue; } bool isValid = false; byte protocolVersion = 0; int j = 0; while (FTD2XX.BytesToRead(handle) == 0 && j < 2) { Thread.Sleep(100); j++; } if (FTD2XX.BytesToRead(handle) > 0) { if (FTD2XX.ReadByte(handle) == TBalancer.STARTFLAG) { while (FTD2XX.BytesToRead(handle) < 284 && j < 5) { Thread.Sleep(100); j++; } int length = FTD2XX.BytesToRead(handle); if (length >= 284) { byte[] data = new byte[285]; data[0] = TBalancer.STARTFLAG; for (int k = 1; k < data.Length; k++) { data[k] = FTD2XX.ReadByte(handle); } // check protocol version 2X (protocols seen: 2C, 2A, 28) isValid = (data[274] & 0xF0) == 0x20; protocolVersion = data[274]; if (!isValid) { report.Append("Status: Wrong Protocol Version: 0x"); report.AppendLine( protocolVersion.ToString("X", CultureInfo.InvariantCulture)); } } else { report.AppendLine("Status: Wrong Message Length: " + length); } } else { report.AppendLine("Status: Wrong Startflag"); } } else { report.AppendLine("Status: No Response"); } FTD2XX.FT_Purge(handle, FT_PURGE.FT_PURGE_ALL); FTD2XX.FT_Close(handle); if (isValid) { report.AppendLine("Status: OK"); hardware.Add(new TBalancer(i, protocolVersion, settings)); } if (i < numDevices - 1) { report.AppendLine(); } } }
private static extern FT_STATUS FT_GetDeviceInfoDetail(uint index, out uint flags, out FT_DEVICE ft_device, out uint id, out uint locationId, [Out] byte[] serialNo, [Out] byte[] description, out IntPtr handle);
public static extern FT_STATUS FT_GetDeviceInfoDetail(UInt32 dwIndex, out UInt32 lpdwFlags, out FT_DEVICE lpdwType, out UInt32 lpdwId, out UInt32 lpdwLocId, byte[] lpSerialNumber, byte[] lpDescription, out IntPtr pftHandle);
public static extern FT_STATUS FT_GetDeviceInfo(IntPtr ftHandle, out FT_DEVICE pftType, out UInt32 lpdwId, byte[] pcSerialNumber, byte[] pcDescription, IntPtr pvDummy);