Уведомления

Группа в Telegram: @pythonsu

#1 Июль 7, 2013 17:06:18

vivl
Зарегистрирован: 2013-07-07
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

Работаю в линуксе. Подключаю ардуину, делаю так:

python
>>> import serial
>>> ser = serial.Serial('/dev/ttyUSB0', 9600)
>>> ser.write('1')
и вижу что данные приходят на железку и все работает как нужно. Но как только я записываю это дело в скрипт:
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
ser.write('1')
ser.close()
запускаю его python script.py, то железка не откликается.
при этом если в другом консольном окне инициализировать вышеописанным образом порт, то все работает. В чем дело?

Отредактировано vivl (Июль 7, 2013 19:06:45)

Офлайн

#2 Июль 7, 2013 17:18:25

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

sudo ? или

import serial
def main():
    ser = serial.Serial('/dev/ttyUSB0', 9600)
    ser.write('1')
    ser.close()
if __name__ == '__main__':
    main()

Отредактировано Singularity (Июль 7, 2013 17:20:17)

Офлайн

#3 Июль 7, 2013 18:50:54

vivl
Зарегистрирован: 2013-07-07
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

Там все судо. А вот код реально помог. Можно подробно обьяснить в чем же затык вышел? Что значит строка

 if __name__ == '__main__':
Хотя почитал что это значит но так и не понял почему она столь критичной оказалась )

Отредактировано vivl (Июль 7, 2013 19:31:38)

Офлайн

#4 Июль 7, 2013 20:52:32

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

vivl
но так и не понял почему она столь критичной оказалась
должно всё без неё срабатывать

vivl
запускаю его python script.py, то железка не откликается
может, повисла



Офлайн

#5 Июль 8, 2013 16:14:16

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

vivl
>>> ser.write('1')
vivl
ser.close()
Вы уверенны что из скрипта данные _успели_ записаться до того как вы вызвали close?

Офлайн

#6 Июль 8, 2013 18:15:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

s0rg
Вы уверенны что из скрипта данные _успели_ записаться до того как вы вызвали close?
чего ?

.write() наверняка блокирующий, иначе что это за модуль



Отредактировано py.user.next (Июль 8, 2013 18:17:21)

Офлайн

#7 Июль 8, 2013 18:22:35

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

Мжт порт уже открыт?



Офлайн

#8 Июль 8, 2013 18:29:59

Singularity
Зарегистрирован: 2011-07-28
Сообщения: 1387
Репутация: +  75  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

Может топик-стартер не все сказал или не так понял ?

Офлайн

#9 Июль 9, 2013 18:25:25

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

py.user.next
чего ?
Не вижу других причин, чтобы один и тот же код работал в консоли и не работал в скрипте.
Можно еще принудительно данные впихнуть.

Офлайн

#10 Июль 9, 2013 21:42:48

vivl
Зарегистрирован: 2013-07-07
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

В чем различие между консольным режимом и скриптом?

Вообще

 if __name__ == '__main__':
мне помогло.
Сначала я подумал что проблема в флаге иинциализации контроллера железки, так как заметил, что если сначала выполнить комманду
stty -F /dev/ttyUSB0 raw speed 9600 -crtscts -hupcl
, то скрипт тоже начинает срабатывать. Я уже успел даже костыль в скрипте сделать такого плана:
cmd = 'stty -F /dev/ttyUSB0 raw speed 9600 -crtscts -hupcl'
import subprocess
PIPE = subprocess.PIPE
p = subprocess.Popen(cmd, shell = True)
p.wait()
Что в принципе тоже помогло. Но потом я заметил, что после перезагрузки линукса и до того как я запустил эту комманду инициализации и выполнил вышеописанные комманды в консольном режиме, у меня тоже все заработало. Так что я решил, что дело таки не в инициализации. Потом я попробывал
import serial
def main():
    ser = serial.Serial('/dev/ttyUSB0', 9600)
    ser.write('1')
    ser.close()
if __name__ == '__main__':
    main()
И все заработало. Сейчас я еще раз все перепроверю. Может я случайно в крон пихнул
stty -F /dev/ttyUSB0 raw speed 9600 -crtscts -hupcl
? Но я перепроверю и отпишусь.
UPD. Действительно, если добавляю
if __name__ == '__main__':
, все пашет, а если убираю - нет. Может действительно, скрипт байт дослать до конца не успевает и порт закрывается? И кстати, если в другом окне открыть к примеру консоль на этом же девайсе и сделать:
python 
>>>ser = serial.Serial('/dev/ttyUSB0', 9600)
,
то скрипт будет выполняться в любом случае. Может, у меня не успевает порт инициализироваться и я уже начинаю туда байты слать? Или исключено?

Отредактировано vivl (Июль 9, 2013 22:20:00)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version