0

为了使用安捷伦基站模拟器,我创建了以下程序:

proc get_bss_parameter_value {bss parameter_string} {
global bss_array

set bss_str "$parameter_string?"

puts "String 1"
set bss_str "oa;$bss_array(gpib):$bss_str\r"
send "$bss_str"
expect {nopattern^}

puts "String 2"
set bss_str "en;$bss_array(gpib)"
puts "Sending bss_str: $bss_str"
send "$bss_str\r"
expect .*

set receive_buffer $expect_out(buffer)
puts "receive_buffer START: $receive_buffer"
puts "END"

return $receive_buffer
}

==================================================== ====== 输出:

字符串 1

>

oa;05:SYST:APPL? 字符串 2 发送 bss_str: en;05 "CDMA 2000 Lab App T"

无法读取“expect_out(buffer)”:执行“set receive_buffer $expect_out(buffer)”时没有这样的变量(过程“get_bss_parameter_value”第 20 行)

==================================================== ====== 如果在上面的代码中“. ”被“ ”替换,这是输出:

字符串 1

>

oa;05:SYST:APPL? 字符串 2 发送 bss_str: en;05 receive_buffer START:

oa;05:SYST:APPL?

END 当前申请是

oa;05:SYST:APPL?

问题:
1) 我无法在 expect_out(buffer) 变量中获得值“CDMA 2000 Lab App T”,该变量应该匹配(由于.*)安捷伦设备的输出。代码有问题吗?
2) 在这两种情况下,命令“en;05”已发送但未显示在标准输出上。虽然我们可以在第一种情况下看到预期的输出。

4

2 回答 2

1

请注意, [expect] 命令默认执行glob 样式匹配,而不是regexp-style。所以,你写的地方:

expect .*

您实际上是在寻找以文字点开头的字符串,后跟任意数量的字符。由于这不匹配,因此不会填充 expect_out 数组。正如你提到的

expect *

由于 glob 模式 "*" 匹配任何字符串,因此行为如您所愿。

如果你真的想要“.*”,那么你需要指定

expect -re .*
set receive_buffer $expect_out(buffer)
于 2009-06-02T18:15:06.903 回答
0

我的印象是 expect_out 变量是一个全局变量。如果我是正确的,那么您需要以下内容:

global expect_out

或者,您可以使用命名空间限定符“::”将其显式称为全局

set receive_buffer $::expect_out(buffer)
于 2009-05-06T20:01:03.927 回答