преобразование byte в char
- Войдите на сайт для отправки комментариев
Пт, 27/06/2014 - 14:26
Доброго дня всем.
Подозреваю, что вопрос очень простой, есть 6 переменных тип byte , необходимо на их основе создать имя файла, соответственно создать массив char с этими символами. Вот в переводе byte в символьной представление я и застопорился, прошу помощи.
или хотя бы как с = 254 разобрать на 2, 5 и 4 типа byte
Сам спросил, сам ответил.
const byte offset = 48; byte testS = 73; char st1, st2; void setup() { st1 = char(offset+testS/10); st2 = char(offset+testS-testS/10*10); Serial.begin(9600); Serial.println(st1); Serial.println(st2); Serial.print("==="); } void loop() { }Решение работает до 99, кому надо может еще деление на 100 вставить, но мне оно не нужно
для компилятора byte и char абсолютно одно и тоже и занимает один байт.
у меня есть 3 переменных, тип Byte
27
06
14
на основе этих данных мне надо создать файл с именем 14-06-27.txt
Сейчас делаю на основе метода описанного выше.
Как это сделать по вашей методе?
какая моя метода. я говорю, если вместо всех byte поставить char, то резултат будет один и тот-же. а имя файла в памяти как выглядит? массив?
он самый - массив.
покажите этот массив.
Собственно решение, которое меня устраивает уже есть.
Выглядит вот так.
char stFileName[12]; char ByteToChar(byte byteSt, byte num) { const byte offset = 48; if (num==1) return char(offset+byteSt/10); if (num==2) return char(offset+byteSt-byteSt/10*10); } ... stFileName[0] = ByteToChar(year, 1); stFileName[1] = ByteToChar(year, 2); stFileName[2] = '-'; stFileName[3] = ByteToChar(month, 1); stFileName[4] = ByteToChar(month, 2); stFileName[5] = '-'; stFileName[6] = ByteToChar(dayOfMonth, 1); stFileName[7] = ByteToChar(dayOfMonth, 2); stFileName[8] = '.'; stFileName[9] = 't'; stFileName[10] = 'x'; stFileName[11] = 't'; ... myFile = SD.open(stFileName, FILE_WRITE); ...тогда не понятно что именно вам надо.
дык уже ничего, пока вопрос задал, сам продолжать думать, вот и надумал, да ответ написал, вдруг кому еще потребуется.
Я даже функцию форматирования добавил в DateTime - вот логер на 2 темпиратуры на сд карточку.
#include <OneWire.h> #include <ds18b20.h> #include <SD.h> #include <Wire.h> #include <RTClib.h> // Supports up to 8 devices connected to the OneWire bus DS18B20 ds(9, 2); DS1307 rtc; File myFile; long id; void setup(void) { Wire.begin(); rtc.begin(); Serial.begin(9600); if (! rtc.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(__DATE__, __TIME__)); } pinMode(13,OUTPUT); id = 0; if (!SD.begin(4)) { Serial.println("SD initialization failed!"); return; } digitalWrite(13,HIGH); Serial.println("SD initialization done."); } void loop(void) { digitalWrite(13,LOW); char buf[254]; char t1[10]; char t2[10]; DateTime now = rtc.now(); // initialize() scans the bus for sensors ds.initialize(); // ask for a temperature conversion from sensor 0 ds.start_conversion(0); // read the scratchpad on the other side ds.read_scratchpad(0); dtostrf(ds.read_temperature(), 5, 2, t1); ds.start_conversion(1); // read the scratchpad on the other side ds.read_scratchpad(1); dtostrf(ds.read_temperature(), 5, 2, t2); char dbuf[20]; strncpy(dbuf,"DD.MM.YYYY hh:mm:ss\0",20); sprintf(buf, "%s; %s; %s; %d", now.format(dbuf), t1, t2, id); Serial.print(buf); char name[19]; strncpy(name,"DD-MM-YY.CSV\0",19); now.format(name); if(!SD.exists(name)){ myFile = SD.open(name, FILE_WRITE); if (myFile) { Serial.print("\nWriting to "); Serial.println(name); myFile.println("\xEF\xBB\xBFДата;Темпиратура 1;Темпиратура 2;Номер измерения"); myFile.close(); id = 0; } } myFile = SD.open(name, FILE_WRITE); if (myFile) { digitalWrite(13,HIGH); myFile.println(buf); myFile.close(); Serial.println(" OK"); id++; }else{ Serial.println(" Failed!"); } if(id >10000){ id = 0; } }И сама функция:
char* DateTime::format(char* ret){ for(int i=0;i<strlen(ret)-1;i++){ if(ret[i] == 'h'){ ret[i] = '0'+hh/10; ret[i+1] = '0'+hh%10; } if(ret[i] == 'm'){ ret[i] = '0'+mm/10; ret[i+1] = '0'+mm%10; } if(ret[i] == 's'){ ret[i] = '0'+ss/10; ret[i+1] = '0'+ss%10; } if(ret[i] == 'D'){ ret[i] = '0'+d/10; ret[i+1] = '0'+d%10; } if(ret[i] == 'M'){ ret[i] = '0'+m/10; ret[i+1] = '0'+m%10; } if(ret[i] == 'Y'&& ret[i+2] == 'Y'){ ret[i] = '2'; ret[i+1] = '0'; ret[i+2] = '0'+yOff/10; ret[i+3] = '0'+yOff%10; }else if(ret[i] == 'Y'&& ret[i+1] == 'Y'){ ret[i] = '0'+yOff/10; ret[i+1] = '0'+yOff%10; } } return ret; }Большое Вам спасибо!
Благодаря вашему примеру я наконец-то понял как конвертировать байты в символы и наоборот.
В таблице кодов символов ASCII цифре 0 соответствует код 48, значит цифра 1 идет под кодом 48+1, …, для 7 код 48+7=55 и т.д.
char ByteToChar(byte byteSt, byte num) {
const byte offset = 48;
if (num==1) return char(offset+byteSt/10); // 48 + 73/10 = 48+7=55
if (num==2) return char(offset+byteSt-byteSt/10*10); // 48+73-(73/10)*10 = 48+73-70=51
}
и наоборот: