|
|
|
Как 4 байта в unsigned long ?, Есть ли в WinAVR готовые функции? |
|
|
|
Jun 21 2018, 11:11
|
Частый гость
Группа: Участник
Сообщений: 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 ?
|
|
|
|
|
Jun 21 2018, 11:30
|
Местный
Группа: Свой
Сообщений: 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 преобразовать?
--------------------
Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается.
|
|
|
|
|
Jun 21 2018, 12:12
|
Частый гость
Группа: Участник
Сообщений: 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'
|
|
|
|
|
Jun 21 2018, 13:15
|
Частый гость
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 21 2018, 13:36
|
Участник
Группа: Участник
Сообщений: 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 }; };
А если так?
|
|
|
|
|
Jun 22 2018, 07:47
|
Частый гость
Группа: Участник
Сообщений: 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
|
|
|
|
|
Jun 23 2018, 21:13
|
Гуру
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|