无法重新连接到先前在同一 TCL 脚本中打开的串行端口
Cannot reconnect to serial port that was previously opened in the same TCL script
我一直致力于使用 TCL 进行自动化硬件测试,其中硬件连接到串行端口。当前脚本可以第一次连接到串口,最后断开。但是,除非关闭并重新打开应用程序,否则它无法再次重新连接到串行端口。
连接串口的代码为:
if { [catch {spawn -open [open $port r+] } results] } {
puts $results
puts "Could not connect to port.\n"
return -1 }
成功的 return 语句是 return $spawn_id
应该关闭串口连接的代码是:
if {[catch {close -i $handle} results]} {
puts "$results"
puts "Failed to Close Session $handle\n\r"
return -1 }
#waits for handle to be properly closed
exp_wait
其中 $handle 是由 open 过程 spawn_id return 编辑的。
我写了一个简短的测试脚本来演示我是如何尝试使用它的:
source console.tcl
puts "available COM ports are: [console::availableSerial]"
set handle [console::openSession COM6 BARE>]
if {[catch {console::closeSession $handle} results]} {
puts $results }
if {[catch {console::openSession COM6 BARE>} results]} {
puts $results }
其中 'console::' 是相关打开和关闭过程的命名空间
我试过一些 fconfigure 参数,例如启用和禁用阻塞,但无济于事。
TCL显示的错误信息是`couldn't open serial "COM6": permission denied',提示端口没有正常关闭。这本书 'Exploring Expect' 没有太多具体的信息,所以我希望这里的人能够提供一些关于我做错了什么的见解。我正在使用 32 位 ActiveState ActiveTCL 8.6.3.1,我的 shell 是 Tclsh36
如有任何反馈,我们将不胜感激。谢谢
这里的问题源于使用 proc
来处理生成的连接。如果一个连接在一个过程中产生(称为 foo1),那么另一个过程(如果为 foo2 则称为)不能立即与它交互。为此,spawn_id
必须从 foo1 返回并作为参数传递给 foo2。这不仅会影响向生成的连接发送信息,还会影响从该连接接收信息。
在我的例子中,我调用了 close -i $handle
,这是正确的,但后来只是调用了 exp_wait
。 exp_wait
不是使用传入的 spawn_id 调用的,因此没有等待正确的响应。
修复方法是简单地将 exp_wait
替换为 exp_wait -i $handle
我一直致力于使用 TCL 进行自动化硬件测试,其中硬件连接到串行端口。当前脚本可以第一次连接到串口,最后断开。但是,除非关闭并重新打开应用程序,否则它无法再次重新连接到串行端口。 连接串口的代码为:
if { [catch {spawn -open [open $port r+] } results] } {
puts $results
puts "Could not connect to port.\n"
return -1 }
成功的 return 语句是 return $spawn_id
应该关闭串口连接的代码是:
if {[catch {close -i $handle} results]} {
puts "$results"
puts "Failed to Close Session $handle\n\r"
return -1 }
#waits for handle to be properly closed
exp_wait
其中 $handle 是由 open 过程 spawn_id return 编辑的。
我写了一个简短的测试脚本来演示我是如何尝试使用它的:
source console.tcl
puts "available COM ports are: [console::availableSerial]"
set handle [console::openSession COM6 BARE>]
if {[catch {console::closeSession $handle} results]} {
puts $results }
if {[catch {console::openSession COM6 BARE>} results]} {
puts $results }
其中 'console::' 是相关打开和关闭过程的命名空间
我试过一些 fconfigure 参数,例如启用和禁用阻塞,但无济于事。
TCL显示的错误信息是`couldn't open serial "COM6": permission denied',提示端口没有正常关闭。这本书 'Exploring Expect' 没有太多具体的信息,所以我希望这里的人能够提供一些关于我做错了什么的见解。我正在使用 32 位 ActiveState ActiveTCL 8.6.3.1,我的 shell 是 Tclsh36
如有任何反馈,我们将不胜感激。谢谢
这里的问题源于使用 proc
来处理生成的连接。如果一个连接在一个过程中产生(称为 foo1),那么另一个过程(如果为 foo2 则称为)不能立即与它交互。为此,spawn_id
必须从 foo1 返回并作为参数传递给 foo2。这不仅会影响向生成的连接发送信息,还会影响从该连接接收信息。
在我的例子中,我调用了 close -i $handle
,这是正确的,但后来只是调用了 exp_wait
。 exp_wait
不是使用传入的 spawn_id 调用的,因此没有等待正确的响应。
修复方法是简单地将 exp_wait
替换为 exp_wait -i $handle