Добрый день! Пишу визуализатор данных с трехосевого гироскопа. Данные поступают по COM порту в формате *.CSV. (Поток состоит из подобных строк: 'b'0.00,1.22,0.00\n'). Для вытаскивания данных использую библиотеку re. Для работы с COM портом PySerial. Все подключается. Но есть одна проблема: при повторном срабатывании скрипта - микроконтроллер перезагружается и blender тормозит. Итого выходит, что на полторы-две секунды перезагрузки 300мсек сбора данных. Не очень похоже на RealTime систему визуализации. Цикл While - Blender Не переваривает и просто отказывается визуализировать. Цикл for - визуализирует только последнее значение. s.isOpen() - определяется только после s = serial.Serial('COM1', 9600) А мне надо как-то один раз только открыть последовательный порт. Может кто подскажет как можно глобально открыть-закрыть порт. и локально работать с данными в Blenderе или как python скрипт исправить? Работаю на Arduino MEGA 2560, пробовал отключить автоперезагрузку (100 ОМ между RESET и 5V), но пока не получилось. Код (Python): import bge import serial import re import time cont = bge.logic.getCurrentController() # получить текущий контролер obj = cont.owner # получить выделенный объект s = serial.Serial('COM1', 9600) left = cont.sensors["left"] m = [0, 1, 2, 3, 4, 5, 6 , 7, 8, 9] line2 = ['1', '1', '1', '1', '1', '1', '1' , '1', '1', '1'] for i in range(2): m[i] = s.readline() for i in range(2): line2[i] = str(m[i]) for i in range(2): sp = re.split('[^0-9.]+', line2[i]) x = float(sp[1]) obj["line_1"] = x obj.applyRotation([x,0,0],True) https://yadi.sk/d/J0VdidB132yhkL Объект Test1. Плитка.
Если я правильно понял вам надо выполнять какие-то действия в функциях.... Код (Python): import bge import serial import re import time cont = bge.logic.getCurrentController() # получить текущий контролер obj = cont.owner # получить выделенный объект s = serial.Serial('COM1', 9600) left = cont.sensors["left"] m = [0, 1, 2, 3, 4, 5, 6 , 7, 8, 9] line2 = ['1', '1', '1', '1', '1', '1', '1' , '1', '1', '1'] #ваша функция def Func(): global s global m for i in range(2): m[i] = s.readline() #вызываем функцию Func() Вызов функции, где применяются глобальные переменные я правильно понял? Спасибо!
я не понимаю как её перерезать, в интернете про это только словами написано. где это находится - я нашел на плате меги. Но там просто две полоски, Можете подсказать?
Тогда она постоянно будет вызываться, скрипт прошел. После этого блендер абсолютно забывает, что делал ДО этого. И снова день сурка. А проблема в том, что при открытии порта - ардуино перезагружается, из-за чего блендер тупит жутко.
Извиняюсь что не по теме, но это ужасно, зачем 3 цикла? Можно спокойно убрать 2 цикла и вообще не понятно зачем нужны массивы m, line2 Код (Python): import bge import serial import re import time cont = bge.logic.getCurrentController() # получить текущий контролер obj = cont.owner # получить выделенный объект s = serial.Serial('COM1', 9600) left = cont.sensors["left"] m = [0, 1, 2, 3, 4, 5, 6 , 7, 8, 9] line2 = ['1', '1', '1', '1', '1', '1', '1' , '1', '1', '1'] for i in range(2): m[i] = s.readline() line2[i] = str(m[i]) sp = re.split('[^0-9.]+', line2[i]) x = float(sp[1]) obj["line_1"] = x obj.applyRotation([x,0,0],True)
А можно просто сделать вот так и не особо что-то изменится Код (Python): import bge import serial import re import time cont = bge.logic.getCurrentController() # получить текущий контролер obj = cont.owner # получить выделенный объект s = serial.Serial('COM1', 9600) left = cont.sensors["left"] m = [ i for i in range(10)] line2 = [ 1 for i in range(10)] for i in range(2): sp = re.split('[^0-9.]+', str(s.readline())) x = float(sp[1]) obj["line_1"] = x obj.applyRotation([x,0,0],True)