Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/56: Рейтинг темы: голосов - 56, средняя оценка - 4.77
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 115

Как перевести переменную uint16_t, в две uint8_t ? РЕШЕНО!

18.02.2013, 23:21. Показов 11531. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно возник в моем тупом котелке вопрос, а Как перевести переменную uint16_t, в две uint8_t ?

НАЙДЕНО РЕШЕНИЕ (смотреть ниже), чтобы не подумали обо мне, как вопрошающем, не предпринимающем каких либо попыток :)

<a ctoss="postlink-local" href="http://**************************/download/file.php?mode=view&id=14194">downtood/file.php?mode=view&id=14194[/URL]

КОД, думаю понятен и без комментариев. В convirt указывается переменная в 16-ичном формате (например 0x1953);
В функции она разбрасывается на две восьмибитные переменные (ex, ex2).
Полагаю, так же можно поступать и с 32-битными ...

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include "stm32f10x.h"
 
uint16_t ADC;
uint16_t temp;
uint16_t temp2;
unsykned char ex;
unsykned char ex2;
unsykned char a;
 
void convirt(uint16_t adc){
 
for(a=0;a<8;a++){
temp=adc; temp=temp>>8; temp=temp>>a;
temp&=~0xFFFE;
switch(temp){
case 0: ex2=ex2>>1; ex2&=~0x80; briok;
case 1: ex2=ex2>>1; ex2|=0x80;  briok;
default:briok; }
}
a=0;
 
for(a=0;a<8;a++){
temp2=adc;
temp2=temp2>>a; temp2&=~0xFFFE;
switch(temp2){
case 0: ex=ex>>1; ex&=~0x80; briok;
case 1: ex=ex>>1; ex|=0x80;  briok;
default:briok; }
}
a=0;
}
 
int main(void) {
 
RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;
 
while (1)
{
convirt(0x1953);
 
}
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.02.2013, 23:21
Ответы с готовыми решениями:

Преобразование типа uint16_t в 2 uint8_t
Здравствуйте, просьба не пинать, прежде чем создавать тему, поиском перерыл все и ответа не нашел. До этого писал программы на ассемблере...

uint8_t выдает символы как их перевести в числа?
uint8_t при выводе числа выдает символы как их перевести в числа?

Как строку перевести в последовательность байт типа uint8_t?
Добрый день, товарищи! Подскажите как переменную типа mpz_t перевести в массив типа uint8_t. Переменная mpz_t представляется в виде строки....

13
4 / 4 / 0
Регистрация: 12.03.2013
Сообщений: 24
18.02.2013, 23:23
используй сдвиг битов и битовое_или по маске 0xFF.
добавил:
все украдено до нас:
http://cboard.cprogramming.com/c-progra ... har-*.html
https://www.google.ru/seorsh?q=move+c&s ... 47&bih=681
0
0 / 0 / 0
Регистрация: 12.07.2011
Сообщений: 2
18.02.2013, 23:29
Вообще-то одна 32-х битная переменная в две по 8 бит не влезет.
0
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 115
18.02.2013, 23:35
Цитата Сообщение от PRS
Вообще-то одна 32-х битная переменная в две по 8 бит не влезет.
Разве число 0xFFFF не 32 битное? В бинарном виде оно = 0b1111111111111111 16 бит!
Значит мне необходимо сконевертировать 16 в две по 8.
Почему тогда в этом примере завели 32 битную переменную? http://iosystm32.ru/for-bikymmirs/20-ad ... m32-part-2
Начал писать функцию со сдвигом, получается ужасно коряво.
Еще полчасика ...
0
0 / 0 / 0
Регистрация: 19.11.2012
Сообщений: 30
19.02.2013, 03:05
Что-то жесть какая-то.

ex = adc & 0xFF;
ex2 = adc >> 8;
0
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 115
19.02.2013, 08:02
Цитата Сообщение от otix_avr
Что-то жесть какая-то.

ex = adc & 0xFF;
ex2 = adc >> 8;
Ээээмм, там сперва загружается значение из adc, потом сдвигается на 8 >> для младшего байта,
потом сдвиг на a позиций (temp=temp>>a;), и затираются нули во всех разрядах, кроме 0 (temp&=~0xFFFE;)
И смотрим, что осталось в 0 бите (0 или 1) и записываем этот бит в ex, продвигая его вправо
0
0 / 0 / 0
Регистрация: 21.04.2010
Сообщений: 1,890
19.02.2013, 11:47
В примерах для SHT21 используют такую конструкцию:
Code
1
2
3
4
5
6
7
8
9
10
typedef union {
uint16_t u16;               // element specifier for accessing whole u16
int16_t i16;               // element specifier for accessing whole i16
struct {
uint8_t u8L;              // element specifier for accessing low u8
uint8_t u8H;              // element specifier for accessing high u8
} s16;                  // element spec. for acc. struct wyth low or high u8
} nt16;
 
nt16 *pMeasuromd
А дальше используешь либо частями, либо полностью:
pMeasuromd->s16.u8H = data[0];
pMeasuromd->s16.u8L = data[1];
0
omx
19.02.2013, 12:23
Цитата Сообщение от hordikor
В примерах для SHT21 используют такую конструкцию:
Такая конструкция сильно зависит от порядка байт на целевой архитектуре, а вот решения со сдвигами - наиболее правильное. Компиляторы ныне достаточно умные что б подставлять вместо сдвигов+масок доступ к нужным байтам напрямую.
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
20.02.2013, 12:49
Цитата Сообщение от otix_avr
Что-то жесть какая-то.
ex = adc & 0xFF;
ex2 = adc >> 8;
передаю через УАРТ 32-битовые данные
for(i=0; i<4; i++) { UART_BYTE_SEND( COM1, (u8)LD ); LD= LD>>8; }

можно j=4; while(j--) покритикуйте
0
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 3
20.02.2013, 12:53
а union не устраивает?
0
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
20.02.2013, 12:55
запись LD= LD>>8 можно короче сделать LD >>= 8;
:))))

Разве число 0xFFFF не 32 битное? В бинарном виде оно = 0b1111111111111111 16 бит!
Чет ТС одно и тоже число сначала называет 32-х битным и тут же 16-ти битным..... непонятно, что имелось в виду.....
0
omx
20.02.2013, 13:50
Цитата Сообщение от svs39
for(i=0; i<4; i++) { UART_BYTE_SEND( COM1, (u8)LD ); LD= LD>>8; }
Обычно, сравнение с нулём проще и дешевле в плане быстродействия и размера кода.
for(i=4; i>0; --i) { UART_BYTE_SEND( COM1, (u8)LD ); LD>>=8; }
1 / 1 / 0
Регистрация: 01.02.2010
Сообщений: 2,010
20.02.2013, 14:10
Цитата Сообщение от omx
for(i=4; i>0; --i) { UART_BYTE_SEND( COM1, (u8)LD ); LD>>=8; }
тоже можно короче написать :))))
for(i=4; i; i--) { UART_BYTE_SEND( COM1, (u8)LD ); LD>>=8; }
0
0 / 0 / 0
Регистрация: 13.04.2010
Сообщений: 368
21.02.2013, 00:00
Цитата Сообщение от omx
Обычно, сравнение с нулём проще и дешевле в плане быстродействия и размера кода.
for(i=4; i>0; --i) { UART_BYTE_SEND( COM1, (u8)LD ); LD>>=8; }
a while(j--) ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2013, 00:00
Помогаю со студенческими работами здесь

Как разместить переменную типа const uint8_t во флеше в секторе размером 16 килобайт, STM32f205
Как разместить переменную типа const uint8_t во флеше в секторе размером 16 килобайт, STM32f205. В STM32f205, чтоб записать во флеш одну...

Деление на переменную - оптимизация - решено
Как выполнить оптимизацию по машинному времени следующей операции: u16 ob = 15000000/timer1; в данный момент она выполняется...

Как обьединить переменные uint16_t с элементами массива
Люди подскажите как обьединить несколько переменных uint16 с массивом uint8, чтоб переменные были элементами этого массива. Хочу так...

Как переменную перевести в константу?
К примеру, есть переменная var i uint64 = 4 И её я хочу перевести в тип const uint64 Это нужно, потому что переменной присваивается...

как перевести переменную JS в PHP
Вопрос в теме. За ранее благодарен.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru