Ардуино hex to dec

Arduino hex to decimal conversion [closed]

Want to improve this question? Add details and clarify the problem by editing this post.

Closed 5 years ago .

I need to convert a hex string to a decimal value. I have used the following method. But sometimes it returns the wrong decimal value.

Hex string is in this format «00 00 0C 6E»

3 Answers 3

The whitespace is fouling the conversion. Try this:

  1. Why are you hardcoding ASCII values? Just use char literals — ‘0’ , ‘9’ , ‘a’ , ‘f’ , . ; they are way more readable.
  2. There’s no need to all those map , simple math operations will do; also, there’s no need for constrain , it’s only hiding your problem (see next point).
  3. If you meet a character that is not in the [0-9a-fA-F] range instead of skipping it you are just constraining its ASCII value to 0-15, which is definitely not what you want to do.

Notice that this will provide the correct result if the data you are getting is a big-endian dump of some integer.

Your hex string contains whitespace, but your code doesn’t skip them and that constrain() function effectively turns a white space into a 0xF which ultimately results in wrong results. Other than that your code is OK.

If I were to suggest the minimal amount of changes I’d say, after:

Add this to the code:

And note that the isspace() function is a C Standard Library function that is prototyped in the ctype.h header file.

But if I’m to comment on the whole code, you are calling too many functions to do a job that can be done without any function call.

Источник

Convert Hex to Decimal from signed 2’s complement

I am reading data from a meter over dlms protocol and I am getting hex values from there. I want to convert that hex string to signed decimal value. For example — ff9d denotes a value of -99 [reference].

My hex to decimal code is:

Can anyone please help me how to do it in Arduino IDE?

2 Answers 2

For example – ff9d denotes a value of -99

The function you wrote returns an unsigned integer which, being unsigned, cannot be negative. The simple fix is to declare it as

That should be enough to get it working as expected. Note that the local variable decValue still has to be unsigned, otherwise you would get a signed overflow, which is undefined behavoir (i.e. “forbidden”) in C++. Returning an unsigned number from a function that is supposed to return a signed number is perfectly fine: you get an implicit conversion which is guaranteed to do the right thing.

Now, if I may provide some more feedback about this function:

  • Use, if you can, plain C strings ( char * ) instead of String objects, as the latter are not very friendly to your Arduino’s memory.
  • Use fixed-length integers ( uint16_t if your protocol dictates 16-bit integers) instead of the generic int , otherwise your code will fail if you move to a 32-bit platform, such as an ARM-powered Arduino.
  • Use character literals ( ‘0’ instead of 48 ) instead of hard-coding ASCII code points, as that makes the code more readable.
  • Use a simple subtraction ( nextInt — ‘0’ ) instead of the quite expensive map() function.

Here is my take at it. Note that it has a “classic C” accent you do not need to replicate. You may prefer using indices to crawl the string.

Edit: As revealed by the comments, the whole question is an XY problem. You are asking help about your misguided solution rather than your actual problem. The data you have is not hex: it’s binary. You have a 16-bit signed integer stored in a byte array, most significant byte first. You figured out you can convert that to an integer by converting it first to a string representation as hexadecimal, then converting that representation back to a binary number. Of course you can do that, but it’s an overly complicated and expensive way of doing something trivial.

The canonical way to recover an integer from a byte array is by assembling the bytes together using bitwise logic and bit shifts. In this case:

Источник

Arduino.ru

HEX to DEC

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Как можно преобразовать HEX в DEC число?
Примерно:
HEX 7E007A88D2 в DEC 541173909714

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

На калькуляторе в режиме программиста.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

отличный вопрос для раздела «Программирование»

А умножить 2 на 3 никому не надо? — а то я умею

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

взять первый знак в HEX

если 0-9 то скопировать как есть

Если A-F то прибавить 10, нутыпонел A=10, B=11, F=15 (мне это удалось запомнить что есть самолёт такой F-15, единственный который мне удавалось посадить в игрульке под DOS)

удалить то что брали из HEX

если чото осталось то умножить то что получилось в DEC на 16 и т. д.

пока не кончится (подсказка: цикл while).

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Эх. А если в HEX знаков 30? Никакой разрядности не хватит персчитать. Да и ТС не написал где ему надо это делать. Если в программе, которая введеный HEX должна в DEC перекинуть и вывести на экран, то если в разрядность long long укладывается, то проще собрать строку HEX, перевести её в uint_t и напечатать DEC. Не хватает исходных данных, что бы понять где, что и как собирается конвертить ТС.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

если HEX у тебя в строковом представлении, то strtol(. ) тебя спасёть.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Может нужно HEX в BCD перевести..

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Вообще-то нет HEX или DEC чисел. Есть лишь различные способы текстовой записи этих чисел.

Соответственно, если требуется одно текстовое представление числа заменить на другое, то нужно выполнить преобразование текста в число, а затем — обратно, но по другому основанию.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я хочу читать RFID.
Я использую RFID модуль RDM6300 125kHz, UART
и Arduino Uno
Карты HEX номер 7E007A88D2, и я хочу, чтобы прочитать его
DEC номер 541173909714.
Я прочитал HEX 7E007A88D2. Преобразовать его в 541173909714DEC.
Я хочу, чтобы это число вывело на терминал
Я использую следующую часть программы:

long long x = 541173909714LL; // note the double LL

void setup()
<
Serial.begin(115200);
Serial.println(«I am Arduino»);
char buffer[100];
sprintf(buffer, «%0ld», x/1000000L);
Serial.print(buffer);
sprintf(buffer, «%0ld», x%1000000L);
Serial.println(buffer);
>

Сначала нужно вывести число 541173
А потом 909714.

Но не работает.
Если у кого-то есть целая программа для тов, пожалуйста, помогите!

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Странно. У меня на блюпиле отработало. Написало то что ожидалось. А на нане вот это

Перевело HEX в DEC и дало вывод сразу без использования буфера и sprinf.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Большое спасибо @ник182
У меня теперь другая проблема.
Когда я читаю данные карты, я записываю их в стринг.
Я могу записать их в стринговом массиве.
Я не знаю, как преобразовать их в число HEX, чтобы использовать это приложение.
Я применяю свой код.

Я прошу прощения, но я новичок в Ардуино и С

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Дед в #5 всё дал.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

vank — задержки в 16 и 22 строках уберите, с ними работать не будет.

Непонятно, зачем вы сначала переводите номер карты во стринг, если потом имеете проблему с преобразованием обратно. так не переводите.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Спасибо.
Я читал в интернете, но не могу этого сделать.
Если вы можете мне помочь.
Например, как я дал в предыдущем посте.
String s = = «7E007A88D2»
я хочу получить
long long x = 0x7E007A88D2

Спасибо за помощь!

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

@b707 Как Вы предлагаете это сделать?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

@b707 Как Вы предлагаете это сделать?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Непонятно, зачем вы сначала переводите номер карты во стринг, если потом имеете проблему с преобразованием обратно. так не переводите.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

посмотрел — был неправ, у вас RFId c UART интерфейсом, он HEX в текстовом виде выдает. Тогда да — в сообщении #5 вам дали наводку, как преобразовывать

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я сожалею, но я не знаю, как это сделать.
Если вы можете помочь!

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я сожалею, но я не знаю, как это сделать.
Если вы можете помочь!

посмотрите вот эту ссылку

там есть код, а в конце кода функция hexstr_to_value() — это именно то, что вам нужно

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Спасибо.
Я читал эту статью!.
Проблема во мне, что я хочу вывести длинный код.
Здесь выводится короткий код.
Например:
На карте записано: 7E007A88D2
И я хочу вывести монитор: 541173909714

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Это не проблема. Примите уже мысль, что это одно и то же число. Не надо его ни как преобразовывать в представлении МК. Как бы Вы не скормили его МК в его внутреннем представлении всё равно это будет двоичное число. То, что Вы видите на экране это текстовое представление. Оно может быть НЕХ, DEC, OCT, BIN — это основные виды представлений, для которых написаны конверторы и которые можно использовать не напрягаясь на писание своих программ. Дед в #5 привел пример такой функции. Если ей скормить строку символов содержащую представление числа, то она пребразует эту строку во внутренее двоичное предеставление и присвоит переменной. Дальше значение этой переменной можно вывести на экран в любом представлении.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Должен заметить, что у ТС число из 5 байтов. Следовательно в long Ардуины не помещается. А для long long нет метода print. Написать его ничего не стоит, но не для ТС ;))))))

Источник

Arduino.ru

Преобразование типов String HEX в INT

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Стоит такая задача. Имеется строка типа String, которая содержит в себе шестнадцатиричное число.

Как теперь можно преобразовать это значение в тип INT или BYTE, есть какое нибудь простое решение? Конвертации вида: str.toInt(); и тому подобные, ни к чему не приводят. Как правило появляется ошибка о несовместимости типов, либо результатом является НОЛЬ. Т.к. буквы не конвертируются напрямую в числа. )))

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

int i = atoi(«0xC2»);

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

int i = atoi(«0xC2»);

Спасибо Andy! :) Только конструкция вида:

не работает.. :( В качестве аргумента функция atoi понимает только тип char. Как перевести тогда String в char?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

int i = atoi(str.c_str());

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

int i = atoi(str.c_str());

Эммм. так получаются нули в результате. :(

str.c_str() конвертирует вроде без ошибок, на выходе 0xC2. Не работает само преобразование в int, на выходе всегда ноль.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Попробовал вывести в порт значение переменной i, на выходе получил ноль. Почему-то сама функция не работает. :(

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Блин, вчера число на биты раздирали в массив. В школе задание дали, чтоли?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Прогресс есть, теперь выводит единицу вместо нуля. ))))

Нет, в школе давно уже не учусь. :) Мне нужно строку формата (dd:c2:be:ef:fe:ed) записать в память мк. Т.е. проверить каждый из шести разрядов адреса на соответствие диапазону значений 00-FF, потом преобразовать это значение в байт и сохранить. Проблема стоит с преобразованием в десятичное число. С обратным преобразованием проблем нет никаких, делается так:

В ячейке памяти хранится один из разрядов в десятичном виде (тип byte). При выводе ф-я String преобразуеи значение в 16-ричный формат, все работает. Обратно сделать не получается. моск плачет уже. )))

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

dbf-334, а попробуйте использовать EEPROM.get и EEPROM.put с их помощью можно записывать и int и char во встроенной библиотеке eeprom

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

dbf-334, а попробуйте использовать EEPROM.get и EEPROM.put с их помощью можно записывать и int и char во встроенной библиотеке eeprom

Дело в том, что прежде чем записать значение в ячейку памяти, его сначала нужно проверить. Т.е. если пользователь указал значение «0xGR», а оно ну ни как не укладывается в диапазон 00-FF, оно вообще ошибочно. В память я могу его тупо записать, даже без ошибок и оно будет там спокойно лежать. Только это получится смысловая ошибка, что не допустимо! Указанные вами ф-ции работают напрямую с памятью, минуя всякие проверки. С их помощью можно вообще все что угодно записать и считать, даже структуры данных определенные самим разработчиком, только это все не то. :(

Мне нужно преобразовать 16-ричное число в байт. Проверить, что это число байта лежит в диапазоне 0-255 и записать этот готовый байт уже в ячейку памяти. Тупо не могу просто преобразовать HEX->DEC.

Источник

Adblock
detector