1

我有一个在 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 重置无法释放挂起,我又要硬重启了。

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

如果有人对此有所了解,我将不胜感激。

4

1 回答 1

2

问题是:

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

2)我没有使用非阻塞读取(tcl 通道配置 -blocking 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”错误,从而使程序能够有序地关闭。

于 2013-04-17T21:46:25.373 回答