FTDI D2XX驱动多BackgroundWorker并行测试时连接失败问题求助
问题根因
- 全局共享资源冲突:所有
BackgroundWorker共用全局的myFtdiDevice实例、ftStatus状态变量、iPosRuehrerGrid索引变量,多线程并发读写时会出现值覆盖,导致操作的设备ID、实例状态混乱,单线程无资源竞争时正常,多线程下直接出错。 - 烧录、测试流程时序错误:代码中启动烧录线程后未等待所有烧录任务完成,直接启动测试线程,此时设备还处于烧录状态,无法响应连接请求。
- FTDI驱动并发操作冲突:多线程同时调用
CyclePort、OpenByLocation等D2XX驱动接口时,驱动的设备枚举逻辑会出现并发冲突,导致端口重置、设备打开失败。 - 共享设备列表读写冲突:全局的
ftdiDeviceList被多个线程同时读取,同时测试线程还会修改该列表,读写冲突会导致读取到的设备LocID错误。
修复方案
- 取消全局FTDI设备实例共享:每个线程操作对应设备时,单独创建局部的FTDI设备实例,所有状态变量(比如操作索引、返回状态)全部改为方法内局部变量,必须全局使用的变量加
ThreadStatic标记做线程隔离。 - 同步烧录、测试流程时序:使用
CountdownEvent同步烧录任务,初始化计数等于设备总数,每个烧录线程执行完成后计数减1,主线程等待CountdownEvent.Wait()返回后,再启动所有测试线程。 - 驱动接口加锁保护:对
CyclePort、设备枚举、端口打开这类驱动全局操作加互斥锁,保证同一时间只有一个线程执行这类操作,避免驱动层并发冲突。 - 设备列表做快照:启动任务前先将
ftdiDeviceList的内容拷贝为只读快照,每个线程只读访问自己的快照副本,不要修改全局的设备列表。 - 测试重试加超时逻辑:给
OpenByLocation的重试循环增加最大重试次数,避免异常情况下死循环,方便定位故障。
内容的提问来源于stack exchange,提问作者user15098727
相关产品推荐
相关产品推荐

