Преобразование данных с COM порта в HEX.

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Столкнулся в проблемой, что данные, которые приходят с компьютера, считываются функцией 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);
    }
}

 

com
Offline
Зарегистрирован: 06.09.2013

зачем для хранения одного байта выделять четыре байта?

Клапауций
Offline
Зарегистрирован: 10.02.2013

com пишет:

зачем для хранения одного байта выделять четыре байта?

распил?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Вы определитесь для начала, чего бы хотели. Вы вводите в терминал строку символов "FF0ACC55" и хотите принять чеырех байтное значение, так сказать значение 0хFF0ACC55 ? Что то я не заметил в вашем коде желаемого вами преобразования ?

com
Offline
Зарегистрирован: 06.09.2013

Клапауций пишет:

распил?

храню байты. дорого.

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Так вот я и спрашиваю, как сделать это преобразование) Если бы знал, не создал бы эту тему)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

http://forum.arduino.cc/index.php?PHPSESSID=u8sq345df03njavctf3mrjji07&topic=39168.msg288000#msg288000

 

Дык это не так это просто...  не забывайте ошибочки проверять :-) Кстати а че гугл не куку ? Если не знаешь иди ты в гугл. Пришел глупых тем насоздавал, не равнодушных пообостирал и доволен . Нихрена у тебя с такими раскладами не получится. Не любишь рыбу ловить - голодай.

 

 

 

 

com
Offline
Зарегистрирован: 06.09.2013

CEBKACooler пишет:

Столкнулся в проблемой, что данные, которые приходят с компьютера, считываются функцией serial.read() как цифры, а нужно как числа в формате HEX.

Например, ввожу в терминале значение FF0ACC55, и контроллер определяет его как 0хFF0ACC55 и начинает с ним операции.

мне так кажется, что вы просто сами не понимаете, что вам надо

что такое FF0ACC55? строка? число?

поймите, что для компьютера, да и для ардуино тоже, не существует ни символов, ни десятичных цифр, ни щестнадцатиричных - нет их, компьютер про это ничего не знает. компьютеры оперируют байтами, а люди придумали эти байты при выводе на экран или бумагу превращать в специальные значки. и способов превращения байтов в значки куча, поэтому одна и та же последовательность байт в зависимости от способа визуализации может превращаться в разные значки.

что такое, к примеру, 48? если переменная занимает один байт, и там хранится  00110000, то переменная равна целому числу 48. а может в этом одном байте не число, а символ? в этом случае там опять же хранится  00110000, что означает уже символ '0'. а в шестнадцатиричном счислении - 30. о какое разнообразие! и все это - один и тот же байт, одна и та же последовательность бит. но что именно она означает знает только программист, не компьютер.

если же там два байта, то количество вариантов еще возрастает

к примеру, 48 - строка, тогда в первом байте символ '4', т.е 00110100, во втором - '8', т.е 00111000

а может 48 это число в шестнадцатиричном виде, т.е записано 0000000010001000 ?

и во всех случах компьютеру монопенисуально, что именно мы там храним, его обязанность - тупо обрабатывать байты.

теперь посмотрите на FF0ACC55 и ответьте для себя на два вопроса 1) что это такое 2) что я хочу с этим сделать

в терминах байтов и размерности переменных

 

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

com пишет:

теперь посмотрите на FF0ACC55 и ответьте для себя на два вопроса 1) что это такое 2) что я хочу с этим сделать

в терминах байтов и размерности переменных

Компьютером посылается на ардуинку строка FF0ACC55 размером 4байта. Сейчас она имеет вид цифры. Нужно, чтобы эта строка имела вид в контроллере, только в виде чисел 16ричной системы, другими словами HEX. 

И еще возникает вопрос, как после перевода в 16ричную систему добавить 0х........... перед FF0ACC55?

com
Offline
Зарегистрирован: 06.09.2013

CEBKACooler пишет:

Компьютером посылается на ардуинку строка FF0ACC55 размером 4байта. Сейчас она имеет вид цифры. Нужно, чтобы эта строка имела вид в контроллере, только в виде чисел 16ричной системы, другими словами HEX. 

И еще возникает вопрос, как после перевода в 16ричную систему добавить 0х........... перед FF0ACC55?

увы, у меня бисер кончился :(

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

Передача символов между контроллером и ардуинкой происходит через ACSII, и символы FF0ACC55 декодируются ардуинкой в %46%46%30%41%43%43%35%35. Так и есть, терминал мне те же самые значения выдал. Но нужно, чтобы строка FF0ACC55 декодировалась в шестнадцатеричную систему с такими же символами FF0ACC55.

 

com
Offline
Зарегистрирован: 06.09.2013

вчитайтесь внимательно в то, что вы пишете

CEBKACooler пишет:

Компьютером посылается на ардуинку строка FF0ACC55 размером 4байта

мы с вами до четырех одинаково считаем? один-два-три-четыре, так? первый байт - символ F, второй тоже F, третий - 0,  четвертый - A. поэтому, если вы действительно отправляете эту строку , то она занимает 8 байт. это первое.

второе. как я понял, вместо строки "FF0ACC55" из восьми символов вы хотите видеть число 4278897749, которое в шестнадцатиричной системе записывается FF0ACC55 (но от этого не перестает быть 4278897749!!!)

так?

 

 

CEBKACooler
Offline
Зарегистрирован: 14.01.2014

com пишет:

второе. как я понял, вместо строки "FF0ACC55" из восьми символов вы хотите видеть число 4278897749, которое в шестнадцатиричной системе записывается FF0ACC55 (но от этого не перестает быть 4278897749!!!)

так?

Да, именно так

com
Offline
Зарегистрирован: 06.09.2013

тогда решите задачку из азов программирования - дано два символа, char zero='0', char one='1'. как получить в переменной int ten значение 10 ?

com
Offline
Зарегистрирован: 06.09.2013

о, только сейчас заметил - пока я тут распинаюсь, брокли уже ссылку на готовый код выложил. чего еще не хватает?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Он ждет когда за него весь скетч напишут :) Ну уж-то  не понятно :)