Python - чтение последовательных данных, отправленных STM

1

Я создал соединение с python с портом usb stm32 и хотел выполнить некоторые действия, пока нажата определенная кнопка. (один передает "1", а другой передает "0"). Почему это решение не работает так, как я хотел?

def read():
while True:
    if ser.read(1) == 0:
            print "Zero received" 
            report.send(SET_LEFT())
    if ser.read(1) == 1:
            report.send(SET_RIGHT())
t = threading.Thread(target = read, name = 'thread1')
t.start()

Ниже приведена последовательность инициализации и функция signal_handler, которые закрывают соединение с портом.

ser = serial.Serial(
    port='COM7',
    baudrate=9600,
    parity=serial.PARITY_EVEN,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=0)


def signal_handler(signal, frame):
       ser.close()
       sys.exit(0)
signal.signal(signal.SIGINT, signal_handler)

Ошибка, которую я получаю, когда я закрываю соединение с "crtl + c",

Exception in thread thread1:
Traceback (most recent call last):
File "C:\Python27\lib\threading.py", line 801, in __bootstrap_inner
self.run()
File "C:\Python27\lib\threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "C:\usbpy\usb_send.py", line 27, in read
if ser.read() == 0:
File "C:\Python27\lib\site-packages\serial\serialwin32.py", line 269, in 
read
win32.ResetEvent(self._overlapped_read.hEvent)
AttributeError: 'NoneType' object has no attribute 'hEvent'

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

С уважением

  • 0
    Не могли бы вы рассказать о том, как не работать? Одна вещь, которая приходит на ум от ставки: если это read чем-то похоже на другие методы read , оно даст str (или bytes ) и, следовательно, всегда будет давать False тестирование эквивалентности с int .
  • 0
    Данные, которые я передаю с помощью кнопок stm32f4, имеют битовое значение «0» и «1». Вот иллюстрация данных, полученных через порт COM7 и отображаемых в python. ссылка Когда я получаю «0» или «1», я хочу выполнить функцию SET_LEFT или SET_RIGHT. Под неработающим я подразумеваю ссылку - она не обнаруживает данные, полученные через порт COM7 - «True» означает, что многопоточность включена.
Показать ещё 2 комментария
Теги:
serial-port

2 ответа

0
Лучший ответ

Я создал две переменные:

flag_1 = 0
flag_2 = 0

Если нажата кнопка im, изменяющая значение флагов:

def read():

    while True:
        global flaga_1
        global flaga_2
        a=ser.read()
        if a == '0':
                flaga_1 = 1
        elif a == '1':
                flaga_2 = 1

t = threading.Thread(target = read, name = 'thread1')
t.start()

и во время цикла im обнаруживает изменение значения флага - выполняет функцию и устанавливает значение флагов обратно на "0",

if flaga_1 == 1:
          report.send(SET_LEFT())
          flaga_1 = 0

elif flaga_2 == 1:
          report.send(SET_RIGHT())
          flaga_2 = 0
1

Если вам больше не нужна ваша функция чтения. Значение ser.read(1) должно храниться в переменной, потому что вам нужно сделать несколько сравнений с данными, полученными в этом одном вызове, - как вы его закодировали, если первое сравнение с 1 является ложным другим ser.read(1 ) (т.е. разные dat) производится и сравнивается с 0, а также не имеет ввода, хранящегося в переменной, потому что вы не можете отлаживать его, например, путем печати полученного значения. Не понимаю, почему попытка отладки не заставила вас сохранить возвращаемое значение ser.read(1) в переменной, чтобы вы могли его распечатать.

К сожалению не могу проверить этот код, но он должен выглядеть примерно так:

def read() while True: Thisinput = ser.read(1) print "received",Thisinput if Thisinput == '0:... elif Thisinput == '1:... else: print 'Input not recognized:%s%(input) raise Exception("Invalid input %s"%(Thisinput) )

Ещё вопросы

Сообщество Overcoder
Наверх
Меню