LINUX.ORG.RU

шелл-скрипт expect - несколько комманд с параметрами из массива

 ,


0

1

Пытаюсь сообразить скрипт, который подключается к железке (самоделка на основе микроконтроллера) через COM-порт, используя cu (из UUCP), и вводит несколько команд с параметрами. параметры команд берутся из массивов. Пример:

#!/bin/sh 

function test {
expect << EOF
    set timeout 5
    spawn cu -l /dev/ttyUSB0 #соединение
    send "t\r"               #команда проверки соединения, ответ должен быть "ОК"
    expect "OK"              #соединение установлено

    expect "command:"        #промпт
    send "a $1\n"            #первая команда с аргументом
    expect "command:"        #промпт
    send "b $2\n"            #вторая команда с аргументом
    expect "command:"        #промпт

    send "~.\r"              #попытка разорвать соединение
    expect "Disconnected."   #ожидаемый ответ на разрыв

EOF
}

a=(0 1)
b=(90 100)

test ${a[1]} ${b[1]} > logfile.txt
test ${a[2]} ${b[2]} >> logfile.txt

exit 0
~. - код разрыва соединения, который не работает. (Может можно без разрыва?)
В общем, пытаюсь установить соединение с девайсом, накидать туда комманд с параметрами из массива, результат вывести в файл. Пытаюсь вынести процесс передачи команд в функцию «test» с параметрами. Пока в скрипте только два её вызова, но хочу вызывать её из цикла, относительно количества элементов в массивах a и b.
command: - это промпт железки.
Первый вызов функции прокатывает, второй нет. в терминале получаю вывод:
expect: spawn id exp6 not open
    while executing
"expect "command:""
Как понимаю, сессия cu не разрывается корректно и во второй раз не удаётся установить соединение. Как правильно разрулить ситуацию? Как разорвать соединение cu из скрипта, или какие есть варианты без разрыва соединения?


А тебе точно нужен cu? Kermit, minicom, тупо echo и read не подходят?

И кстати, зачем тебе разрыв соединения?

tailgunner ★★★★★ ()
Ответ на: комментарий от tailgunner

И кстати, зачем тебе разрыв соединения?

Чтобы его поганое ардуино перешло в режим программирования и спутало все карты :)

anonymous ()

какие есть варианты без разрыва соединения?

Напиши демона, через который твои программы будут общаться с твоими девайсами.

anonymous ()
Ответ на: комментарий от lnx

По ссылке написано, что ты пока не определился с ценой разрабатываемого устройства и хотел бы обсудить в личке деловые предложения от участников того форума...

Я опасаюсь не будет ли это разглашением твоей коммерческой тайны, но обязан задать тебе этот вопрос: зачем ты обрываешь соединение если это не необходимо? И раз уж ты его обрываешь, то почему бы не закрыть процесс и не дождаться его завершения с помощью команд close и wait перед тем как снова открывать порт?

anonymous ()
Ответ на: комментарий от lnx

echo read напрямую в /dev/ttyUSB0?

Да.

Но лично я сначала попробовал бы просто без разрыва или через другую терминальную программу.

tailgunner ★★★★★ ()
Ответ на: комментарий от anonymous

Годы идут, а анонимусы на ЛОРе не меняются.Никакой тайны нет. Все материалы для повторения будут бесплатны.
Я же спрашиваю: как лучше? Мне нужно дать команду и сохранить вывод в файл. Сейчас это делаю через простой скрипт с xpect, но хочу через функцию, передавая ей параметры команд.

lnx ()

Если уж используешь expect, а это надстройка над tcl, то и открывай serial порт средствами tcl, они (средства) прекрасны, кроссплатформенны и удобны.

man 3tcl open
/SERIAL COMMUNICATIONS

SERIAL COMMUNICATIONS
       If  fileName refers to a serial port, then the specified serial port is
       opened and initialized in a platform-dependent manner.  Acceptable val‐
       ues  for the fileName to use to open a serial port are described in the
       PORTABILITY ISSUES section.

       The fconfigure command can be used to query and set additional configu‐
       ration options specific to serial ports (where supported):

       -mode baud,parity,data,stop
              This option is a set of 4 comma-separated values: the baud rate,
              parity, number of data bits, and number of stop  bits  for  this
              serial  port.   The baud rate is a simple integer that specifies
              the connection speed.  Parity is one of the  following  letters:
              n,  o,  e,  m,  s; respectively signifying the parity options of
              “none”, “odd”, “even”, “mark”, or “space”.  Data is  the  number
              of data bits and should be an integer from 5 to 8, while stop is
              the number of stop bits and should be the integer 1 or 2.

[SKIP]

       -timeout msec
              (Windows and Unix). This option is used to set the  timeout  for
              blocking  read  operations.  It  specifies  the maximum interval
              between the reception of two bytes in  milliseconds.   For  Unix
              systems  the  granularity  is  100  milliseconds.   The -timeout
              option does not affect write operations  or  nonblocking  reads.
              This option cannot be queried.
[SKIP]

       -xchar {xonChar xoffChar}
              (Windows  and  Unix). This option is used to query or change the
              software handshake characters.  Normally  the  operating  system
              default  should  be  DC1  (0x11) and DC3 (0x13) representing the
              ASCII standard XON and XOFF characters.

       -pollinterval msec
              (Windows only). This option is used  to  set  the  maximum  time
              between  polling for fileevents.  This affects the time interval
              between checking for events throughout the Tcl interpreter  (the
              smallest  value  always wins).  Use this option only if you want
              to poll the serial port more or less often  than  10  msec  (the
              default).

[SKIP]
       -lasterror
              (Windows only). This option is query only.  In case of a  serial
              communication error, read or puts returns a general Tcl file I/O
              error.  fconfigure -lasterror can be called to  get  a  list  of
              error  details.   See  below  for  an explanation of the various
              error codes.
SERIAL PORT SIGNALS
       RS-232 is the most commonly  used  standard  electrical  interface  for
       serial  communications.
[SKIP]
anonymous ()
Ответ на: комментарий от lnx

Я не понял, ты уже попробовал добавить команды close и wait в самый конец тела функции?

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.