"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) указывается в скобках перед последовательным чтением. Почему это? а точнее как называется?

, 👍2

Обсуждение

На самом деле это скорее вопрос языка 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


1 ответ


Лучший ответ:

4

Это называется приведение типов и преобразует один тип в другой. Тип возвращаемого значения Serial.read()int, поскольку он вернет -1, когда вы попытаетесь прочитать без каких-либо доступных байтов. . Приведение с помощью (char) приведет к удалению старшего байта целого числа (длиной 2 байта), оставив только младший байт. Этот байт будет содержать фактические данные чтения, которые вас интересуют.

Приведение — сложная вещь, поскольку могут быть разные способы преобразования разных типов (например, сохранение битового содержимого или сохранение десятичного значения). Кастинг, который вы видите здесь, следует проводить только в том случае, если вы действительно знаете, что делаете. Биты не будут изменены для сохранения правильного значения, но битовое содержимое будет сохранено, если только новый тип не будет меньше предыдущего. В этом случае остальное теряется. Кроме того, если вы попытаетесь привести значение float к значению int с помощью этого, вы получите совершенно другое десятичное значение, поскольку числа закодированы в биты совершенно по-другому. Здесь, как известно, все в порядке, особенно если вы проверяете наличие доступных байтов перед чтением с помощью Serial.available(), поскольку библиотека помещает данные ASCII в младший байт.

Для дальнейших объяснений обратитесь к руководствам по C/C++.

,