Запустите основную функцию и функцию приема одновременно

#python #android #bluetooth #python-asyncio #pyserial

Вопрос:

В настоящее время я работаю с подключением Bluetooth к raspberry pi4 и использую свое устройство Android. У меня есть две функции, одна из которых является основной, а другая-асинхронная функция, известная как receive с двумя аргументами reader и writer. Эта асинхронная функция подключается к устройству Bluetooth, такому как мой телефон Android, где я могу получать и отправлять сообщения на свой raspberry pi 4. Ниже я показал свой код для моей асинхронной функции и моей основной функции.

 async def receive(reader, writer):
   global led_on
   global TamperEvents
   global Threshold

   minnum = str(5000)
   byte_val_min = minnum.encode()

   maxnum = str(10000)
   byte_val_max = maxnum.encode()

   try:  
      while True:
        
         writer.write(b"Commands for Bluetooth Connectivityn")
         writer.write(b"1. led onn")
         writer.write(b"2. led offn")
         writer.write(b"3. clearn")
         writer.write(b"4. readn")
         writer.write(b"5. threshn" )
        
         data = await reader.readuntil(b'n')
         status = data.strip().decode()
        
         if (status == "led on"):
            writer.write(b'LED is now enabledn')
            led_on = 1
            
        elif (status == "led off"):
            writer.write(b'LED is now disabledn')
            led_on = 0
        
        elif (status == "clear"):
            writer.write(b'Tamper event count has been clearedn')
            TamperEvents = 0
            
        elif (status == "thresh"):
            value = ""
            writer.write(b"Set a new Threshold : ")
            adxlthresh = await reader.readuntil(b'n')
            print(adxlthresh)
            val = int.from_bytes(adxlthresh, "little")
            print(val)
            if adxlthresh <= byte_val_min:
                Threshold = 5000
            elif adxlthresh >= byte_val_max:
                Threshold = 10000
            else:
               Threshold = 10000
            writer.write(b'ADXL threshold has been set to: %d' % Threshold)
        
        elif (status == "read"):
            writer.write(b"Intrusion Count = %dn" % TamperEvents)
            writer.write(b"Threshold Setting = %dn" % Threshold)
            writer.write(b"LED enable = %dn" % led_on)
         
        else:
            writer.write("unknown command receivedn" )

except KeyboardInterrupt:
    sys.exit(0)

async def main(port, baudrate):
   global led_on
   global halleffect
   global TamperEvents
   
   #Settling values for the HallSensor
   calibrateHallSensor()


   #Settling values for the LIS3DH
   calibrate_Axes()

   reader, writer = await serial_asyncio.open_serial_connection(url=port, baudrate=baudrate)

   receiver = receive(reader, writer)

   await asyncio.wait(([receiver]))

   while True:
    
        #continuous update on the write and read byte data for x,y,z, ADC raw readings 
        adc_Raw_Data()
    
        #Coninuous update on the write and read byte data for hallsensor readings
        hallSensor()
    
        #Calculate how far the real-time reading is from the calibration point.
        x = abs(xAccl - xcal)
        y = abs(yAccl - ycal)
        z = abs(zAccl - zcal)
    
        #If any axis exceeds the threshold trigger alert
        if (x > Threshold or y > Threshold or z > Threshold):
            if (senseTilt()==0):
                TamperEvents =1
                print("Motion Trigger: x=%d, y=%d, z=%d" % (x,y,z))
                if (led_on):
                    blinkLED(.2)
            calibrate_Axes()
    
        #If hall sensor value exceeds the threshold trigger alert
        halleffect = abs(PinA1 - calhall)
        if ((halleffect > Upper_Hall_Threshold) or (halleffect < Lower_Hall_Threshold)):
             tamperCountHallSensor(TamperEvents)
    
        #wait 10ms between each sampling of the LIS3DH
        time.sleep(.01)
if __name__ == '__main__':

    port = sys.argv[1]
    baudrate = sys.argv[2]

    loop = asyncio.get_event_loop()
    loop.run_until_complete(main(port, baudrate))
    loop.close()
 

Проблема, с которой я сталкиваюсь с моим кодом, связана с функцией подключения Bluetooth receive. Где один раз эта функция вызывается в моей основной функции и используется строка await asyncio.wait([приемник]). Больше ничего не работает, в этот момент он застревает, и я хочу иметь возможность запускать эту программу, когда одновременно работают и подключение по Bluetooth, и моя основная функция. Таким образом, пользователь может в любое время ввести любое сообщение с устройства Bluetooth, а также увидеть другие результаты. Есть ли другой способ использовать эту строку, чтобы пользователь мог вводить данные в любое время?