2009-05-05 9 views
0

J'ai créé la procédure suivante en attendre à travailler avec une station de base Agilent Simulator:Pourquoi la correspondance de chaînes échoue-t-elle dans ce code "expect"?

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 
} 

======================== ================================ SORTIE:

Chaîne 1

>

oa; 05: SYST: APPL? Chaîne 2 Envoi bss_str: en; 05 "CDMA 2000 Lab App T"

ne peut pas lire "expect_out (buffer)": pas de telle variable lors de l'exécution "set receive_buffer expect_out de $ (tampon)" (procédure "get_bss_parameter_value" ligne 20)

==================================== ==================== Si "" est remplacé par "" dans le code ci-dessus, ceci est la SORTIE:

Chaîne 1

>

oa; 05: SYST: APPL? Chaîne 2 Envoi bss_str: en; 05 receive_buffer START:

oa; 05: SYST: APPL?

FIN actuelle est l'application

oa; 05: SYST: APPL?

Problème:
1) Je ne suis pas en mesure d'obtenir dans la variable expect_out (tampon) la valeur "CDMA 2000 App Lab T" qui devrait correspondre (en raison de *) la sortie du dispositif Agilent.. Y at-il un problème avec le code?
2) Dans les deux cas, la commande "en; 05" est envoyée mais pas affichée sur stdout. Bien que nous puissions voir la sortie attendue dans le premier cas.

Répondre

0

J'avais l'impression que la variable expect_out était globale. Si je ne me trompe pas, alors vous avez besoin:

global expect_out 

Ou, vous pouvez vous référer comme un global explicitement en utilisant le qualificatif d'espace de noms « :: »

set receive_buffer $::expect_out(buffer) 
1

Notez que la commande [expect] par défaut correspond à glob-style, pas à regexp-style. Alors, où vous écrivez:

expect .* 

que vous cherchez en fait une chaîne commençant par un point littéral suivi d'un nombre de caractères. Comme cela ne correspond pas, le tableau expect_out n'est pas rempli.Comme vous le mentionnez

expect * 

se comporte comme prévu parce que le motif glob « * » correspond à une chaîne.

Si vous voulez vraiment "*", vous devez spécifier

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