Как использовать Python Threading с передачей параметров между потоками - PullRequest
1 голос
/ 27 мая 2020

давний скрытень, первый плакат. Спасибо за ваше время.

1. Обобщите проблему. Я работаю с Python 2 и Raspberry Pi 4, работающим под управлением Raspbian Buster. Пытаюсь ограничить скорость, с которой моя программа считывает данные датчиков с моего устройства Android, которое использует сокеты для отправки данных через UDP-соединение. IE: Я создал это как небольшое приложение для лазерной путевой проволоки, и для начала я хотел увеличивать счетчик счетчика каждый раз, когда значение датчика опускается ниже определенного числа, указывая на сработавший лазер. Однако данные считываются так быстро, что счет увеличивается много раз каждый раз, когда уровень датчика падает ниже. Как я могу читать данные UDP только каждые X секунд?

2. Опишите, что вы пробовали - я пробовал time.sleep (), но, судя по тому, что я прочитал, это функция блокировки, и после тестирования она действительно не позволяет моей программе обновлять данные датчика через UDP. сокет - я пробовал использовать потоки, но не могу понять, как передавать данные датчика из одного потока в другой. - Я исследовал join (), но техническая документация, с которой я столкнулся, была не очень удобна для новичков. - В некоторых публикациях здесь рекомендуется настроить интерфейс клиент / сервер, но я тоже не знаю, как это сделать.

3. При необходимости покажите код. Вот мой текущий прогресс для многопоточного решения. Я использую приложение android под названием SensorUDP, и при включенном датчике внешней освещенности и активированной функции отправки данных эта программа будет считывать данные UDP и печатать их. даже без данных UDP он все равно будет запускать поток подсчета.

import socket
from struct import *
import time
import threading

#We have 0-92 over a 1024 byte buffer representing distinct
#sensors being sent over UDP from my android smartphone
#this test program im only pulling byte 56 for Ambient Light sensing
#a laser shining into my phones sensor has 30,000-50,000 lums so anything
#less then that range must mean the laser was tripped


#UDP = SOCK_DGRAM, AF_INET = Internet
UDP_IP = "192.168.1.149" #my rpi4 address
print "Receiver IP: ", UDP_IP
UDP_PORT = 5000 #arbitrary for now but needs to match my androids broadcast
print "Port: ", UDP_PORT
sock = socket.socket(socket.AF_INET, # Internet
                    socket.SOCK_DGRAM) # UDP
sock.bind((UDP_IP, UDP_PORT)) #complete the binding

running = True
count = 0
laserOn = 1000 #using a low lums to test so I dont have to use laser every time
aLight = 0
result_available = threading.Event() #.set() this when the data is recieved
threadTimer = 5

def calcAmbLight():

# Continuously read from the UDP socket

    while running:

        data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
        #the data from the app Im using to push the sensor data needs to
        #be unpacked
        aLight = "%.1f" %unpack_from ('!f', data, 56)
        print ("Ambient Light = ", aLight)

def displayCount():
    count = 0
    while running:
        time.sleep(1)
        #how to pass aLight into this thread from the other thread?
        if aLight < laserOn:
            count = count + 1

        print("Current aLight: ",aLight)
        print("Current Count: ", count)

if __name__ == '__main__':

    #create a basicthread to run calcAmbLight
    calcAmb = threading.Thread(target= calcAmbLight)
    calcAmb.start()

    dispCount = threading.Thread(target = displayCount)
    dispCount.start()

1 Ответ

1 голос
/ 27 мая 2020

Проблема с текущей настройкой связана с тем, что вы не объявляете aLight глобальным в calcAmbLight(). Объявление его как глобальной переменной должно позволить этому работать.

def calcAmbLight():
    global aLight  # Set the global aLight, instead of a local stack variable

    while running:

        data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
        #the data from the app Im using to push the sensor data needs to
        #be unpacked
        aLight = "%.1f" %unpack_from ('!f', data, 56)
        print ("Ambient Light = ", aLight)
...