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

Serial port 无法重新连接到以前在同一TCL脚本中打开的串行端口,serial-port,tcl,expect,permission-denied,reconnect,Serial Port,Tcl,Expect,Permission Denied,Reconnect,我一直致力于使用TCL自动化硬件测试,在TCL中,硬件连接到串行端口。当前脚本可以第一次通过连接到串行端口,最后断开连接。但是,除非关闭并重新打开应用程序,否则无法重新连接到串行端口。 连接到串行端口的代码为: if { [catch {spawn -open [open $port r+] } results] } { puts $results puts "Could not connect to port.\n" return -1

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

    if { [catch {spawn -open [open $port r+] } results] } {
        puts $results
        puts "Could not connect to port.\n"
        return -1 }
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
成功的return语句为
return$spawn\u id

关闭串行端口连接的代码为:

    if { [catch {spawn -open [open $port r+] } results] } {
        puts $results
        puts "Could not connect to port.\n"
        return -1 }
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”:权限被拒绝”,表明端口未正确关闭。《Expect探索》一书没有太多关于这方面的信息,所以我希望这里的人能够提供一些关于我做错了什么的见解。我使用的是32位ActiveState ActiveTCL 8.6.3.1,我的shell是Tclsh36


任何反馈都将不胜感激。谢谢。

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

在我的例子中,我调用了
close-I$handle
,这是正确的,但随后只调用了
exp\u wait
。没有使用传入的spawn\u id调用
exp\u wait
,因此没有等待正确的响应


修复方法是简单地用
exp\u wait-i$handle

替换
exp\u wait
?(我怀疑问题是需要执行
等待
或类似操作,但我真的不确定。)如果连接是手动打开的而不是脚本,那么您将如何关闭连接?@donalvellows让串行端口保持打开状态的问题是在脚本运行之间,连接到串行端口的外围设备已更改。我还尝试过在4000次之后使用
,或者在关闭端口之后使用其他等待时间,但仍然得到相同的结果。对不起,我可能应该在问题中包含这些信息。感谢您的输入。@Dinesh在手动打开串行端口时,我使用了
设置句柄[open$port]
然后将“handle”的值设置为与“file22d6c78”类似的值。要关闭此操作,我调用
close$handle
。我曾尝试将此作为测试方法,但遗憾的是结果相同。