port.ReadExisting (): входная строка была в неправильном формате - PullRequest
1 голос
/ 31 октября 2019

Я создаю приложение ac #, которое получает информацию от Arduino (нажатия кнопок), а затем переходит на соответствующий веб-сайт в веб-браузере. У меня есть 3 кнопки, которые соответственно печатают 1, 2 и 3 на последовательном мониторе.

После этого, когда нажата программная кнопка, приложение c # считывает номер, отправленный arduino через порт (ReadExisting ()) с портом, являющимся именем моего последовательного порта.

Это работает хорошо, когда я нажимаю кнопку Arduino, мое приложение считывает число и выполняет правильное действие. Тем не менее, я попытался напечатать номер на последовательном мониторе, когда ни одна кнопка не нажата (я пробовал и 0 и 4), но, похоже, это не работает. Последовательный монитор на Arduino действительно показывает число, появляющееся, когда ни одна из кнопок не нажата, но мой c # вылетает при попытке прочитать его.

Сообщение об ошибке, которое я получаю, когда происходит сбой: «входной строки не было вправильный формат "

Соответствующий бит кода c # (текст на голландском, но это не важно):

 private void updateBtn_Click(object sender, EventArgs e)
        {
            message = Convert.ToInt32(port.ReadExisting());
            btnLab.Text = Convert.ToString(message);

            if (message == 1)
            {
                MessageBox.Show("Er is drugsafval gedropt in Breda! Klik op alarm voor de locatie en op route voor de weg ernaartoe.");
                logBox.Items.Add("Merodelaan Breda," + DateTime.Now);
            } else if (message == 2)
            {
                MessageBox.Show("Er is drugsafval gedropt in Tilburg! Klik op alarm voor de locatie en op route voor de weg ernaartoe.");
                logBox.Items.Add("Leijweg Tilburg," + DateTime.Now);
            } else if (message == 3)
            {
                MessageBox.Show("Er is drugsafval gedropt in Breda! Klik op alarm voor de locatie en op route voor de weg ernaartoe.");
                logBox.Items.Add("Bergsche Hoevenpad Oss," + DateTime.Now);
            } 
        } else if (message == 0)
        {
                MessageBox.Show("Er is momenteel geen alarm.");

}

Соответствующий соответствующий код Arduino (для одной из кнопок, длякаждая следующая кнопка абсолютно одинакова):

void loop() {
  String input = Serial.readStringUntil('\n');
  bredaState = digitalRead(bredaBtn);
  tilburgState = digitalRead(tilburgBtn);
  ossState = digitalRead(ossBtn);

  if (bredaState == LOW)
  {
    digitalWrite(bredaLed, LOW);
    Serial.println("0");
  }
  else {
    Serial.println("1");
    lcd.clear();

    lcd.print("Alarm:Drugsafval");
    lcd.setCursor(0,1);
    lcd.print("in Breda!");
    bredaState = digitalRead(bredaBtn);
    for(int i=0; i<4; i++){
    digitalWrite(bredaLed, HIGH);
    delay(200);
    digitalWrite(bredaLed, LOW);
    delay(200);
    digitalWrite(bredaLed, HIGH);
    }

    buzz();
    lcd.clear();
    lcd.print("Er is momenteel");
    lcd.setCursor(0, 1);
    lcd.print("geen alarm!");
  }

Ответы [ 2 ]

1 голос
/ 31 октября 2019

Попробуйте сначала прочитать ввод, а затем использовать int.TryParse, чтобы в случае сбоя не возникла ошибка. Вы также можете выполнить дополнительную проверку значения, возвращаемого из port.ReadExisting (). Приведенный ниже код должен предотвратить возникновение ошибки.

var input = port.ReadExisting();
int message;
if (int.TryParse(input, out message))
{
    btnLab.Text = Convert.ToString(message);
    if (message == 1)
    {
        MessageBox.Show("Er is drugsafval gedropt in Breda! Klik op alarm voor de locatie en op route voor de weg ernaartoe.");
        logBox.Items.Add("Merodelaan Breda," + DateTime.Now);
    }
    else if (message == 2)
    {
        MessageBox.Show("Er is drugsafval gedropt in Tilburg! Klik op alarm voor de locatie en op route voor de weg ernaartoe.");
        logBox.Items.Add("Leijweg Tilburg," + DateTime.Now);
    }
    else if (message == 3)
    {
        MessageBox.Show("Er is drugsafval gedropt in Breda! Klik op alarm voor de locatie en op route voor de weg ernaartoe.");
        logBox.Items.Add("Bergsche Hoevenpad Oss," + DateTime.Now);
    }
    else if (message == 0)
    {
        MessageBox.Show("Er is momenteel geen alarm.");
    }
}
0 голосов
/ 31 октября 2019

Вы также можете выполнить ReadChar , за которым следует Заявление о переключении

uint8_t input = (uint8_t)port.ReadChar();
switch(input)
{
   case '1': 
       MessageBox.Show("Er is drugsafval gedropt in Breda! Klik op alarm voor de locatie en op route voor de weg ernaartoe.");
       logBox.Items.Add("Merodelaan Breda," + DateTime.Now);
       break;
  //etc...
  case '0':
      MessageBox.Show("Er is momenteel geen alarm.");
      break;
  default: //an unknown value
      break; //do nothing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...