Перейти к содержанию
    

Как 4 байта в unsigned long ?

Есть ли в WinAVR готовые функции?

Нужно 4 байта всунуть в long и отобразить на LCD.

Готовых решений в Инете не нашел.

 

// ...
void LCD_WriteText (char font, char * text)   // функция отображения текста 
// ...
#define   BUFFER_SIZE  255 // buffer for receving/sending messages
unsigned char RxBuf [BUFFER_SIZE];  // 
unsigned long freeMemSD;
char buffe[11];

RxBuf[8]  =1;     // Highest
RxBuf[9]  =2;     // Higher
RxBuf[10] =3;    // Hi
RxBuf[11] =4;    // Lo

// freeMemSD <-- (Highest, Higher, Hi, Lo );
// buffe <-- freeMemSD;
LCD_WriteText (16,buffe);  // выводит символы на экран
// может можно как-то обойтись без long ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть ли в WinAVR готовые функции?

Нужно 4 байта всунуть в long и отобразить на LCD.

Готовых решений в Инете не нашел.

 

// ...
void LCD_WriteText (char font, char * text)   // функция отображения текста 
// ...
#define   BUFFER_SIZE  255 // buffer for receving/sending messages
unsigned char RxBuf [BUFFER_SIZE];  // 
unsigned long freeMemSD;
char buffe[11];

RxBuf[8]  =1;     // Highest
RxBuf[9]  =2;     // Higher
RxBuf[10] =3;    // Hi
RxBuf[11] =4;    // Lo

// freeMemSD <-- (Highest, Higher, Hi, Lo );
// buffe <-- freeMemSD;
LCD_WriteText (16,buffe);  // выводит символы на экран
// может можно как-то обойтись без long ?

 

5ый раз перечитываю

нифига не понимаю че ТС надо )))

 

может он имел ввиду long в массив char преобразовать?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написано:

Нужно 4 байта всунуть в long и отобразить на LCD.

unsigned int xx,rr;

RxBuf[11] = 0x00;
RxBuf[12] = 0x01;
RxBuf[13] = 0x00;
RxBuf[14] = 0x02;
rr = ((unsigned char)RxBuf[11]<<8) | RxBuf[12]; // 0x0001
xx = ((unsigned char)RxBuf[13]<<8) | RxBuf[14]; // 0x0002
freeMemSD = (rr<<16) | xx; // почему не '65538' (0x00010002), а '2'

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так работает:

#define   BUFFER_SIZE  255 // buffer for receving/sending messages
unsigned char RxBuf [BUFFER_SIZE];  // 
unsigned long freeMemSD;
char buffe[11];
unsigned int xx,rr;

RxBuf[11] = 0x00;    // Highest
RxBuf[12] = 0x01;    // Higher
RxBuf[13] = 0x00;    // Hi
RxBuf[14] = 0x02;    // Lo
rr = ((unsigned char)RxBuf[11]<<8) | RxBuf[12]; // 0x0001
xx = ((unsigned char)RxBuf[13]<<8) | RxBuf[14]; // 0x0002
freeMemSD = rr;
freeMemSD = (freeMemSD <<16) | xx;    //  '65538' (0x00010002)
ultoa(freeMemSD, buffe, 10);

LCD_WriteText (16,buffe);  // выводит символы на экран

Но как-то не то и для AVR длинно.

Может можно без long и короче?

Изменено пользователем Who_are_you?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

union {

unsigned long freeMemSD;

struct {

unsigned char RxBuf3; // Lo

unsigned char RxBuf2; // Hi

unsigned char RxBuf1; // Higher

unsigned char RxBuf0; // Highest

};

};

 

А если так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, работает.

#define   BUFFER_SIZE  255 // buffer for receving/sending messages
unsigned char RxBuf [BUFFER_SIZE];  // 

union {unsigned long isLong; 
          unsigned char isCharArr[4];
          } freeMemSD;

char buffe[11];

         // RxBuf[11] ... RxBuf[14] - получаем заранее со всеми 255 байтами
RxBuf[11] = 0x01;    // Highest
RxBuf[12] = 0x01;    // Higher
RxBuf[13] = 0x01;    // Hi
RxBuf[14] = 0x01;    // Lo

freeMemSD.isCharArr[3] = RxBuf[11];
freeMemSD.isCharArr[2] = RxBuf[12];
freeMemSD.isCharArr[1] = RxBuf[13];
freeMemSD.isCharArr[0] = RxBuf[14];
ultoa(freeMemSD.isLong, buffe, 10);

LCD_WriteText (16,buffe);  // выводит символы на экран

 

Получается

freeMemSD.isCharArr[3] = RxBuf[11];
freeMemSD.isCharArr[2] = RxBuf[12];
freeMemSD.isCharArr[1] = RxBuf[13];
freeMemSD.isCharArr[0] = RxBuf[14];
ultoa(freeMemSD.isLong, buffe, 10);

Вместо

rr = ((unsigned char)RxBuf[11]<<8) | RxBuf[12];   // Hi
xx = ((unsigned char)RxBuf[13]<<8) | RxBuf[14]; // Lo
freeMemSD = rr; //
freeMemSD = (freeMemSD <<16)| xx; //
ultoa (freeMemSD,buffe,10);               // long в char

А может можно RxBuf[11] ... RxBuf[14] сразу в buffe ?

Изменено пользователем Who_are_you?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А может можно RxBuf[11] ... RxBuf[14] сразу в buffe ?

Я так и не понял что вы хотите сделать. Много слов и кода, мало смысла.

Напиши кратко что в кого надо превратить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

unsigned long freeMemSD;
char buffe[11];

// туда
freeMemSD = *((unsigned long*)&RxBuf[8]);

// Обратно
*((unsigned long*)&RxBuf[8]) = freeMemSD;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

// туда
freeMemSD = *((unsigned long*)&RxBuf[8]);

// Обратно
*((unsigned long*)&RxBuf[8]) = freeMemSD;

годится для AVR, не годится для процессоров, не поддерживающих невыровненный доступ. Для исключения сюрпризов при использовании старого отлаженного кода на новых ядрах, лучше уж сразу приучить cебя использовать хотя бы memcpy().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...