Команда отлично работает из терминала или внутри скрипта 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