реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как 4 байта в unsigned long ?, Есть ли в WinAVR готовые функции?
Who_are_you?
сообщение Jun 21 2018, 11:11
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329



Есть ли в 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 ?

Go to the top of the page
 
+Quote Post
Realking
сообщение Jun 21 2018, 11:30
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 498
Регистрация: 4-10-04
Из: Нижний Новгород
Пользователь №: 771



Цитата(Who_are_you? @ Jun 21 2018, 14:11) *
Есть ли в 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 преобразовать?


--------------------
Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается.
Go to the top of the page
 
+Quote Post
Who_are_you?
сообщение Jun 21 2018, 12:12
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329



Написано:
Нужно 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'
Go to the top of the page
 
+Quote Post
Who_are_you?
сообщение Jun 21 2018, 13:15
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329



Так работает:
Код
#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? - Jun 21 2018, 13:18
Go to the top of the page
 
+Quote Post
piroman
сообщение Jun 21 2018, 13:36
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 49
Регистрация: 27-09-12
Пользователь №: 73 712



union {
unsigned long freeMemSD;
struct {
unsigned char RxBuf3; // Lo
unsigned char RxBuf2; // Hi
unsigned char RxBuf1; // Higher
unsigned char RxBuf0; // Highest
};
};

А если так?
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Jun 21 2018, 13:47
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



union {
unsigned long isLong;
unsigned char isCharArr[4]
};
Go to the top of the page
 
+Quote Post
Who_are_you?
сообщение Jun 22 2018, 07:47
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 185
Регистрация: 5-02-10
Из: Донецк
Пользователь №: 55 329



Спасибо, работает.
Код
#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);  // выводит символы на экран

[/quote]

Получается
Код
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? - Jun 22 2018, 07:51
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Jun 23 2018, 14:50
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Who_are_you? @ Jun 22 2018, 14:47) *
А может можно RxBuf[11] ... RxBuf[14] сразу в buffe ?

Я так и не понял что вы хотите сделать. Много слов и кода, мало смысла.
Напиши кратко что в кого надо превратить.
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 23 2018, 20:34
Сообщение #9


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Код
unsigned long freeMemSD;
char buffe[11];

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

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


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 23 2018, 21:13
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (dimka76 @ Jun 23 2018, 23:34) *
CODE
// туда
freeMemSD = *((unsigned long*)&RxBuf[8]);

// Обратно
*((unsigned long*)&RxBuf[8]) = freeMemSD;
годится для AVR, не годится для процессоров, не поддерживающих невыровненный доступ. Для исключения сюрпризов при использовании старого отлаженного кода на новых ядрах, лучше уж сразу приучить cебя использовать хотя бы memcpy().


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 16th April 2024 - 13:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.02226 секунд с 7
ELECTRONIX ©2004-2016