无法重新连接到先前在同一TCL脚本中打开的串行端口

时间:2015-01-28 20:48:01

标签: serial-port tcl expect permission-denied reconnect

我一直致力于使用TCL自动化硬件测试,其中硬件连接到串行端口。当前脚本可以在第一次连接到串行端口,并在最后断开连接。但是,除非关闭并重新打开应用程序,否则它无法再次重新连接到串行端口。 连接到串行端口的代码是:

    if { [catch {spawn -open [open $port r+] } results] } {
        puts $results
        puts "Could not connect to port.\n"
        return -1 }

成功的返回语句为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。

我写了一个简短的测试脚本来演示我如何使用它:

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显示的错误消息是“无法打开串行”COM6“:权限被拒绝”,表明端口未正确关闭。 “Exploring Expect”这本书并没有太多具体信息,所以我希望有人能够提供一些有关我做错事情的见解。我使用的是32位ActiveState ActiveTCL 8.6.3.1,我的shell是Tclsh36

我们将不胜感激。感谢。

1 个答案:

答案 0 :(得分:1)

这里的问题源于使用proc来处理生成的连接。如果在一个过程中生成一个连接(称之为foo1),那么另一个过程(如果foo2调用)就不能立即与它进行交互。为此,必须从foo1返回spawn_id并将其作为参数传递给foo2。这不仅影响向生成的连接发送信息,还影响从该连接接收信息。

在我的情况下,我打电话给close -i $handle,这是正确的,但后来简称为exp_wait。使用传入的spawn_id未调用exp_wait,因此没有等待正确的响应。

修复方法是将exp_wait替换为exp_wait -i $handle