У меня проблемы с пониманием того, как работает последовательный порт.
Я пытаюсь написать зацикленный скрипт, который генерирует код на 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.
Я могу опубликовать оставшуюся часть кода, если кому-то понадобится больше контекста, но у меня заканчиваются попытки попробовать, и я был бы очень признателен за помощь. Спасибо!