Arduino Uno WiFi Rev2 отправляет последовательные данные в IDE, но не в программу C#

У меня есть Arduino Uno WiFi Rev2, с которого я пытаюсь прочитать данные через последовательный порт (используя C#). Программа Arduino периодически передает данные в последовательный порт (в целях тестирования). Всякий раз, когда Arduino записывает данные в последовательный порт, он также включает встроенный светодиод, чтобы доказать, что он все еще работает.

Кажется, все работает нормально. Светодиод периодически мигает, тем самым доказывая, что контур работает должным образом. Использование последовательного монитора в Arduino IDE также правильно отображает данные, излучаемые Arduino.

Вот программа:

int keepAlive = 500;
unsigned long lastKeepAlive = 0;
char ledState = 0;

void setup() {
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  if (millis() > lastKeepAlive + keepAlive) {
    lastKeepAlive = millis();
    Serial.println("Alive");
    if (ledState == 0) ledState = 1; else ledState = 0;
    digitalWrite(LED_BUILTIN, ledState);
  }
  delay(5);
}

Еще одна причина, по которой я знаю, что это работает, заключается в том, что светодиод TX на Arduino мигает всякий раз, когда он записывает данные в порт.

Однако, как только я закрываю IDE, Arduino «останавливается»; запись в последовательный порт. Может потому, что это не обязательно - связи нет. Я согласен. Также: светодиод TX перестает мигать, а встроенный светодиод продолжает включаться и выключаться. Таким образом, цикл по-прежнему работает нормально.

Теперь я хотел бы считать последовательные данные через C#. Для этого я написал такую простую программу:

var port = new SerialPort("COM6", 115200, Parity.None, 8, StopBits.One);
port.Open();
port.Write("123");
while (true)
{
  Console.WriteLine(port.BytesToRead);
  await Task.Delay(1000);
}

Я ожидаю, что эта программа сообщит мне, сколько байтов ожидает чтения. Но он продолжает бесконечно печатать 0. Также: на Ардуино не загорается TX-LED. С другой стороны, обратите внимание на небольшой port.Write в программе — это тест для проверки связи между Arduino и C#. Фактически: я могу ненадолго увидеть, как загорается светодиод RX на Arduino, когда моя программа отправляет 123. Я считаю, что порт и его настройки верны.

Когда я закрываю свою программу и снова открываю IDE, Arduino снова начинает выдавать последовательные данные, светодиод TX снова начинает мигать, и данные поступают в последовательный монитор.

Все это время встроенный светодиод весело включается и гаснет.

Что я делаю не так? Почему Arduino обращается к IDE, а не к моей программе? Должен ли я инициировать какое-то рукопожатие?

, 👍-1

Обсуждение

что-то не так с программой на C#... это не по теме, @jsotola

Arduino не может выбрать, какая программа будет получать данные из последовательного порта на вашем компьютере... найдите руководство по C# о получении данных из последовательного порта, @jsotola

@jsotola Вы заметили утверждение «_светодиод TX перестает мигать, в то время как встроенный светодиод продолжает включаться и выключаться_»? На мой взгляд, проблема может быть не в программе для ПК. Поскольку у меня нет доступного оборудования, я не могу воспроизвести, но похоже, что какое-то аппаратное рукопожатие блокирует., @the busybee


1 ответ


0

Я решил проблему, и @jsotola был прав, указав, что проблема связана с программой C#.

Меня ввел в заблуждение тот факт, что светодиоды TX и RX, очевидно, мигают только тогда, когда данные читаются из соответствующего буфера, а не когда они записываются. Другими словами: Arduino продолжал радостно писать в последовательный порт (как и ожидалось), но светодиод TX не загорался, потому что никто не читал то, что он писал. Я этого не знал.

Для всех, у кого возникла эта проблема: мне пришлось установить для DtrEnable значение true. Хотя меня это все еще немного сбивает с толку. Я вообще не новичок в программировании на C# и последовательных портах. Однако мне никогда не приходилось этого делать. Также, согласно документации, этот флаг используется при использовании XOn/XOff или RTS-квитирования. Ничего из этого я не использую.

Я также пробовал использовать PuTTY. Я ничего не настраивал, кроме имени порта и скорости передачи данных, и все сразу заработало. Проведя расследование, я обнаружил, что PuTTY, по-видимому, по умолчанию использует XOn/XOff.

Полагаю, тогда это действительно XOn/XOff...

Я обновил свою программу следующим образом:

var port = new SerialPort("COM6", 115200, Parity.None, 8, StopBits.One);
port.DtrEnable = true;
port.Open();
...
,