Не могу разобраться с сабжем. Сейчас общаюсь с ком-портом посредством постоянного поллинга. Работает, но остается ощущение «неправильности». Стоит задача сделать нечто вроде конечного автомата: подаю модему команду, и в зависимости от его ответа выполняю разные действия. С помощью fileevent пытаюсь сделать так:
set status 0
set serial [open /dev/ttyS0 r+]
fconfigure $serial -mode "9600,n,8,1" -blocking 0 -buffering none -translation binary
fileevent $serial readable [list serial_receiver $serial]
proc serial_receiver { chan } {
global status
if { [eof $chan] } {
catch {close $chan}
return
}
set data [read $chan]
set size [string length $data]
}
switch $status {
0 {
puts -nonewline $serial "AT\r"
set status 1
}
1 {
puts -nonewline $serial "ATI\r"
set status 2
}
2 {
puts -nonewline $serial "AT+CREG?\r"
set status 3
}
3 {
puts -nonewline $serial "AT+CPIN?\r"
set status 0
}
}
В порт подается только первая команда — и все. Что я делаю не так?