Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2022, 15:11   #1
Polzovatel55
Новичок
Джуниор
 
Регистрация: 12.10.2022
Сообщений: 1
Плохо Поочередный запуск функции, библиотека serial, threading, Semaphore

Добрый день. Есть контроллер arduino и web интерфейс на raspberry pi. Arduino и raspberry соеденены кабелем usb и общаются по serial протоколу. Задача: что бы несколько модулей (python скриптов) умного дома могли отправлять на arduino команды по serial и получать в замен состояния выводов используя функцию check() в файле interaction.py.
Тестовый файл для отправки и получения данных используя функцию check():

test.py
Код:
#/usr/python3
 
import time
 
from interaction import check
 
act = 'Some parameter' 
 
while True:
    data= check(act) 
    print (data)
Скрипт с функцией отправки и получения данных от arduino:
Код:
#/usr/python3
 
import time
 
import serial
 
ser = serial.Serial("/dev/ttyUSB0")
ser.baudrate = 115200
time.sleep(1)
  
def check(act):
    data = bytes(act, encoding='utf-8')
    ser.write(data)   
    ser.write(b' check;')
    val= ser.read(size=677)       
    val=(str(val))        
    val= val.strip("b'")
    return val
Если запустить тестовый скрипт test.py то получим ответ:

>>>
Код:
root@smarthome:~# python3 /SmartHome/test.py
<inputs><p0>1</p0><p1>0</p1><p2>1</p2><p3>1</p3><p4>1</p4><p5>1</p5><p6>1</p6><p7>1</p7>
<p8>1</p8><p9>1</p9><p10>1</p10><p11>1</p11><p12>1</p12><p13>1</p13><p14>0</p14><p15>1</p15>
<p16>1</p16><p17>1</p17><p18>0</p18><p19>0</p19><p20>0</p20><p21>0</p21><p22>0</p22><p23>1</p23>
<p24>1</p24><p25>0</p25><p26>1</p26><p27>0</p27><p28>0</p28><p29>0</p29><pin30>0</pin30>
<pin31>0</pin31><pin32>0</pin32><pin33>0</pin33><pin34>0</pin34><pin35>0</pin35><pin36>0</pin36>
<pin37>0</pin37><pin38>0</pin38><pin39>0</pin39><pin40>0</pin40><pin41>0</pin41><pin42>0</pin42>
<pin43>0</pin43><pin44>0</pin44><pin45>0</pin45><pin46>0</pin46><pin47>0</pin47><pin48>0</pin48>
<pin49>0</pin49></inputs>pin44>0</pin44><pin45>0</pin45><pin46>0</pin46><pin47>0</pin47><pin48>0</pin48>
<pin49>0</pin49></inputs>
Но если запустить параллельный test.py возвращается ошибка:
Код:
    raise SerialException(
serial.serialutil.SerialException: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
Из вывода ошибки я понял, что библиотека serial позволяет использовать com порт только одному процессу. Я пытался решить эту проблему записывая передаваемые и получаемы данные в txt файл. Разные скрипты взаимодействовали с interaction.py через эти txt файлы. Но данный спосб по моему мнению из за частых перезаписей в файл, через неделю вышла из строя флешка raspberry pi.
Я пришел к выводу, что нужен способ запуска функции check() разными потоками по очереди. В интернете нашел способ использования ресурсов с малой емкостью threading.Semaphore().
intraction.py с библиотекой threading.Semaphore():

intraction.py
Код:
#/usr/python3
 
import time
 
import serial
from threading import  BoundedSemaphore, Thread
 
max_connections = 1
pool = BoundedSemaphore(value=max_connections)
 
ser = serial.Serial("/dev/ttyUSB0")
ser.baudrate = 115200
time.sleep(1)
 
def check(act):
    pool.acquire()
    data = bytes(act, encoding='utf-8')
    ser.write(data)   
    ser.write(b' check;')
    val= ser.read(size=677)       
    val=(str(val))        
    val= val.strip("b'")
    return val 
    pool.release()
 
Thread (target = check(act)).start()
В данной конструкции мне не понятно как запускать функцию check с параметром act из других скриптов(test.py например), а также как возвращать значение переменной val. Прошу совета у экспертного сообщества.
Polzovatel55 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отловить ошибку System.Threading.ThreadAbortExcepti on Sizova C# (си шарп) 8 12.04.2017 15:34
Semaphore init failed. Stilet Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 0 21.04.2013 13:38
Delphi Mutex Semaphore CS bugiman Помощь студентам 0 07.06.2012 21:11
Библиотека VCL и математические функции. pulcher C++ Builder 2 06.11.2011 13:14