Who_are_you? 0 21 июня, 2018 Опубликовано 21 июня, 2018 · Жалоба Есть ли в 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 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Realking 0 21 июня, 2018 Опубликовано 21 июня, 2018 · Жалоба Есть ли в 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 преобразовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Who_are_you? 0 21 июня, 2018 Опубликовано 21 июня, 2018 · Жалоба Написано: Нужно 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' Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Who_are_you? 0 21 июня, 2018 Опубликовано 21 июня, 2018 (изменено) · Жалоба Так работает: #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 и короче? Изменено 21 июня, 2018 пользователем Who_are_you? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
pyroman 2 21 июня, 2018 Опубликовано 21 июня, 2018 · Жалоба union { unsigned long freeMemSD; struct { unsigned char RxBuf3; // Lo unsigned char RxBuf2; // Hi unsigned char RxBuf1; // Higher unsigned char RxBuf0; // Highest }; }; А если так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 81 21 июня, 2018 Опубликовано 21 июня, 2018 · Жалоба union { unsigned long isLong; unsigned char isCharArr[4] }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Who_are_you? 0 22 июня, 2018 Опубликовано 22 июня, 2018 (изменено) · Жалоба Спасибо, работает. #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 ? Изменено 22 июня, 2018 пользователем Who_are_you? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 81 23 июня, 2018 Опубликовано 23 июня, 2018 · Жалоба А может можно RxBuf[11] ... RxBuf[14] сразу в buffe ? Я так и не понял что вы хотите сделать. Много слов и кода, мало смысла. Напиши кратко что в кого надо превратить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 62 23 июня, 2018 Опубликовано 23 июня, 2018 · Жалоба unsigned long freeMemSD; char buffe[11]; // туда freeMemSD = *((unsigned long*)&RxBuf[8]); // Обратно *((unsigned long*)&RxBuf[8]) = freeMemSD; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 23 июня, 2018 Опубликовано 23 июня, 2018 · Жалоба // туда freeMemSD = *((unsigned long*)&RxBuf[8]); // Обратно *((unsigned long*)&RxBuf[8]) = freeMemSD; годится для AVR, не годится для процессоров, не поддерживающих невыровненный доступ. Для исключения сюрпризов при использовании старого отлаженного кода на новых ядрах, лучше уж сразу приучить cебя использовать хотя бы memcpy(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться