Uint16 t что это
Uint16 t что это
Ваша корзина пуста!
Привет друзья от geekmatic.in.ua! Пора заняться полезным делом и разобрать типы данных, представленные в Arduino IDE.
Перед использованием переменных, объектов и функций, мы должны сначала объявить их в тексте программы для того, чтобы компилятор отвел для них отдельное место в ячейках памяти. А для того, чтобы компилятор знал сколько места нужно отводить в памяти, нужно еще и указать типы этих данных при объявлении. Так же типы данных требуются компилятору для правильной интерпретации выражений над ними.
Тип | Синоним | Байт | Диапазон |
bool | boolean | 1 | false, true |
byte | uint8_t | 1 | 0. 255 |
char | 1 | -128. 127 | |
unsigned char | 1 | 0. 255 | |
int | short, int16_t | 2 | -32768. 32767 |
unsigned int | word, uint16_t | 2 | 0. 65535 |
long | int32_t | 4 | -2147483648. 2147483647 |
unsigned long | uint32_t | 4 | 0. 4294967295 |
float | double | 4 | -3.4028235E+38… 3.4028235E+38 |
void | |||
String() |
Так что погружаемся в дебри ардуиновских правил урезанного языка Си и да прибудет с нами мотивация! Обещаю в конце урока выделить самые необходимые типы создаваемых переменных. А пока начнем разбор по порядку с типа bool.
Тип | Синоним | Байт | Диапазон |
bool | boolean | 1 | false, true |
Тип данных bool используется для логических переменных, хранящих два возможных значения: true или false (правда или ложь). Такие переменные удобны для создания программных флажков или защелок, для хранения состояния дискретного входа. Для переменных, которые должны отвечать на вопрос типа да или нет, включен или выключен и подобных.
Здесь представлены примеры возможных вариантов объявления такой переменной и присвоения ей значений. Нам желательно запомнить, что все присваиваемые числа, больше нуля, будут переводить переменную типа bool в состояние true.
Булевскую переменную можно вставлять в функцию digitalWrite() для задания состояния дискретному выходу контроллера.
Так же удобно, как показано на примере, использовать булевскую переменную в условных операторах if. В первом примере условие сработает, если переменная в состоянии true, а во втором наоборот.
Тип | Синоним | Байт | Диапазон |
byte | uint8_t | 1 | 0. 255 |
Byte незаслуженно недооцененный начинающими программистами тип данных, который почему-то заменен типом int даже в большинстве примеров Arduino IDE. Он хорош тем, что занимает столько же места, сколько и один регистр памяти 8-битных контроллеров Arduino. 8 бит так же занимает и минимальный коммуникационный пакет данных в сети UART, I2C и других. LCD-индикаторы тоже принимают побайтные (8-битные) данные и команды. Поэтому тип byte незаменим при коммуникациях контроллера с различной умной периферией, при прямой работе с регистрами, а так же для хранения целых десятичных чисел в промежутке 0…255.
Тип | Синоним | Байт | Диапазон |
char | 1 | -128. 127 | |
unsigned char | 1 | 0. 255 |
Unsigned char – тоже символьный тип данных, но он может хранить цифровые коды символов в диапазоне 0…255. Считается бесполезным. Неоднократно получал награду Золотой валенок.
Теперь посмотрим на саму таблицу ASCII.
Это таблица соответствия заложенных в компилятор символов и их десятичных цифровых кодов. До 32-го символа идут не читаемые символы. В примере мы использовали букву А. Вы можете попробовать найти здесь её цифровой код. А кириллицу кстати тут не найдёшь. Её буквы начинаются с кода 192 в расширенной таблице ASCII. О кириллице продолжим в конце урока.
Тип | Синоним | Байт | Диапазон |
int | short, int16_t | 2 | -32768. 32767 |
unsigned int | word, uint16_t | 2 | 0. 65535 |
Int и unsigned int – самые популярные целочисленные типы. Они охватывают большой диапазон целых чисел, но занимают в два раза больше памяти чем тип byte. Переменная типа int занимает 16 бит. Unsigned int – тот же тип, только без знака. Он охватывает только положительные значения 0…65535. Эти два типа хорошо подходят например для хранения считанного значения аналогового входа.
Тип | Синоним | Байт | Диапазон |
long | int32_t | 4 | -2147483648. 2147483647 |
unsigned long | uint32_t | 4 | 0. 4294967295 |
Типы long и unsigned long используются в тех случаях, когда не хватает размера int. Они тоже содержат целые числа, но, в отличии от int, занимают 32 бита памяти каждый. В переменных такого типа можно хранить например скорость UART-порта контроллера, номер телефона, количество миллисекунд. Такие большие числа в проектах встречаются не часто, но бывают.
Тип | Синоним | Байт | Диапазон |
float | double | 4 | -3.4028235E+38… 3.4028235E+38 |
Float – тип переменной с плавающей точкой или вещественного числа. Float позволяет получать и хранить значения данных с точностью до 6-7 знаков после запятой. Занимает 32 бита памяти. Применяется для хранения и отображения значения физических величин, результатов математических расчетов, аргументов математических формул, математических констант и так далее.
Обратите внимание на примеры, взятые из документации Arduino, по преобразованию целого числа int в вещественное float – тут есть свои нюансы.
Тип double на других платформах, позволяет получать значения чисел с точностью до 15 знаков после запятой, но у Arduino этот тип полностью аналогичен float.
Тип | Синоним | Байт | Диапазон |
void |
Тип void применим к функциям. Это тип-пустышка, который означает, что функция не возвращает никакого значения.
Здесь на примере для сравнения показана функция myfunc1, возвращающая значение типа int и три функции не возвращающие никакого значения, объявленные с типом void.
Тип | Синоним | Байт | Диапазон |
String() |
При объявлении типа String мы используем специальный класс для работы со строковыми данными. Он позволяет работать с длинными текстами, ограниченными только размерами памяти конкретного контроллера.
Текст присваивается переменной в двойных кавычках. А так же в Arduino IDE предусмотрена функция String(), которая преобразовывает значения различных типов переменных и констант в строку String. Вы видите примеры того, какие аргументы можно передавать функции String(). Интересно и то, что текст тут можно писать даже на кириллице.
Подробнее о строковых переменных будем говорить позднее.
А пока, напомним себе таблицу типов данных Arduino. Запоминать их все пока не обязательно, а ознакомиться не помешает. И, Чтобы новичков не сильно пугать, выполняя обещание, свожу самые используемые типы переменных в следующую упрощенную таблицу.
Тип | Байт | Диапазон |
int | 2 | -32768. 32767 |
float | 4 | -3.4028235E+38… 3.4028235E+38 |
String() |
Основные небольшие проекты можно строить всего на 3-х типах переменных, представленных в этой табличке. Без целочисленного int не обойдемся почти нигде. Для точных вычислений и представлений физических величин необходим тип с плавающей точкой. А текстовый String необходим для удобного вывода символов на LCD-индикаторы и в монитор порта.
Кому из вас трудно дается такая информация, просмотрите урок несколько раз. И спасибо за внимание! Всем вам желаю успехов и до новых встреч!
Двухбайтовые типы данных word, unsigned int, unsigned short, uint16_t:
Данные:
Однобайтовые типы данных:
принимают любые, возвращают 0 или 1
если принят не 0, то вернётся 1
Целочисленные значения или символы
от -128 до 127
Беззнаковые целочисленные значения
от 0 до 255
Двухбайтовые типы данных:
от -32’768 до 32’767
В Arduino Due, тип int идентичен типу long
Беззнаковые целочисленные значения
от 0 до 65’535
В Arduino Due, тип unsigned int идентичен типу unsigned long
Четырёхбайтовые типы данных:
от -2’147’483’648 до 2’147’483’647
Беззнаковые целочисленные значения
от 0 до 4’294’967’295
Числа с плавающей точкой
от -2’147’483’648,0 до 2’147’483’647,0
Восьмибайтовые типы данных:
Числа с плавающей точкой удвоенной точности
от -9’223’372’036’854’775’808,0 до 9’223’372’036’854’775’807,0
Тип double действует как тип float, кроме Arduino Due
от -9’223’372’036’854’775’808 до 9’223’372’036’854’775’807
Беззнаковые целочисленные значения
от 0 до 18’446’744’073’709’551’615
Типы данных с определяемым размером
Нет принимаемых или возвращаемых значений
Массив A указанного размера, с элементами указанного типа
Массив А указанного типа, без прямого указания размера
Двумерный массив А указанного типа и размера
Двумерный массив А указанного типа, без прямого указания размера
Массив или строка, состоящая из указанного кол-ва символов
Массив или строка, без прямого указания количества символов
Преобразование числовых типов:
Приводит значение A к указанному типу.
Приводит результат A+B к указанному типу.
Приводит указатель A к указанному типу указателя.
Спецификаторы памяти:
(указываются перед типом)
Объявление переменной в виде константы, её можно читать, но нельзя менять, т.к. она хранится в области flash памяти.
Объявление переменной, значение которой может быть изменено без явного использования оператора присвоения =. Используются для работы с прерываниями.
Объявление локальной переменной, значение которой не теряется, между вызовами функции. Если переменная объявлена глобально (вне функций), то её нельзя подключить в другом файле.
Объявление глобальной переменной, которая определена во внешнем файле.
Объявление локальной переменной, значение которой требуется хранить в регистрах процессора, а не в ОЗУ, для обеспечения ускоренного доступа.
Значения некоторых констант:
Ложь, используются вместо 0
Истина, используется вместо 1
Низкий уровень
Высокий уровень
Конфигурация вывода как вход
Конфигурация вывода как выход
Конфигурация вывода как вход с подтяжкой
Передача младшим битом вперёд
Передача старшим битом вперёд
Тактовая частота Arduino в Гц
Число Пи
Половина числа Пи
Два числа Пи
Число Эйлера
Префиксы:
Запись числа в 2ой системе ( 0b 10101)
Запись числа в 2ой системе ( B 10101)
Запись числа в 8ой системе ( 0 12345)
Запись числа в 16ой системе ( 0x 1234A)
Модификаторы:
Число типа long (12345 L )
Число типа long lond (12345 LL )
Число беззнакового типа (12345 U )
Комбинация модификаторов (12345 UL )
Это указание имени и типа переменной.
int A; // объявление переменной А
Это выделение памяти под переменную.
A =1; // определение ранее объявленной A
Действуют постоянно, в любом месте кода.
Создаются внутри функций, циклов и т.д.
удаляются из памяти при выходе из них.
Указывается в одинарных кавычках.
char A=’ Z ‘; // присвоение символа «Z»
Указывается в двойных кавычках.
String A=» Z «; // присвоение строки «XY»
Это переменная с указанием класса, вместо типа, через объект можно обращаться к методам класса
Ссылка, это альтернативное имя переменной, она возвращает значение переменной, на которую ссылается.
int A=5; // создана переменная A = 5
int & C=A; // создана ссылка C на переменную A
A++; C++; // в результате A=7 и C=7
// Ссылку нельзя переопределить: &C=Z;
Указатель, это переменная, значением которой является адрес.
int * Y1=&A; // указателю Y1, передан адрес переменной A
int ( * Y2)(int)=F; // указателю Y2, передан адрес функции F
B=Y1; // получаем адрес переменной A из указателя Y1
B= * Y1; // получаем значение A разыменовывая указатель
// Указатель можно переопределять: Y1=&Z;
Создание альтернативного имени для типа
typedef bool dbl; // создаём свой тип «dbl», как тип bool
dbl A=1; // создаём переменную A типа bool
Это переменная состоящая из нескольких однотипных элементов, доступ к значениям которых осуществляется по их индексу.
int A[5]; // объявлен массив A из 5 элементов типа int
int A[2]=<7,9>; // объявлен и определён массив A из 2 эл-тов
char A[ ]=»Hi»; // создана строка A, как массив символов
Это объединение нескольких переменных под одним именем.
struct < int A=5; float B=3; >C; // создана структура «С»
int D = C.A; // получаем значение переменной A структуры С
int Z = C.A; // присваиваем Z значение A структуры С
Значения некоторых констант:
Ложь, используются вместо 0
Истина, используется вместо 1
Двухбайтовые типы данных int, short, int16_t:
Данные:
Однобайтовые типы данных:
принимают любые, возвращают 0 или 1
если принят не 0, то вернётся 1
Целочисленные значения или символы
от -128 до 127
Беззнаковые целочисленные значения
от 0 до 255
Двухбайтовые типы данных:
от -32’768 до 32’767
В Arduino Due, тип int идентичен типу long
Беззнаковые целочисленные значения
от 0 до 65’535
В Arduino Due, тип unsigned int идентичен типу unsigned long
Четырёхбайтовые типы данных:
от -2’147’483’648 до 2’147’483’647
Беззнаковые целочисленные значения
от 0 до 4’294’967’295
Числа с плавающей точкой
от -2’147’483’648,0 до 2’147’483’647,0
Восьмибайтовые типы данных:
Числа с плавающей точкой удвоенной точности
от -9’223’372’036’854’775’808,0 до 9’223’372’036’854’775’807,0
Тип double действует как тип float, кроме Arduino Due
от -9’223’372’036’854’775’808 до 9’223’372’036’854’775’807
Беззнаковые целочисленные значения
от 0 до 18’446’744’073’709’551’615
Типы данных с определяемым размером
Нет принимаемых или возвращаемых значений
Массив A указанного размера, с элементами указанного типа
Массив А указанного типа, без прямого указания размера
Двумерный массив А указанного типа и размера
Двумерный массив А указанного типа, без прямого указания размера
Массив или строка, состоящая из указанного кол-ва символов
Массив или строка, без прямого указания количества символов
Преобразование числовых типов:
Приводит значение A к указанному типу.
Приводит результат A+B к указанному типу.
Приводит указатель A к указанному типу указателя.
Спецификаторы памяти:
(указываются перед типом)
Объявление переменной в виде константы, её можно читать, но нельзя менять, т.к. она хранится в области flash памяти.
Объявление переменной, значение которой может быть изменено без явного использования оператора присвоения =. Используются для работы с прерываниями.
Объявление локальной переменной, значение которой не теряется, между вызовами функции. Если переменная объявлена глобально (вне функций), то её нельзя подключить в другом файле.
Объявление глобальной переменной, которая определена во внешнем файле.
Объявление локальной переменной, значение которой требуется хранить в регистрах процессора, а не в ОЗУ, для обеспечения ускоренного доступа.
Значения некоторых констант:
Ложь, используются вместо 0
Истина, используется вместо 1
Низкий уровень
Высокий уровень
Конфигурация вывода как вход
Конфигурация вывода как выход
Конфигурация вывода как вход с подтяжкой
Передача младшим битом вперёд
Передача старшим битом вперёд
Тактовая частота Arduino в Гц
Число Пи
Половина числа Пи
Два числа Пи
Число Эйлера
Префиксы:
Запись числа в 2ой системе ( 0b 10101)
Запись числа в 2ой системе ( B 10101)
Запись числа в 8ой системе ( 0 12345)
Запись числа в 16ой системе ( 0x 1234A)
Модификаторы:
Число типа long (12345 L )
Число типа long lond (12345 LL )
Число беззнакового типа (12345 U )
Комбинация модификаторов (12345 UL )
Это указание имени и типа переменной.
int A; // объявление переменной А
Это выделение памяти под переменную.
A =1; // определение ранее объявленной A
Действуют постоянно, в любом месте кода.
Создаются внутри функций, циклов и т.д.
удаляются из памяти при выходе из них.
Указывается в одинарных кавычках.
char A=’ Z ‘; // присвоение символа «Z»
Указывается в двойных кавычках.
String A=» Z «; // присвоение строки «XY»
Это переменная с указанием класса, вместо типа, через объект можно обращаться к методам класса
Ссылка, это альтернативное имя переменной, она возвращает значение переменной, на которую ссылается.
int A=5; // создана переменная A = 5
int & C=A; // создана ссылка C на переменную A
A++; C++; // в результате A=7 и C=7
// Ссылку нельзя переопределить: &C=Z;
Указатель, это переменная, значением которой является адрес.
int * Y1=&A; // указателю Y1, передан адрес переменной A
int ( * Y2)(int)=F; // указателю Y2, передан адрес функции F
B=Y1; // получаем адрес переменной A из указателя Y1
B= * Y1; // получаем значение A разыменовывая указатель
// Указатель можно переопределять: Y1=&Z;
Создание альтернативного имени для типа
typedef bool dbl; // создаём свой тип «dbl», как тип bool
dbl A=1; // создаём переменную A типа bool
Это переменная состоящая из нескольких однотипных элементов, доступ к значениям которых осуществляется по их индексу.
int A[5]; // объявлен массив A из 5 элементов типа int
int A[2]=<7,9>; // объявлен и определён массив A из 2 эл-тов
char A[ ]=»Hi»; // создана строка A, как массив символов
Это объединение нескольких переменных под одним именем.
struct < int A=5; float B=3; >C; // создана структура «С»
int D = C.A; // получаем значение переменной A структуры С
int Z = C.A; // присваиваем Z значение A структуры С
Значения некоторых констант:
Ложь, используются вместо 0
Истина, используется вместо 1
ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ
Блог технической поддержки моих разработок
Урок 10. Типы данных языка Си для STM32.
Урок короткий, но очень важный. Разберемся в базовых типах данных STM32. Понимание этого вопроса абсолютно необходимо для разработки программ.
Все действия в программе мы производим над переменными. Поэтому необходимо точно знать форматы, размеры переменных, диапазоны чисел, которые они способны содержать. Переменные должны быть объявлены с указанием типа данных до использования в программе. Тип данных и задает параметры переменных.
Все это мы знаем из уроков Ардуино. Но базовые типы данных системы Ардуино и компилятора C для STM32 отличаются. Формальное применение знаний, полученных из курса Ардуино, может привести к фатальным последствиям для программ STM32. Давайте переучиваться.
Некоторые базовые типы данных стандартов языка программирования Си зависят от используемого микроконтроллера. В значительной мере от разрядности данных, с которыми он оперирует. Например, для 8ми разрядного микроконтроллера Ардуино тип int это 16 разрядов. Тот же тип для STM32 составляет 32 разряда.
Я не буду рассказывать о принципах, по которым стандарт языка Си определяет форматы базовых типов данных. Я буду освещать этот вопрос применительно к нашему микроконтроллеру STM32, нашей среде программирования.
Выделим из стандарта C99 языка программирования Си следующие базовые типы данных.
Я подкорректировал параметры в соответствии с нашей средой программирования, поверил все эти типы данных.
Есть в языке Си функция, которая возвращает количество байтов необходимое для указанного в качестве аргумента типа.
int n = sizeof(long); / / считать размер типа long
Я написал программу, которая определяет размеры разных типов данных и выводит их через последовательный порт. Это основной блок программы.
Вот, что показал монитор последовательного порта CoolTerm.
Кто захочет проверить сам, полностью проект программы можно загрузить по ссылке:
Зарегистрируйтесь и оплатите. Всего 60 руб. в месяц за доступ ко всем ресурсам сайта!
В программах для STM32 можно пользоваться всеми типами данных из таблицы. Но я предлагаю ввести ограничения.
В таблице есть целочисленные типы данных с явно заданной разрядностью.
Их имена образуются из символов:
Формат таких типов данных не зависит от разрядности микроконтроллера.
Хороший стиль использовать при разработке программ для STM32 именно такие описания для целочисленных переменных. Давайте так и будем поступать в дальнейшем.
Я бы еще допустил использование типа char. Он явно указывает на назначение переменной – хранение кода символа и, в какой-то степени, улучшает читаемость программы.
Типы с плавающей запятой будем использовать из таблицы.
Думаю, вы заметили, что отсутствуют привычные логические типы данных bool и boolean.В языке Си современной редакции они заменены на тип _Bool.
Но дело не в формальном изменении имени. Переменные для него не могут принимать значения true и false. Теперь это 0 – ложно и 1 – истинно. Часто в качестве логического типа используют uint8_t.
Можно вернуть привычный логический тип boolean и значения для него, если подключить заголовочный файл stdbool.h. Переназначение имен будет происходить через макросы.
Я предлагаю отказаться от такого способа и оставить принцип описания логических переменных, заданный разработчиками стандарта языка Си.
Но, в проектах C++ тип _Bool не поддерживается. Давайте использовать для логических переменных тип uint8_t.
Конечно, все это не догма, носит рекомендательный характер. Я выражаю свое мнение. Каждый может использовать типы данных на свое усмотрение. Но в дальнейших уроках я собираюсь придерживаться изложенных выше принципов.
Еще два слова по поводу констант. Они тоже могут иметь знак. К беззнаковой константе добавляется буквы U или u.
int x = 234U; // беззнаковое число
int x = 0x001Eu; // беззнаковое число
В противном случае (без буквы U) константа считается знаковой.
int x = 234; // знаковое число
int x = 0x001E; // знаковое число
В случае использования знаковой константы старший разряд считается знаком, и отрицательные числа воспринимаются в дополнительном коде.
В следующем уроке будем займемся обработкой сигналов кнопок.