
Thanks for this. the exp_internal bit was helpful. I ended up working out that it wasn't progressing past the interact statement. This works fine now: #!/bin/sh # expect sees the next line as a comment continuation \ # You can put shell lines here as long as you end them semicolon backslash \ modem=${modem:-/dev/ttyUSB1};\ export modem;\ stty -F $modem 2400 raw -clocal -echo -istrip -hup;\ \ # Really start expect \ exec expect -- "$0" "$@" puts "connecting to $env(modem), exit with ~," spawn -open [open $env(modem) r+] ;# rw, no truncate exp_internal 1 ;# Comment-out once working set timeout -1 match_max 100000 send -- "\r" expect ">" send -- "p 7d91\r" expect ">" send -- "p b2ff\r" expect ">" send -- "h\r" expect ">" send -- "td\r" expect "td\r 18 215 12 24 33\r
" send -- "gd 215\r" expect eof
On Mon, Aug 20, 2018 at 2:24 PM, Duncan Roe via luv-main < luv-main@luv.asn.au> wrote:
On Mon, Aug 20, 2018 at 10:29:46AM +1000, luv-main wrote:
Hi All,
I'm having some trouble making expect work.
I need it to talk to some vintage equipment over usb serial, and I think I'm getting hung up on opening the port.
When the script runs, it just connects to the device and sits there. I can drive it interactively, but it doesn't attempt to automate anything.
Any ideas? Thanks.
My expect script looks like this:
#!/usr/bin/expect -f
# device set modem /dev/ttyUSB0
# keep it open exec sh -c "sleep 3 < $modem" &
# serial port parameters exec stty -F $modem 2400 raw -clocal -echo -istrip -hup
# connect send_user "connecting to $modem, exit with ~,\n" spawn -open [open $modem w+] interact { ~, exit ~~ {send "\034"} }
set force_conservative 1 ;# set to 1 to force conservative mode even if ;# script wasn't run conservatively originally if {$force_conservative} { set send_slow {1 .1} proc send {ignore arg} { sleep .1 exp_send -s -- $arg } }
set timeout -1 match_max 100000 send -- "\r" send -- "\r" expect ">" send -- "p 7d91\r" expect ">" send -- "p b2ff\r" expect ">" send -- "h\r" expect ">" send -- "td\r" expect "td\r 18 215 12 24 33\r
" send -- "gd 215\r" expect eof
What a mess. Could you tidy it a little, or a lot?
You don't need slow send with these short character sequences.
You can do the shell lines before you start expect (as I'll demonstrate).
I used to do a lot of (USB or not) serial stuff and never found I needed that sleep 3 thing. Once you set serial line params, they stay that way until a process changes them. Tcl open does not change them unless you tell it to.
Anyway, sleep 3 <$modem is likely sucking up response characters.
*exp_internal 1* is your friend when debugging expect scripts,
Cheers ... Duncan.
===================
#!/bin/sh
# expect sees the next line as a comment continuation \ # You can put shell lines here as long as you end them semicolon backslash \ modem=${modem:-/dev/ttyUSB0};\ export modem;\ stty -F $modem 2400 raw -clocal -echo -istrip -hup;\ \ # Really start expect \ exec expect -- "$0" "$@"
puts "connecting to $env(modem), exit with ~," spawn -open [open $env(modem) r+] ;# rw, no truncate
exp_internal 1 ;# Comment-out once working
interact { {~,} {exit} {~~} {send "\034"} }
# and so on _______________________________________________ luv-main mailing list luv-main@luv.asn.au https://lists.luv.asn.au/cgi-bin/mailman/listinfo/luv-main