Передать целое число в Arduino

1

У меня есть некоторые проблемы с передачей целых чисел в Arduino, которые не являются 1 или 0. В этом примере я хочу иметь возможность передать 3. Причина в том, что у меня скоро будет больше кнопок, управляющих различными частями Arduino и для этого потребуются разные целые значения.

Вот код Arduino..

void setup()
{
  Serial.begin(9600);
  // Define the led pin as output
  pinMode(13, OUTPUT);
}
void loop()
{
  // Read data from serial communication
  if (Serial.available() > 0) {
  int b = Serial.read();
  // Note, I made it so that it more sensitive to 0-40% load.
  // Since thats where it usually at when using the computer as normal.

if (b == 3)
{
  digitalWrite(13, HIGH);
}
else if (b == 0)
{
  digitalWrite(13, LOW);
}

Serial.flush();
}
}

Вот мой код на С#.

    int MyInt = 3;
    byte[] b = BitConverter.GetBytes(MyInt);


    private void OnButton_Click(object sender, EventArgs e)
    {
        serialPort1.Write(b, 0, 4);
    }
    private void OffButton_Click(object sender, EventArgs e)
    {
        serialPort1.Write(new byte[] { Convert.ToByte("0") }, 0, 1);
    }

У меня есть два разных способа отправки данных через serialport, но они оба работают одинаково. Мой вопрос: как узнать, какие значения выходят из Serial.read() на стороне Arduino. Когда я выбираю любое значение, которое не является 1 или 0 в моей программе С# для отправки, например, 3, программа не работает. Ясно, что 3 не отправляется как 3 в Arduino для хранения в целочисленное значение.

Теги:
arduino
serial-port

1 ответ

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

Я немного изменил ваш код - int b вытащили как объявление вверху, и я изменил вашу строку b = Serial.read(); to b = Serial.read() - '0';

int b;

void setup()
{
  Serial.begin(9600);
  // Define the led pin as output
  pinMode(13, OUTPUT);
}
void loop()
{
// Read data from serial communication
if (Serial.available() > 0) {

b = Serial.read() - '0';
// Note, I made it so that it more sensitive to 0-40% load.
// Since thats where it usually at when using the computer as normal.

if (b == 3)
{
  digitalWrite(13, HIGH);
}
else if (b == 0)
{
  digitalWrite(13, LOW);
}

Serial.flush();

}}

  • 0
    Кроме того, я полагаю, что у вас есть два вопроса: как вы работаете (см. Выше) и как вы узнаете, какие значения собираются в serial.read ()? Serial.read () читает значение ascii, а не числовой эквивалент, поэтому вы читаете '51' вместо 3. Чтобы получить число, вычтите значение ascii из '0' (в одинарных кавычках). Это немного сбивает с толку, когда вы используете последовательный монитор, потому что он выполняет преобразование ASCII для вас, поэтому вы думаете, что вы только что получили 3, когда вы на самом деле получили «51».
  • 0
    Отлично! Я начал использовать таблицы из ascii.cl . Я послал значение «ETX» как целочисленное значение из программы на c #, и оно получилось как 3. Программа работала. Большой! Немного странно, что я могу отправить ETX как целое число. Это идет вразрез с тем, что я знаю о int, string, float и т. Д.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню