Проблемы при передача данных по COM порту
Всем привет! Решил написать программку которая передаёт координаты мышки через com порт на внешнею плату, к которой в свою очередь подключена мышка. Всё бы ничего, НО мой основной код передаёт те же данные что и проверочный, однако в случае основного кода, курсор мышки по итогу оказывается в положении нуля, то есть в левом нижнем углу экрана, в случае проверочного кода, курсор перемещается в соответствии с переданными ему на плату и потом в мыш координатами. И я в замешательстве, потому что оба кода предают одни и те же правильные данные. Но в случае с проверочным кодом всё хорошо а в случае с моим нет.
Мой код:
global Cy2
global Cx2
def com_write ():
ser = serial.Serial("COM7", 9600)
while True:
if keyboard.is_pressed('shift'):
continue
coordinates = f"{int(Cx2)},{int(Cy2)}\n"
ser.write(coordinates.encode())
ser.close()
break
def process_screen():
global Cy2
global Cx2
with mss.mss() as sct:
monitor = {"top": 430, "left": 630, "width": 660, "height": 430}
while True:
last_time = time.time()
img = np.array(sct.grab(monitor))[:, :, :3]
predict = model(img, conf=0.50)
for r in predict:
boxes = r.boxes
for box in boxes:
x1, y1, width, height = box.xyxy[0]
x1, y1, width, height = int(x1), int(y1), int(width), int(height)
Cx = (x1 + width) / 2
Cy = (y1 + height) / 2
Cy2 = Cy - -400
Cx2 = Cx - -630
if Cx2 != 0 and Cy2 != 0:
com_write()
break
print(f"fps: {1 / (time.time() - last_time)}")
process_screen()
Проверочный код:
def com_write():
while True:
if keyboard.is_pressed('shift'):
continue
ser = serial.Serial("COM7", 9600)
random_x = random.randint(0, 1920)
random_y = random.randint(0, 1080)
coordinates = f"{random_x},{random_y}\n"
encoded_coordinates = coordinates.encode()
ser.write(coordinates.encode())
ser.close()
print(f"Sent: {coordinates}, Encoded: {encoded_coordinates}")
time.sleep(1)
com_write()
Я пробовал вынести открытие порта из функции(com_write ()) (в основную функцию (process_screen()) за цикл for, не помогло.
Так же была попытка передавать "сырые" координаты сразу из переменных x1, y1, но это так же не помогло. Под сырыми данными имеется в виду координаты не изменённые в результате пересчёта по мат формуле...
Добавление проверки:
if Cx2 != 0 and Cy2 != 0:
com_write()
Не сработало.
Использование задержки при передаче в порт не помогло. В чём ещё может быть проблема я уже теперь вообще без понятия :(
P.S.
Запись с двумя минусами:
Cy2 = Cy - -400
Cx2 = Cx - -630
В моём случае является приемлемой поскольку решает кое какую ошибку...
А почему бы не передавать координаты как параметры функции? А если вычесть отрицательное число, то это ж вроде как можно заменить на операцию сложения?
Интересный цикл:
while True:
...
break
а что лежит в box.xyxy[0] ? может, там какие-нибудь 0.003, которые превращаются в ноль.
и, наверно, было бы любопытно глянуть, что именно лежит в Cx2 и Cy2 перед записью в порт