我已经创建了以下程序,期望使用Agilent Base Station Simulator:
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(缓冲区)”:没有这样的变量 执行时 “set receive_buffer $ expect_out(buffer)” (程序“get_bss_parameter_value”第20行)
=============================================== ========= 如果在上面的代码中“。”被“”替换,那么这就是OUTPUT:
字符串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(缓冲区)变量中获得值“CDMA 2000 Lab App T”,该变量应与安捷伦设备的输出匹配(由于。*)。代码有问题吗?
2)在这两种情况下,命令“en; 05”都会发送但不会显示在stdout上。虽然我们可以在第一种情况下看到预期的输出。
答案 0 :(得分:1)
请注意,[expect]命令默认为glob-style匹配,而不是regexp-style。所以,你写的地方:
expect .*
你实际上在寻找一个以文字点开头,后跟任意数量字符的字符串。由于无法匹配,所以expect_out数组不会被填充。正如你提到的那样
expect *
表现得如你所愿,因为glob模式“*”匹配任何字符串。
如果你真的想要“。*”,那么你需要指定
expect -re .*
set receive_buffer $expect_out(buffer)
答案 1 :(得分:0)
我认为expect_out变量是全局变量。如果我是对的,那么你需要以下内容:
global expect_out
或者,您可以使用命名空间限定符“::”
显式地将其称为全局set receive_buffer $::expect_out(buffer)