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

Как 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

};

};

 

А если так?

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


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

union {

unsigned long isLong;

unsigned char isCharArr[4]

};

 

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


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

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

#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().

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация