Вообщем нужно,чтобы ардуина принимала два байта - шестнадцатиричное представление числа и преобразовывала в байт, но получается не ожидаемый результат. Код (C++): byte data1,data2; byte data; void setup() { Serial.begin(9600); } void loop() { if (Serial.available() == 2){ data = 0; data1 = byte(Serial.read()); Serial.print(data1);//Вывод кода 1 символа Serial.print(" "); data2 = byte(Serial.read()); Serial.print(data2);//Вывод кода 2 символа Serial.print(" "); if ((48 >= data1) && (data1 <= 57)) data = (data1-48)*16; else if ((97 >= data1) && (data1 <= 102)) data = (data1-87)*16; //if (48 >= data2 <= 57) data += (data2-48); //else if (97 >= data2 <= 102) data += (data2-97+10); Serial.print((data1-48)*16);//Теоретический вывод зачения Serial.print(" "); Serial.println(data);//Фактический вывод значения } } Если поменять тип переменной data на int, то получается тоже не ожидаемый результат! Помогите!! Похоже, что происходит переполнение переменной
Ардуина принимает байты в виде комбинации "0" и "1", а HEX или DEC - это для визуальности. Что пользователь вкладывает в значение этого байта - вопрос пользователя. Т.е., байт принимается и с этим байтом надо что-то сделать... А что и как - решает пользователь. Разберитесь со своей арифметикой или прокомментируйте код, чтоб стал понятен ход вашей мысли. Зачастую именно при выполнении второго приходит озарение...
Вот. Первое число - код первого символа. Второе число - код второго символа (это пока ненужно). Третье число - результат вычисления выражение. Четвёртое - значение байта. 48 48 0 0 49 49 16 160 50 50 32 176 51 51 48 192 52 52 64 208 53 53 80 224 54 54 96 240 55 55 112 0 56 56 128 16 57 57 144 32 97 97 784 160 98 98 800 0 99 99 816 0 100 100 832 0 101 101 848 0 102 102 864 0 Ввод: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff
Вводим два знака - 0-1,a-f - то есть как бы в шестнадцатиричной системе счисления. Считываем и получаем 2 байта - коды введённых символов.Берём код первого символа и проводим проверку на вхождение этого значения в диапазон 48-57 (соответствует кодам цифр) и при удачной проверке data присваиваем значение (код-48(поправка на коды цифр. Что б 48 преобразовалось в 0, 57 в 9))*16. Умножаем на 16 потому что это старшие биты. В ином случае делаем проверку на вхождение кода в диапазон букв от "a" до "f" и выполняем тоже выражение, но с другой поправкой. Но суть не в этом. Если переменной присваивать значение этого выражение - получается муть, а если значение отправлять обратно в компьютер - всё как надо..
ставлю на то, что реальный скетч, залитый в ардуину - не такой. Похоже, что вы закомментировали код для второго разряда не полностью и он частично выполняется
Нет. Дело в синтаксисе... Код (C++): if ((48 >= data1) && (data1 <= 57)) data = (data1-48)*16; else if ((97 >= data1) && (data1 <= 102)) data = (data1-87)*16; Нельзя так сравнивать (48 <= data1) Код (C++): if ((data1 >= 48) && (data1 <= 57)) data = (data1-48)*16; else if ((data1 >= 97) && (data1 <= 102)) data = (data1-87)*16; Теперь всё работает как надо... Просто сначала я хотел сделать сравнение типа 48 >= data1 <= 57.... По-моему так можно в Python. Короче надо не выпендриваться и делать нормально.
Вы уверены, что именно это хотели сравнить? Чтобы data1 была меньше 48 и меньше 57? Для С Код (C++): data>=1 и Код (C++): 1<=data идентичны и должны работать одинаково. У Вас опечатка в знаке была, а не в порядке сравниваемых переменных
Дальше даже читать не стал... Где в программе указания, что работаем со значениями в HEX-формате ? Который день "за рулем" ? Типы переменных надо указывать ! И не в постах на форуме, а в теле программы (по-местному скетча)...