Windows 7 在Windows7上调用ftd2x open(使用tclftd2x.dll)后,为什么tcl/tk在退出时挂起

Windows 7 在Windows7上调用ftd2x open(使用tclftd2x.dll)后,为什么tcl/tk在退出时挂起,windows-7,tcl,ftdi,Windows 7,Tcl,Ftdi,我有一个在Windows8机器上开发的Tcl/Tk应用程序。该应用程序使用FTDI USB windows驱动程序和TCLFTD2x tcl扩展来打开USB设备 作为测试的一部分,我将该应用程序安装到Windows7机器上。在我尝试退出tcl之前,应用程序运行良好。执行exit命令时,应用程序将挂起 我以为它与Tk有关,但事实并非如此。tcl代码非常简单(loc 22只是一个示例): 这不是一个“好”的挂起——即使是程序终止也不会关闭它。摆脱这种情况的唯一方法是硬重置机器,因为windows不会

我有一个在Windows8机器上开发的Tcl/Tk应用程序。该应用程序使用FTDI USB windows驱动程序和TCLFTD2x tcl扩展来打开USB设备

作为测试的一部分,我将该应用程序安装到Windows7机器上。在我尝试退出tcl之前,应用程序运行良好。执行exit命令时,应用程序将挂起

我以为它与Tk有关,但事实并非如此。tcl代码非常简单(loc 22只是一个示例):

这不是一个“好”的挂起——即使是程序终止也不会关闭它。摆脱这种情况的唯一方法是硬重置机器,因为windows不会对活动进程进行“安全”关闭

我确实发现调用ftd2xx重置将清除tcl等待的任何内容,并允许退出完成

例如:

package require ftd2xx
set handle [ftd2xx open -location 22]
ftd2xx reset $handle
exit
现在,我的问题是,如果用户在关闭应用程序之前拔下USB设备,文件句柄($handle)就会过时,因此ftd2xx重置无法释放挂起,我将重新硬启动

我不知道错误是在我的初始化、libftd2x.c、FTDI驱动程序还是Tcl中。我不想发布libftd2x.c的所有内容

如果有人对此有所了解,我将非常感谢您的反馈。

问题在于:

1) FTDI芯片本身配置为异步位bash模式。根据FTDI文档,在此模式下,FTDI芯片对其并行端口引脚进行采样(无论方向(i/o)配置如何),并将值写入每个USB时钟上的内部缓冲区

2) 我没有使用非阻塞读取(tcl通道配置-阻塞0),因为在这个应用程序中,USB是“只写”的。(即,端口的每个位配置为一个输出,每个输出驱动一个单独的逻辑电平到电路板)

解决方法:将通道配置为非阻塞,并定义读取垃圾的读取处理程序。这是一个代码片段-请原谅未定义的变量;它们是为上下文而存在的

.
.
.

set handle [ftd2xx open -location $loc]
chan configure $handle -blocking 0 -translation binary -0xFF01
fileevent $handle readable readhandler
.
.
proc readhandler {} {
  gets $handle junk
}

事实上,readhandler经常被调用,$junk有时有多达10K字节的数据。拔下USB插头后,会发现随后的“flush$filehandle”错误,从而使程序有序关闭。

我猜ftd2xx软件包中存在问题。这对你没有帮助。(您使用的是哪个版本的Tcl?)对不起,这是tcl8.5。有没有办法显式终止Tcl事件循环?我将尝试构建8.6,看看这是否有帮助。默认情况下,事件循环不会运行(除非您使用
package require Tk
或使用
wish
),并且它不会中断您的代码,除非您使用进入事件循环的命令之一(
update
vwait
和调用它们的东西,例如
http::geturl
,而不回调)。此外,如果您处理线程,您可能正在处理事件,因为线程间通信是通过事件路由的…
.
.
.

set handle [ftd2xx open -location $loc]
chan configure $handle -blocking 0 -translation binary -0xFF01
fileevent $handle readable readhandler
.
.
proc readhandler {} {
  gets $handle junk
}