преобразование byte в char

The_JOhn
Offline
Зарегистрирован: 27.06.2014

Доброго дня всем.
Подозреваю, что вопрос очень простой, есть 6 переменных тип byte , необходимо на их основе создать имя файла, соответственно создать массив char с этими символами. Вот в переводе byte в символьной представление я и застопорился, прошу помощи.

The_JOhn
Offline
Зарегистрирован: 27.06.2014

или хотя бы как с = 254 разобрать на 2, 5 и 4 типа byte

The_JOhn
Offline
Зарегистрирован: 27.06.2014

Сам спросил, сам ответил.

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 вставить, но мне оно не нужно

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

для компилятора byte и char абсолютно одно и тоже и занимает один байт.

The_JOhn
Offline
Зарегистрирован: 27.06.2014

у меня есть  3 переменных, тип Byte
27
06
14
на основе этих данных мне надо создать файл с именем 14-06-27.txt

Сейчас делаю на основе метода описанного выше.
Как это сделать по вашей методе?

__Alexander
Offline
Зарегистрирован: 24.10.2012

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

The_JOhn
Offline
Зарегистрирован: 27.06.2014

он самый - массив.

__Alexander
Offline
Зарегистрирован: 24.10.2012

покажите этот массив.

 

 

The_JOhn
Offline
Зарегистрирован: 27.06.2014

Собственно решение, которое меня устраивает уже есть.
Выглядит вот так.
 

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);
...

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

тогда не понятно что именно вам надо.

The_JOhn
Offline
Зарегистрирован: 27.06.2014

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

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Я даже функцию форматирования добавил в 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;
}
pvakos
Offline
Зарегистрирован: 21.07.2019

Большое Вам спасибо!

Благодаря вашему примеру я наконец-то понял как конвертировать байты в символы и наоборот.

В таблице кодов символов 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

}

и наоборот:

  Temp1 = (byte)InString[0] - 48;
  Temp2 = (byte)InString[1] - 48;
  Year = Temp1 * 10 + Temp2;