Python сокет: попытка получить новое TCP-сообщение в течение цикла - PullRequest
0 голосов
/ 24 февраля 2020

Надеюсь, у всех дела идут хорошо.

У меня есть проблема, которую я давно пытаюсь решить, но безуспешно ... У меня есть эта функция, которая прослушивает команды, посылаемые нажатием различных кнопок на сайт. Получив команду, он отправляет ее дальше по последовательному порту:

def write(self):

    while self.alive:

        try:

             data = self.socket.recv(1024)

             print('Data received through TCP: ' + str(data))
             recvdStr = data.decode('UTF-8')

             if not data:
                 break

             self.serial.write(recvdString.encode('utf-8'))
             print('Data sent through serial: ' +str(recvdStr))

    self.alive = False
    self.thread_read.join()

. Вышеописанное работает как задумано ...

Я сейчас пытаюсь расширить эту функцию, чтобы, когда она получая указанную c команду от этого веб-сайта, он выполняет заданную c часть функции (продолжая при этом прослушивать сокет), пока не получит другую команду, сообщающую этой части функции об остановке и возвращении к простому прослушиванию и пересылке ( как показано в коде выше).

Способ, которым я пытался реализовать его, можно увидеть здесь:

def write(self):

    while self.alive:

        try:

             data = self.socket.recv(1024)

             print('Data received through TCP: ' + str(data))
             recvdStr = data.decode('UTF-8')

             if data == b'start':

                 self.serial.write(data.encode('utf-8'))

                 while True:

                     newData = self.socket.recv(1024)

                     newMessage = 'works'
                     self.serial.write(newMessage.encode('utf-8'))
                     time.sleep(0.5)

                     if newData == b'stop':
                          break

             if not data:
                 break

             self.serial.write(recvdString.encode('utf-8'))
             print('Data sent through serial: ' +str(recvdStr))

    self.alive = False
    self.thread_read.join()

Вид поведения, который я получаю из вышесказанного, заключается в том, что когда он получает сообщение «пуск», которое неоднократно отправляет сообщение «newMessage» по последовательному порту (как и предполагалось), но когда я нажимаю на моем веб-сайте кнопку, которая отправляет сообщение «стоп», функция не получает его, а «newMessage» все еще отправляется.

Я хотел бы остановить это l oop, как только будет получено сообщение "Стоп", и вернуться к нормальной работе ...

Любая помощь был бы очень признателен.

Спасибо,

Роб

...