Top.Mail.Ru
Ответы

Проблемы при передача данных по COM порту

Всем привет! Решил написать программку которая передаёт координаты мышки через com порт на внешнею плату, к которой в свою очередь подключена мышка. Всё бы ничего, НО мой основной код передаёт те же данные что и проверочный, однако в случае основного кода, курсор мышки по итогу оказывается в положении нуля, то есть в левом нижнем углу экрана, в случае проверочного кода, курсор перемещается в соответствии с переданными ему на плату и потом в мыш координатами. И я в замешательстве, потому что оба кода предают одни и те же правильные данные. Но в случае с проверочным кодом всё хорошо а в случае с моим нет.

Мой код:


123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
 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()   


Проверочный код:


123456789101112131415161718192021
 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, но это так же не помогло. Под сырыми данными имеется в виду координаты не изменённые в результате пересчёта по мат формуле...

Добавление проверки:

12
 if Cx2 != 0 and Cy2 != 0: 
    com_write() 

Не сработало.

Использование задержки при передаче в порт не помогло. В чём ещё может быть проблема я уже теперь вообще без понятия :(

P.S.

Запись с двумя минусами:

12
 Cy2 = Cy - -400 
Cx2 = Cx - -630 

В моём случае является приемлемой поскольку решает кое какую ошибку...

По дате
По рейтингу
Аватар пользователя
Мастер

А почему бы не передавать координаты как параметры функции? А если вычесть отрицательное число, то это ж вроде как можно заменить на операцию сложения?
Интересный цикл:

123
 while True:
  ...
  break 
Аватар пользователя
Искусственный Интеллект

а что лежит в box.xyxy[0] ? может, там какие-нибудь 0.003, которые превращаются в ноль.

и, наверно, было бы любопытно глянуть, что именно лежит в Cx2 и Cy2 перед записью в порт