Скрипт Python не может подключиться к последовательному порту

Я хочу управлять светодиодами рукой, для этого я использовал репозиторий https://github.com/paveldat /finger_counter/tree/main. Хочу управлять светодиодами рукой, для этого воспользовался репозиторием. Для подключения к последовательному порту Arduino Mega я использую библиотеку pyserial, вот код, которому я передаю переменные.

arduinoData = serial.Serial("com9", 9600)
arduinoData.write(bytes(str(variable), "utf-8"))

для управления светодиодами и обработки данных из последовательного порта я написал в Arduino IDE следующий код:

void setup() {
  Serial.begin(9600);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop() {
/*
  if (Serial.available() > 0){
    serialData = Serial.read();

    for (int i = 3; i<serialData; i++){
      digitalWrite(i, HIGH);
    }
    }
*/
  if (Serial.available() > 0){
    char serialData = Serial.read();
    if (serialData == '3'){
      digitalWrite(3, HIGH);
      }
    else if (serialData == '4'){
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      }
    else if (serialData == '5'){
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      }
    else if (serialData == '6'){
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      }
    else if (serialData == '7'){
      digitalWrite(3, HIGH);
      digitalWrite(4, HIGH);
      digitalWrite(5, HIGH);
      digitalWrite(6, HIGH);
      digitalWrite(7, HIGH);
      }
    else if (serialData == '0'){
      digitalWrite(3, LOW);
      digitalWrite(4, LOW);
      digitalWrite(5, LOW);
      digitalWrite(6, LOW);
      digitalWrite(7, LOW);
      }
      
    
    //Serial.println(serialData);
    //digitalWrite(serialData, HIGH);
    //задержка(1000);
  }
}

Когда я запускаю этот код без подключения камеры и просто передаю значения в последовательный порт, то все работает. Однако когда я пытаюсь запустить этот код вместе с камерой, возникает следующая ошибка:

serial.serialutil.SerialException: could not open port 'com9': PermissionError(13, 'Access denied.', None, 5)

Камера представляет собой веб-камеру ноутбука. Я не проверял код с USB-камерой, предполагается, что USB-камера не будет занимать все последовательные порты.

, 👍0

Обсуждение

Какую операционную систему вы используете? Вы уверены, что «com9» — правильный порт, особенно когда подключена камера? (поскольку это может измениться) Можете ли вы подключить камеру, а затем открыть порт в Arduino IDE?, @chrisl

Существует вероятность того, что вы _также_ открыли последовательный монитор Arduino IDE при подключении USB-камеры. Это может показаться несвязанным, но последовательный монитор блокирует использование COM-порта другими программами во время его работы., @orithena

когда я тестировал код, моя IDE была практически закрыта @orthena, @Дмитрий Насонов

Я использую windows 10 при включении камеры в диспетчере устройств, а также до того, как COM9 будет занят ардуино мега @chrisl, @Дмитрий Насонов

Если с одной частью все работает нормально, а с другой нет, возможно, обе части пытаются использовать одни и те же ресурсы, или ваш старый запуск все еще использует порт и не был уничтожен. Завершите свой кусок Python вызовом выхода или просто del arduinoData, @Abel


1 ответ


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

0

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

import cv2
import time
import os
import serial
import HandTrackingModule as htm

wCam, hCam = 640, 480

cap = cv2.VideoCapture(0)
cap.set(3, wCam)
cap.set(4, hCam)


folderPath = "fingers" # name of the folder, where there are images of fingers
fingerList = os.listdir(folderPath) # list of image titles in 'fingers' folder
overlayList = []
for imgPath in fingerList:
    image = cv2.imread(f'{folderPath}/{imgPath}')
    overlayList.append(image)


pTime = 0

detector = htm.handDetector(detectionCon=0.75)
totalFingers = 0

def arduino_write(totalFingers):
    arduinoData = serial.Serial("com9", 9600)
    arduinoData.write(bytes(str(totalFingers+2)+"\n", "utf-8"))
    arduinoData.close()

while True:
    sucess, img = cap.read()
    img = cv2.flip(img, 1)

    img = detector.findHands(img)
    lmList, bbox = detector.findPosition(img, draw=False)

    if lmList:
        fingersUp = detector.fingersUp()
        totalFingers = fingersUp.count(1)

    h, w, c = overlayList[totalFingers].shape
    img[0:h, 0:w] = overlayList[totalFingers]

    cTime = time.time()
    fps = 1/ (cTime-pTime)
    pTime = cTime

    cv2.putText(img, f'FPS: {int(fps)}', (400, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 0), 3)
    cv2.rectangle(img, (20, 225), (170, 425), (0, 255, 0), cv2.FILLED)
    cv2.putText(img, str(totalFingers), (45, 375), cv2.FONT_HERSHEY_PLAIN, 10, (255, 0, 0), 25)

    arduino_write(totalFingers)
      
    cv2.imshow("Image", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break


cap.release()
cv2.destroyAllWindows()
,