darkleviathan
@darkleviathan

Как передать несколько условий elif переменной с одинаковыми значениями последовательно в python?

Изначально предполагается общение хоста с прибором, посредством ASCII символов.
Где сам протокол посылки состоит из запроса ENQ с хоста , ответа прибора ACK, отправки посылки с хоста STX, "TESTTEXT", ETX, CR, LF, ответа от прибора ACK и завершения сессии хостом EOT.

Сам код:

#!/usr/bin/python
import os
import time
import serial
import sqlite3
import requests
conn = sqlite3.connect("uart.db")
cursor = conn.cursor()

port = serial.Serial("/dev/ttyUSB0", baudrate=9600, timeout=1,bytesize=8,parity=serial.PARITY_NONE,stopbits=1)
print("go")
m=''
v=0
URL = "http://192.168.2.80/zxf.php?vx=uart-send"
x=1
while True:
   rcv = port.read(1)


   if rcv == '\x05':
       print ('send-05')

       port.write("\x06")
       print ("host-send-06\x06")

   elif rcv =='\x0A':
       print ('end-text')
       port.write("\x06")
       print ("host-send-06\x06")

   elif rcv == '\x04':
       print ('end-transmit')
       print(m)
       albums = [('insert',m)]
       cursor.executemany("INSERT INTO msg (P0,P1) VALUES (?,?)", albums)
       conn.commit()
       PARAMS ={'msg': m }
       r = requests.get(url=URL,params=PARAMS)
       m=''
       print (r.text)

#sending from host

   elif rcv == '\x06':
       print ("send-06\x06")
       port.write("\x02")
       port.write("text")
       port.write("\x03")
       port.write("D4")
       port.write("\0D\0A")
       print ("host-send-text")
       print ("wait-confirm")

   elif rcv == '\x15':
       print ("NAK - 15")
   else:
       m+=rcv

#    print('.'+rcv)


Интересует часть начиная с sending from host
Я прибору передаю символ \x05 и если получаю ответ \x06, начинаю отправку посылки (Начало текста , сам текст, конец текста, перевод каретки, и перевод строки).
После этого прибор возвращает хосту Подтверждаю! ACK
Вопрос звучит так:
Каким образом мне передать второй раз условие elif rcv == '\x06': в котором port.write будет иметь значение EOT? Это нужно делать только после получения подтверждения что на хост второй раз пришло ACK (\x06).

Я пробовал вариант делать time.sleep() или прописывать уже внутри elif условие if получаем \x06 true а если else то false.
И как бы я не старался все равно сначала отрабатывает код с хоста а после только приходит от прибора \x06.

PS: Заранее прошу не судить за возможно сумбурное объяснение проблемы и за корявый код.
  • Вопрос задан
  • 307 просмотров
Решения вопроса 1
origami1024
@origami1024
went out for a night walk
Создай переменную с состоянием коммуникации - на каком этапе сейчас общение и используй ее в условиях
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
29 нояб. 2024, в 09:43
100000 руб./за проект
29 нояб. 2024, в 07:44
20000 руб./за проект