Как я могу сравнить показания двух последовательных портов на Arduino Mega?

Я пишу некоторый код, который сравнивает информацию от двух Arduino Unos с помощью Arduino Mega 2560. Проблема, с которой я сталкиваюсь, заключается в том, что когда я читаю информацию, поступающую через Serial1 и Serial2 в моих утверждениях if, я получаю оба входа на свой серийный монитор для Mega, но если я попытаюсь сравнить их после того, как прочитаю их, это не сработает. это предназначено. Я не знаю, может быть, у меня отсутствует какой-то синтаксис в моем коде или я делаю это неправильно, но я был бы признателен за любую помощь, которую я могу получить.

byte inData;

byte inDataTwo;

void setup() 
{
  // Открытие последовательной связи и ожидание открытия порта:
  Serial.begin(9600);
  Serial1.begin(9600);
  Serial2.begin(9600);

  while (!Serial) 
  {
    ; // ждем подключения последовательного порта. Требуется только для родного порта USB
  }
}


void loop() 
{
  if (Serial1.available()>0 )
  {
      inData = Serial1.read();
      Serial.print(char(inData));
  }
  if (Serial2.available()>0)
  {
    inDataTwo = Serial2.read();
    Serial.print(char(inDataTwo));
  }
  if(inData == inDataTwo)
  {
    Serial.print("true");
  }
  else
  {
    Serial.print("False");
  }
}`

, 👍0

Обсуждение

Можете ли вы также предоставить образец вывода .. !?, @varun

что вы имеете в виду образец вывода? когда я получаю информацию о arduino mega, я получаю результаты от обоих моих arduino unos и могу отображать их на экране. Я отправляю письма через лазер, а два Arduino преобразуют информацию обратно в символы, и я могу отобразить это на экране. когда я подключаю их к arduino mega, mega отображает на экране оба одинаковых символа. Я знаю, что работает, но когда я сравниваю их, программа, кажется, не делает то, что я хочу делать., @Carl Fern

напечатать их в else, @Juraj

Вы можете сказать, что вы отправляете на серийный терминал?, @Vaibhav

Кроме того, я вижу маленький символ после вашей последней скобки для цикла(). Я думал, что это пятнышко грязи на моем экране, но у вас на самом деле есть персонаж., @Neal Rosenblum


1 ответ


2

Я думаю, что ваш код в целом реализован неправильно. Даже если бы он работал «как задумано», он не вел бы себя так, как вам хотелось бы.

Первая проблема заключается в том, что вы опрашиваете байты, полученные асинхронно. Это означает, что две последовательности байтов должны быть не только равными, они также должны быть отправлены «одновременно», если они должны пройти ваш сравнительный тест. Поскольку atmega выполняет loop() очень быстро, допустимое время очень мало.

Во-вторых, переменные, в которые вы записываете полученные значения, не сбрасываются, а это означает, что как только они получат одинаковое значение, они будут передавать оператор if до тех пор, пока не будет получен другой байт. На самом деле они не инициализированы и поэтому в самом начале будут 0. Поэтому мне интересно, почему ваш интерфейс Serial не очищается true. Это вообще весь код?

В качестве решения я предлагаю накапливать полученные байты в буфере и ждать байта завершения soecific (часто /n). Если был получен символ завершения, выполните сравнение в этом буфере.

,