为什么在Windows 7上调用ftd2xx open(使用tclftd2xx.dll)后tcl / tk挂起

时间:2013-02-27 23:15:01

标签: windows-7 tcl ftdi

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

作为测试的一部分,我将应用程序安装到Windows 7计算机上。该应用程序运行正常,直到我尝试退出tcl。当执行退出命令时,应用程序就会挂起。

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

package require ftd2xx
set handle [ftd2xx open -location 22]
exit

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

我确实发现调用ftd2xx重置会清除tcl正在等待的内容,并允许退出完成。

如:

package require ftd2xx
set handle [ftd2xx open -location 22]
ftd2xx reset $handle
exit

现在我的问题是如果用户在关闭应用程序之前拔掉USB设备,文件句柄($ handle)就会失效,所以ftd2xx重置无法释放挂起,我又回到硬重启。 / p>

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

如果有人对此有所了解,我会很感激反馈。

1 个答案:

答案 0 :(得分:1)

问题在于:

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

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

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

.
.
.

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”错误,允许程序以有序的方式关闭。