Форум сайта python.su
0
Насколько я понял, надо это все запустить в качестве демона, и передавать данные переодически на открытие реле через gpio…..
Как это все сообразить?
Погуглил можно огранизовать связь между демоном и скриптом.
Смотрю на код глаза разбегаются, и сама передача переменных совсем не очевидна…..
Офлайн
0
Подскажите ПОЖАЛУЙСТА! Хочу это сделать автозапуском, как скрипт сделать бесконечным?
#!/usr/bin/env python # -*- coding: utf-8 -*- import serial import time import RPi.GPIO as GPIO import requests import sys import socket GPIO.setmode(GPIO.BOARD) GPIO.setup(33,GPIO.OUT) GPIO.setup(35,GPIO.OUT) GPIO.setup(37,GPIO.OUT) GPIO.output(33,GPIO.HIGH) GPIO.output(35,GPIO.HIGH) GPIO.output(37,GPIO.HIGH) ser = serial.Serial('/dev/ttyUSB1',9600) ch = ser.readline() mag = int(ch.encode('hex'),16)/100000-30 sock = socket.socket() sock.bind(('', 9090)) sock.listen(1) conn, addr = sock.accept() print 'connected:', addr while True: data = conn.recv(1024) if not data: break conn.send(data.upper()) opcl, prop = data.split(" ", 2) print(opcl) print(prop) z = int(opcl)+1 print(z) print(data.upper()) if int(opcl) < 8: if (mag == 6): ex = 4 elif (mag == 4): ex = 3 else: ex = 6 var = 0 while var < 30: GPIO.output(33,GPIO.LOW) GPIO.output(35,GPIO.LOW) ch = ser.readline() mag = int(ch.encode('HEX'),16)/100000-30 print(mag) if (ex == mag): GPIO.output(33,GPIO.HIGH) GPIO.output(35,GPIO.HIGH) link = "http://localhost/vd.php?pr="+prop f = requests.get(link) print(f.text) break; exit() var = var + 1 else: GPIO.output(33,GPIO.HIGH) GPIO.output(35,GPIO.HIGH) GPIO.output(37,GPIO.HIGH) else: if (mag < 4): ex = 4 elif (mag > 5): ex = 3 else: ex = 6 var = 0 while var < 30: GPIO.output(33,GPIO.LOW) GPIO.output(37,GPIO.LOW) ch = ser.readline() mag = int(ch.encode('HEX'),16)/100000-30 print(mag) if (ex == mag): GPIO.output(33,GPIO.HIGH) GPIO.output(37,GPIO.HIGH) link2 = "http://localhost/vihod.php?pr="+prop f2 = requests.get(link2) print(f2.text) break; exit() var = var + 1 else: GPIO.output(33,GPIO.HIGH) GPIO.output(35,GPIO.HIGH) GPIO.output(37,GPIO.HIGH) conn.close()
Офлайн
0
Конструкция WHILE i < n не помогает.
Офлайн
0
Я так понимаю надо чем то заменить break в этом месте:
while True: data = conn.recv(1024) if not data: break
Офлайн
0
Разбираюсь с глобальными переменными, но в loop_a гллобальная переменная не поподает.
#!/usr/bin/env python # -*- coding: utf-8 -*- from socket import * import RPi.GPIO as GPIO import time import requests import serial from multiprocessing import Process #данные сервера host = 'localhost' port = 9999 addr = (host,port) ser = serial.Serial('/dev/ttyUSB1',9600) ch = ser.readline() mag = int(ch.encode('hex'),16)/100000-30 #socket - функция создания сокета #первый параметр socket_family может быть AF_INET или AF_UNIX #второй параметр socket_type может быть SOCK_STREAM(для TCP) или SOCK_DGRAM(для UDP) tcp_socket = socket(AF_INET, SOCK_STREAM) #bind - связывает адрес и порт с сокетом tcp_socket.bind(addr) #listen - запускает прием TCP tcp_socket.listen(2) def loop_a(): #Бесконечный цикл работы программы while True: GPIO.setmode(GPIO.BOARD) GPIO.setup(33,GPIO.OUT) GPIO.setup(35,GPIO.OUT) GPIO.setup(37,GPIO.OUT) GPIO.output(33,GPIO.HIGH) GPIO.output(35,GPIO.HIGH) GPIO.output(37,GPIO.HIGH) #accept - принимает запрос и устанавливает соединение, (по умолчанию работает в блокирующем режиме) #устанавливает новый сокет соединения в переменную conn и адрес клиента в переменную addr conn, addr = tcp_socket.accept() #recv - получает сообщение TCP data = conn.recv(1024) #если ничего не прислали, завершим программу if not data: conn.close() break else: print(data) conn.send(data.upper()) opcl, prop = data.split(" ", 2) print(opcl) print(prop) if int(opcl) < 8: if (mag == 6): ex = 4 elif (mag == 4): ex = 3 else: ex = 6 var = 0 if int(opcl) < 8: while var < 50: print(ex) print(mag) GPIO.output(33,GPIO.LOW) GPIO.output(35,GPIO.LOW) time.sleep(0.1) if (ex == mag): GPIO.output(33,GPIO.HIGH) GPIO.output(35,GPIO.HIGH) GPIO.cleanup() link = "http://localhost/vd_mg.php?pr="+prop f = requests.get(link) print(f.text) break; var = var + 1 else: GPIO.output(33,GPIO.HIGH) GPIO.output(35,GPIO.HIGH) GPIO.output(37,GPIO.HIGH) GPIO.cleanup() else: if (mag < 4): ex = 4 elif (mag > 5): ex = 3 else: ex = 6 var = 0 while var < 50: print(ex) print(mag) GPIO.output(33,GPIO.LOW) GPIO.output(37,GPIO.LOW) time.sleep(0.1) if (ex == mag): GPIO.output(33,GPIO.HIGH) GPIO.output(37,GPIO.HIGH) GPIO.cleanup() link = "http://localhost/vd_mg.php?pr="+prop f = requests.get(link) print(f.text) break; var = var + 1 else: GPIO.output(33,GPIO.HIGH) GPIO.output(35,GPIO.HIGH) GPIO.output(37,GPIO.HIGH) GPIO.cleanup() conn.close() def loop_b(): while True: global mag ch = ser.readline() mag = int(ch.encode('HEX'),16)/100000-30 if __name__ == '__main__': Process(target=loop_a).start() Process(target=loop_b).start()
Офлайн
0
Хелп ПОЖАЛСТА, как это работает, в смысле почему на выходе еденицы?
from multiprocessing import Process import time var = 1 def loop_a(): while 1: global var var = var +1 time.sleep(1) def loop_b(): while 1: print(var) time.sleep(1) if __name__ == '__main__': Process(target=loop_a).start() Process(target=loop_b).start()
Офлайн
253
это разные процессы, передаются только аргументы функции.
Использовать мультипроцессинг без веского на то основания крайне не рекомендую.
В вашем случае не требуется даже многотредовость. Используйте асинхронность.
Офлайн