Преобразование данных с COM порта в HEX.
- Войдите на сайт для отправки комментариев
Вс, 30/03/2014 - 14:20
Столкнулся в проблемой, что данные, которые приходят с компьютера, считываются функцией serial.read() как цифры, а нужно как числа в формате HEX.
Например, ввожу в терминале значение FF0ACC55, и контроллер определяет его как 0хFF0ACC55 и начинает с ним операции.
Вот пример кожа, который работает не так, как нужно:
unsigned long incomingByte = 0; // переменная для хранения полученного байта byte a; byte b; byte c; byte d; void setup() { Serial.begin(9600); // устанавливаем последовательное соединение } void prov(unsigned long incomingByte) { a = incomingByte >> 24; b = (incomingByte >> 16) & 0xFF; c = (incomingByte >> 8) & 0xFF; d = incomingByte & 0xFF; } void loop() { if (Serial.available() > 0) { //если есть доступные данные // считываем байт unsigned long incomingByte = Serial.read(); prov(incomingByte); // отсылаем то, что получили Serial.println(incomingByte, HEX); Serial.println(a, HEX); Serial.println(b, HEX); Serial.println(c, HEX); Serial.println(d, HEX); } }
зачем для хранения одного байта выделять четыре байта?
зачем для хранения одного байта выделять четыре байта?
распил?
Вы определитесь для начала, чего бы хотели. Вы вводите в терминал строку символов "FF0ACC55" и хотите принять чеырех байтное значение, так сказать значение 0хFF0ACC55 ? Что то я не заметил в вашем коде желаемого вами преобразования ?
распил?
храню байты. дорого.
Так вот я и спрашиваю, как сделать это преобразование) Если бы знал, не создал бы эту тему)
http://forum.arduino.cc/index.php?PHPSESSID=u8sq345df03njavctf3mrjji07&topic=39168.msg288000#msg288000
Дык это не так это просто... не забывайте ошибочки проверять :-) Кстати а че гугл не куку ? Если не знаешь иди ты в гугл. Пришел глупых тем насоздавал, не равнодушных пообостирал и доволен . Нихрена у тебя с такими раскладами не получится. Не любишь рыбу ловить - голодай.
Столкнулся в проблемой, что данные, которые приходят с компьютера, считываются функцией serial.read() как цифры, а нужно как числа в формате HEX.
Например, ввожу в терминале значение FF0ACC55, и контроллер определяет его как 0хFF0ACC55 и начинает с ним операции.
мне так кажется, что вы просто сами не понимаете, что вам надо
что такое FF0ACC55? строка? число?
поймите, что для компьютера, да и для ардуино тоже, не существует ни символов, ни десятичных цифр, ни щестнадцатиричных - нет их, компьютер про это ничего не знает. компьютеры оперируют байтами, а люди придумали эти байты при выводе на экран или бумагу превращать в специальные значки. и способов превращения байтов в значки куча, поэтому одна и та же последовательность байт в зависимости от способа визуализации может превращаться в разные значки.
что такое, к примеру, 48? если переменная занимает один байт, и там хранится 00110000, то переменная равна целому числу 48. а может в этом одном байте не число, а символ? в этом случае там опять же хранится 00110000, что означает уже символ '0'. а в шестнадцатиричном счислении - 30. о какое разнообразие! и все это - один и тот же байт, одна и та же последовательность бит. но что именно она означает знает только программист, не компьютер.
если же там два байта, то количество вариантов еще возрастает
к примеру, 48 - строка, тогда в первом байте символ '4', т.е 00110100, во втором - '8', т.е 00111000
а может 48 это число в шестнадцатиричном виде, т.е записано 0000000010001000 ?
и во всех случах компьютеру монопенисуально, что именно мы там храним, его обязанность - тупо обрабатывать байты.
теперь посмотрите на FF0ACC55 и ответьте для себя на два вопроса 1) что это такое 2) что я хочу с этим сделать
в терминах байтов и размерности переменных
теперь посмотрите на FF0ACC55 и ответьте для себя на два вопроса 1) что это такое 2) что я хочу с этим сделать
в терминах байтов и размерности переменных
Компьютером посылается на ардуинку строка FF0ACC55 размером 4байта. Сейчас она имеет вид цифры. Нужно, чтобы эта строка имела вид в контроллере, только в виде чисел 16ричной системы, другими словами HEX.
И еще возникает вопрос, как после перевода в 16ричную систему добавить 0х........... перед FF0ACC55?
Компьютером посылается на ардуинку строка FF0ACC55 размером 4байта. Сейчас она имеет вид цифры. Нужно, чтобы эта строка имела вид в контроллере, только в виде чисел 16ричной системы, другими словами HEX.
И еще возникает вопрос, как после перевода в 16ричную систему добавить 0х........... перед FF0ACC55?
увы, у меня бисер кончился :(
Передача символов между контроллером и ардуинкой происходит через ACSII, и символы FF0ACC55 декодируются ардуинкой в %46%46%30%41%43%43%35%35. Так и есть, терминал мне те же самые значения выдал. Но нужно, чтобы строка FF0ACC55 декодировалась в шестнадцатеричную систему с такими же символами FF0ACC55.
вчитайтесь внимательно в то, что вы пишете
Компьютером посылается на ардуинку строка FF0ACC55 размером 4байта
мы с вами до четырех одинаково считаем? один-два-три-четыре, так? первый байт - символ F, второй тоже F, третий - 0, четвертый - A. поэтому, если вы действительно отправляете эту строку , то она занимает 8 байт. это первое.
второе. как я понял, вместо строки "FF0ACC55" из восьми символов вы хотите видеть число 4278897749, которое в шестнадцатиричной системе записывается FF0ACC55 (но от этого не перестает быть 4278897749!!!)
так?
второе. как я понял, вместо строки "FF0ACC55" из восьми символов вы хотите видеть число 4278897749, которое в шестнадцатиричной системе записывается FF0ACC55 (но от этого не перестает быть 4278897749!!!)
так?
Да, именно так
тогда решите задачку из азов программирования - дано два символа, char zero='0', char one='1'. как получить в переменной int ten значение 10 ?
о, только сейчас заметил - пока я тут распинаюсь, брокли уже ссылку на готовый код выложил. чего еще не хватает?
Он ждет когда за него весь скетч напишут :) Ну уж-то не понятно :)