我有一个我在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
如果有人对此有所了解,我会很感激反馈。
答案 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”错误,允许程序以有序的方式关闭。