2009-05-05 13 views
0

Ich habe die folgende Prozedur erstellt in erwarten mit einem Agilent Base Station Simulator zu arbeiten:Warum schlägt die String-Übereinstimmung in diesem "expect" -Code fehl?

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 
} 

======================== ================================ OUTPUT:

String 1

>

oa; 05: SYST: APPL? String 2 Senden bss_str: en; 05 "CDMA 2000 Lab App T"

kann nicht "expect_out (Puffer)" lesen: keine solche Variable während "gesetzt receive_buffer $ expect_out (Puffer)" Vollstreckungs (Verfahren "get_bss_parameter_value" -Leitung 20)

==================================== ==================== Wenn ". " im obigen Code durch "" ersetzt wird, ist dies der OUTPUT:

String

>

oa; 05: SYST: APPL? String 2 Senden bss_str: en; 05 receive_buffer START:

oa; 05: SYST: APPL?

END Aktuelle Anwendung ist

oa; 05: SYST: APPL?

Problem:
1) Ich bin nicht in der Lage, den Wert "CDMA 2000 Lab App T" in der expect_out (Puffer) Variable zu erhalten, die (aufgrund übereinstimmen sollte *) die Ausgabe von der Agilent Gerät.. Stimmt etwas nicht mit dem Code?
2) In beiden Fällen wird der Befehl "en; 05" gesendet, aber nicht auf stdout angezeigt. Obwohl wir die erwartete Ausgabe im ersten Fall sehen können.

Antwort

0

Ich hatte den Eindruck, dass die Variable expect_out eine globale war. Wenn ich richtig bin, dann müssen Sie den folgend:

global expect_out 

Oder Sie ausdrücklich darauf als globaler verweisen kann durch das Namespace-Qualifikationsspiel mit „::“

set receive_buffer $::expect_out(buffer) 
1

Beachten Sie, dass der [expect] -Befehl funktioniert standardmäßig nicht mit glob-style, nicht mit regexp-style. Also, wo Sie schreiben:

expect .* 

Sie tatsächlich für eine Zeichenfolge suchen mit einem wörtlichen Punkt durch eine beliebige Anzahl von Zeichen gefolgt beginnen. Da dies nicht übereinstimmt, wird das Array expect_out nicht ausgefüllt.Wie Sie erwähnen

expect * 

verhält sich wie erwartet, weil das Glob-Muster "*" mit einer beliebigen Zeichenfolge übereinstimmt.

Wenn Sie wirklich wollen. "*", Dann müssen Sie

expect -re .* 
set receive_buffer $expect_out(buffer) 
angeben
Verwandte Themen