Команда отлично работает из терминала или внутри скрипта bash, но не из скрипта python с использованием модуля подпроцесса

Я пытаюсь написать код на python, чтобы автоматизировать работу, которую я обычно делаю вручную. Работа состоит в том, чтобы просто изменить некоторые части кода на C, а затем вставить нижеприведенную команду в терминал для сборки, компиляции и загрузки кода C для каждого скрипта Z1 Zolertia.

sudo scons board=z1 toolchain=mspgcc bootload=/dev/ttyUSB0 oos_openwsn    

Команда отлично работает из терминала или внутри скрипта bash, но когда я запускаю ее из скрипта python, она не работает должным образом.

Я считаю, что проблема в том, что этапы сборки и компиляции успешно завершаются, но этап загрузки (Mass Erase) выполняется дважды, поэтому порт отключен и больше не виден.

Эта часть кода создает проблемы:

subprocess.call('(cd /home/ilkin/git/Yadhunandana-testbed/openwsn-fw ; sudo scons board=z1 toolchain=mspgcc bootload=/dev/ttyUSB0 oos_openwsn)', shell=True)

Это результат этапов сборки, компиляции и загрузки. Как видите, "Массовое стирание" выполняется одновременно, поэтому оно не работает.

sudo python automate.py 

scons: Reading SConscript files ...

___                 _ _ _  ___  _ _ 
| . | ___  ___ ._ _ | | | |/ __>| \ |
| | || . \/ ._>| ' || | | |\__ \|   |
`___'|  _/\___.|_|_||__/_/ <___/|_\_|
    |_|                  openwsn.org

none
scons: done reading SConscript files.
scons: Building targets ...
Dynifying build/z1_mspgcc/openapps/openapps_dyn.c
msp430-size build/z1_mspgcc/projects/common/03oos_openwsn_prog
  text    data     bss     dec     hex filename
 51442     532    6598   58572    e4cc build/z1_mspgcc/projects/common/03oos_openwsn_prog
z1_bootload(["build/z1_mspgcc/projects/common/03oos_openwsn_prog.phonyupload"], ["build/z1_mspgcc/projects/common/03oos_openwsn_prog.ihex"])
starting bootloading on /dev/ttyUSB0
MSP430 Bootstrap Loader Version: 1.39-goodfet-8
Mass Erase...
MSP430 Bootstrap Loader Version: 1.39-goodfet-8
Mass Erase...
Traceback (most recent call last):
 File "bootloader/z1/z1-bsl-nopic", line 1925, in <module>
   main(0);
 File "bootloader/z1/z1-bsl-nopic", line 1840, in main
   for f in toinit: f()
 File "bootloader/z1/z1-bsl-nopic", line 1102, in actionMassErase
   0xa506)             #Required setting for mass erase!
 File "bootloader/z1/z1-bsl-nopic", line 761, in bslTxRx
   self.bslSync(wait)                          #synchronize BSL
 File "bootloader/z1/z1-bsl-nopic", line 720, in bslSync
   raise BSLException(self.ERR_BSL_SYNC)       #Sync. failed
__main__.BSLException: Bootstrap loader synchronization error
done bootloading on /dev/ttyUSB0
scons: done building targets.

Это не тот случай, когда я запускаю команду вручную из терминала, часть "Mass Erase" запускается только один раз, и загрузка завершается успешно. Я ожидаю вывод, как это:

(cd /home/ilkin/git/Yadhunandana-testbed/openwsn-fw ; sudo scons board=z1 toolchain=mspgcc bootload=/dev/ttyUSB0 oos_openwsn)

scons: Reading SConscript files ...

___                 _ _ _  ___  _ _ 
| . | ___  ___ ._ _ | | | |/ __>| \ |
| | || . \/ ._>| ' || | | |\__ \|   |
`___'|  _/\___.|_|_||__/_/ <___/|_\_|
    |_|                  openwsn.org

none
scons: done reading SConscript files.
scons: Building targets ...
Dynifying build/z1_mspgcc/openapps/openapps_dyn.c
msp430-size build/z1_mspgcc/projects/common/03oos_openwsn_prog
  text    data     bss     dec     hex filename
 51442     532    6598   58572    e4cc build/z1_mspgcc/projects/common/03oos_openwsn_prog
z1_bootload(["build/z1_mspgcc/projects/common/03oos_openwsn_prog.phonyupload"], ["build/z1_mspgcc/projects/common/03oos_openwsn_prog.ihex"])
starting bootloading on /dev/ttyUSB0
MSP430 Bootstrap Loader Version: 1.39-goodfet-8
Mass Erase...
Transmit default password ...
Invoking BSL...
Transmit default password ...
Current bootstrap loader version: 2.13 (Device ID: f26f)
Changing baudrate to 38400 ...
Program ...
51974 bytes programmed.
Reset device ...
done bootloading on /dev/ttyUSB0
scons: done building targets.

Заранее спасибо!

1 ответ

К счастью, я решил проблему. Проблема возникла из-за использования функции в моем коде для отображения списка подключенных последовательных устройств. И главная причина в том, что эта функция закрывает последовательные устройства после их перечисления. Таким образом, последовательный порт не виден в этот короткий период, так как этап загрузки начинается после нескольких строк, когда последовательный порт закрыт (в микросекундах).

def serial_ports():

ports = glob.glob("/dev/ttyUSB*")

result = []
for elements in reversed(ports):
    try:
        s = serial.Serial(elements)
        s.close()
        result.append(elements)
    except (IOError, serial.SerialException):
        pass
Другие вопросы по тегам