Я новичок в Arduino (и компьютерное программирование в целом), поэтому я прошу прощения, если этот вопрос выглядит глупо.
После того, как я установил основное соединение Arduino-LED, у меня возникают проблемы с отправкой INTEGERS в Arduino через последовательный порт. Я могу легко отправлять такие символы, как «m», «o» и т. Д. Однако, если я отправлю число, то, похоже, оно просто не получит его.
Вот код Arduino, в идеале он должен получить значение от порта USB через Python или последовательный монитор, а затем отрегулировать яркость светодиода в соответствии со значением. (значение должно быть в диапазоне [0,255]).
ПРИМЕЧАНИЕ: я использую ARDUINO UNO и PYTHON 3
// --------------------------
int LED = 10;
int number;
void setup(){
pinMode(LED,OUTPUT);
Serial.begin(9600);
}
void loop(){
number = Serial.read();
Serial.print(number);
Serial.print('\n');
if(number == -1){
number = 0;
}
else if(number > 255){
number = 255;
}
else if(number < 0){
number = 0;
}
analogWrite(LED,number);
delay(1000);
}
Однако, когда я ввожу значение в последовательный порт или через Python, например, 0, он дает мне 48 в качестве ответа (что, что интересно, является кодом ASCII для 0!) И загорается светодиод, который не должен происходить, так как в 0 светодиод должен быть выключен !! Я что-то упускаю, но я не могу найти что ... Не могли бы вы сказать мне, что не так?
Вот код, который я использую в Python:
import serial
import time
try:
arduino = serial.Serial(port,speed)
time.sleep(2)
print("Connection to " + port + " established succesfully!\n")
except Exception as e:
print(e)
#Note: for characters such as 'a' I set data = b'a' to convert the data in bytes
#However the same thing does not work with numbers...
data = 0
data = arduino.write(valueToWrite)
time.sleep(2)
arduino.close()
что я делаю не так или недоразумение? Спасибо.
источник
arduino.write(chr(valueToWrite))
Ответы:
Разбор в Arduino может быть медленным и занимать много времени (что плохо, если вы используете предварительное масштабирование часов или у вас есть срочные задачи), поэтому давайте сделаем это в Python.
Проблема в том, что вы отправляете числа как ASCII, тогда как вам нужно отправлять их как необработанный двоичный файл. Это где
struct
приходит.Итак, что вы действительно хотите:
Или что-то в этом роде.
источник
Serial.read()
читает только ОДИН символ из последовательного порта и возвращает его значение ASCII, которое объясняет, что48
вы получили.Чтобы прочитать полное число, у вас есть 2 варианта:
Serial.parseInt()
который читает столько символов, сколько необходимо, и выполняет преобразование перед возвратом прочитанного числа в видеint
. Пожалуйста, дополнительно проверьте ссылку здесь.Serial.read()
) до последнего, поместить каждый чтения charcater в буфер (char
массив) , а затем преобразовать полученную строку в число со стандартной функцией Catoi
.Конечно, первый вариант самый простой, но он вернется,
0
если ничего не будет прочитано после тайм-аута 1 с (настраивается с помощьюSerial.setTimeout()
).источник