У меня был похожий опыт, когда устройство FTDI входило в состояние, когда я не мог с ним связаться, если я не отключил его физически. Ответ Грега помог мне найти обходной путь.
Ссылка Грега на управляемую оболочку FTDI была очень полезной, но предоставленный им фрагмент не совсем там, потому что для ссылки на устройство FTDI требуется немного больше кода. С его идеей в качестве отправной точки я адаптировал некоторый пример кода из FTDI и написал эту функцию. Он смог вернуть мое устройство FTDI в рабочее состояние без физического вмешательства.
/// <summary>
/// Attempts to reset an attached FTDI device and returns true if successful. Note that a
/// 5-8 second delay is recommended after the reset.
/// </summary>
/// <returns></returns>
private bool ResetFTDI() {
UInt32 ftdiDeviceCount = 0;
FTD2XX_NET.FTDI.FT_STATUS ftStatus = FTD2XX_NET.FTDI.FT_STATUS.FT_OK;
// Create new instance of the FTDI device class
FTD2XX_NET.FTDI myFtdiDevice = new FTD2XX_NET.FTDI();
// Determine the number of FTDI devices connected to the machine
ftStatus = myFtdiDevice.GetNumberOfDevices(ref ftdiDeviceCount);
// Check status
if (ftStatus != FTD2XX_NET.FTDI.FT_STATUS.FT_OK) {
Log.WriteLog("Failed to get number of FTDI devices [" + ftStatus.ToString() + "]");
return false;
}
// If no devices available, return
if (ftdiDeviceCount == 0) {
Log.WriteLog("Failed to find any FTDI devices [" + ftStatus.ToString() + "]");
return false;
}
// Allocate storage for device info list
FTD2XX_NET.FTDI.FT_DEVICE_INFO_NODE[] ftdiDeviceList = new FTD2XX_NET.FTDI.FT_DEVICE_INFO_NODE[ftdiDeviceCount];
// Populate our device list
ftStatus = myFtdiDevice.GetDeviceList(ftdiDeviceList);
if (ftStatus != FTD2XX_NET.FTDI.FT_STATUS.FT_OK) {
Log.WriteLog("Failed enumerate FTDI devices [" + ftStatus.ToString() + "]");
return false;
}
// Open first device in our list by serial number
ftStatus = myFtdiDevice.OpenBySerialNumber(ftdiDeviceList[0].SerialNumber);
if (ftStatus != FTD2XX_NET.FTDI.FT_STATUS.FT_OK) {
Log.WriteLog("Failed to open device [" + ftStatus.ToString() + "]");
return false;
}
// Finally, reset the port
myFtdiDevice.CyclePort();
return true;
}
Приведенный выше объект Log является внутренним для моего проекта, поэтому замените все, что вам подходит.
Некоторые дальнейшие исследования также подняли этот вопрос . В ответах Зак Соу упоминает проблему, обнаруженную им в связи .NET SerialPort. Я собираюсь попробовать его решение, и я опубликую здесь, если это полностью решит проблему, потому что я считаю, что вышеупомянутое является чем-то вроде бандаида.