"char inChar = (char)Serial.read();" почему "char" в скобках? и как это называется
Я уверен, что это очень простой ответ, но я не знаю, стоит ли искать его в Google
В примере «SerialEvent» в IDE Arduino (v1.8.7) есть следующая функция
void serialEvent() {
while (Serial.available()) {
// получаем новый байт:
char inChar = (char)Serial.read();
// добавляем его во входную строку:
inputString += inChar;
// если входящий символ является новой строкой, установите флаг, чтобы основной цикл мог
// делаем что-нибудь с этим:
if (inChar == '\n') {
stringComplete = true;
}
}
}
В третьей строке "char inChar = (char)Serial.read();" (char) указывается в скобках перед последовательным чтением. Почему это? а точнее как называется?
@will.mendil, 👍2
Обсуждение1 ответ
Лучший ответ:
Это называется приведение типов и преобразует один тип в другой. Тип возвращаемого значения Serial.read()
— int
, поскольку он вернет -1
, когда вы попытаетесь прочитать без каких-либо доступных байтов. . Приведение с помощью (char)
приведет к удалению старшего байта целого числа (длиной 2 байта), оставив только младший байт. Этот байт будет содержать фактические данные чтения, которые вас интересуют.
Приведение — сложная вещь, поскольку могут быть разные способы преобразования разных типов (например, сохранение битового содержимого или сохранение десятичного значения). Кастинг, который вы видите здесь, следует проводить только в том случае, если вы действительно знаете, что делаете. Биты не будут изменены для сохранения правильного значения, но битовое содержимое будет сохранено, если только новый тип не будет меньше предыдущего. В этом случае остальное теряется. Кроме того, если вы попытаетесь привести значение float
к значению int
с помощью этого, вы получите совершенно другое десятичное значение, поскольку числа закодированы в биты совершенно по-другому. Здесь, как известно, все в порядке, особенно если вы проверяете наличие доступных байтов перед чтением с помощью Serial.available()
, поскольку библиотека помещает данные ASCII в младший байт.
Для дальнейших объяснений обратитесь к руководствам по C/C++.
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
На самом деле это скорее вопрос языка C/C++. Подсказка: «Пожалуйста, проверьте тип возвращаемого значения для
Serial.read()
»., @Mikael PatelТаким образом, это по сути заставляет значение, возвращаемое из Serial.read(), быть символом? Знаете ли вы, как это называется, чтобы я мог поискать документацию?, @will.mendil
[В C почему в этом примере есть круглые скобки вокруг (int)?](https://stackoverflow.com/q/30790649/995714), [Введите круглые скобки в определение переменной C](https://stackoverflow.com /q/34600251/995714), @phuclv
На какие темы я могу здесь задавать вопросы? По теме: Конкретные вопросы о платах Arduino, коде… https://arduino.stackexchange.com/help/on-topic. Разве этот вопрос не является конкретным вопросом о коде Arduino? Голосование за то, чтобы не закрывать., @VE7JRO
@will.mendil Это называется «Явное преобразование типов» или «Приведение типов». https://en.cppreference.com/w/cpp/language/explicit_cast. В некоторых случаях это оказывается дополнительным кодом, но в других случаях это просто подсказка для компилятора, и дополнительный код не генерируется., @Mikael Patel
@will.mendil Почему необходимо явное приведение типов выше? Что произойдет, если оператор будет
int inChar = Serial.read();
? Что будет означать выражениеinputString += inChar;
, если изменитьchar inChar
наint inChar
., @Mikael Patel