Как я могу читать и записывать в последовательный буфер в том же скрипте Python? - PullRequest
1 голос
/ 01 апреля 2019

У меня проблемы с пониманием того, как работает последовательный порт.

Я пытаюсь написать зацикленный скрипт, который генерирует код на Python, считывает последовательный буфер для шестизначного кода, введенного в клавиатуру Arduino, отправляет его обратно на Python, проверяет его на соответствие коду в базе данных postgreSQL и возвращает значение (1 для совпадения и 0 для отсутствия совпадения). Я хочу отправить двоичное значение в Arduino и вызвать линейный сервопривод. Когда я запускаю цикл Python, который я написал, он функционирует так, как я ожидал, пока не доберусь до значения, возвращенного из базы данных SQL. Кажется, значение не записывается в последовательный буфер, поэтому цикл Arduino никогда не запускает линейный сервопривод. Для простоты тестирования я генерирую код для клавиатуры локально при каждом запуске цикла.

Сначала я использовал функцию keypad.h waitForKey (), которая блокирует. Я думал, что блокировка не позволяет петле Arduino регистрировать обновленное значение и работать с сервоприводом. Я изменил его на getKey (), но функция все еще не работает. Я пробовал разные методы кодирования и записи разных типов данных (символов и цифр), но, похоже, ничего не работает.

Вот наиболее релевантный раздел кода Python:

if (txStage == '0'):
        #genCode = search_ChatValue("access_code","demo") #Find the value in the database table
        time.sleep(10)
        while (ser.inWaiting() > 0):
            codeDigit = ser.readline(9)
            codeDigit = codeDigit.decode()
            codeDigit = codeDigit[0:6]
        ser.flush()
        print(codeDigit)
        attemptCode(codeDigit, "demo") #check the entered code against the database code
        doorVer = codeResult("demo") #Check if the code was correct
        print(doorVer)
        if (doorVer == "Success! You may now access your SafeDrop."): #if the code is correct
            lockVer = '1' #variable to be sent to the Arduino
            print("lock status is: " + str(lockVer))
            ser.flush() #flush the serial buffer to ensure it is empty
            lockVer = lockVer.encode("utf-8")
            ser.write(lockVer) #write to Arduino
            time.sleep(10) #wait for lock to open
        #time.sleep(5)

Вот код Arduino:

void loop(){
  char pass[6]; 
  char lockVer = '0';
  int sensorValue = analogRead(A0);
  Door(sensorValue);
  door = warning;
  if (Serial.available() > 0){
    lockVer = Serial.read();
  }
  if (lockVer == '0'){
    while (door == 0){
        while (i < 6){
          char key = customKeypad.getKey();
          if (key){
            pass[i] = key;
            lcd.write('*');
            i++;
            if (i == 6){
              delay(500);
              lcd.clear();
              i = 0;
            }
           }
           Serial.println(pass);
           Serial.flush();
        }
      //delay(5000);
      //scaleCheck;
    }
  }
  else{
    Lock(unlock);
    delay(5000);
    Lock(lock);
    delay(5000);
    }
  }

Я надеюсь, что переменная lockVer изменится с 0 на 1, и это изменение будет идентифицировано Arduino, в результате чего линейный сервопривод активируется и переместится в положение разблокировки, подождет 5 секунд и вернется к заблокированному позиция. Вместо этого код Arduino игнорирует изменение и продолжает искать ввод с клавиатуры. Подтверждено, что код клавиатуры работает, а переменная lockVer в Python меняется с 0 на 1, но не в Arduino.

Я могу опубликовать оставшуюся часть кода, если кому-то понадобится больше контекста, но у меня заканчиваются попытки попробовать, и я был бы очень признателен за помощь. Спасибо!

1 Ответ

0 голосов
/ 03 апреля 2019

похоже, что ваш код arduino застревает в цикле while (door == 0). Измените это на условие if, и ваш код должен работать как задумано

...