Последовательная связь Arduino между 2 Uno

Я пытаюсь заставить два Arduino Uno общаться. Ведомое устройство считывает датчик температуры как аналоговое значение, затем преобразует его в градусы Цельсия, затем отправляет это значение ведущему устройству, а затем ведущее устройство печатает значение на последовательный монитор. Это код, который у меня есть на данный момент.

для раба

const int tempPin = A0;

void setup(){
  Serial.begin(9600);
  delay(2000);
 }

  void loop() {

   //считываем данные датчика в переменную
   float volt = analogRead(tempPin) * 0.004882814;
   float degC = (volt - 0.5) * 100.0; 
   Serial.println(degC);

   delay(2000); //Не заливать последовательный порт
  }

это код мастера

float tempC; 
void setup(){
  Serial.begin(9600);
  delay(2000);
 }

  void loop() {
 /**  check if data has been sent from the computer: */
 while (Serial.available()) {
 /* read the most recent byte */
    tempC = Serial.read();     //теперь byteRead будет иметь последний датчик
                              // данные отправлены с Arduino1

    Serial.println(tempC);
  }
}

Моя проблема в том, что я читаю на последовательном мониторе 4 разных целочисленных значения

, 👍0

Обсуждение

Что именно вы видите в последовательном мониторе? Что означает "*4 различных 2 целых значения*"?, @gre_gor

Код взят отсюда: https://arduinoprosto.ru/q/16227/sending-a-value-from-one-arduino-to-another Этот пример отправки и получения одного байта. Вы хотите отправить текст (текст, который показывает число с плавающей точкой), поэтому вам придется прочитать этот полный текст., @Jot


1 ответ


1

Ваш подчиненный отправляет массив символов, а ваш главный считывает значения ASCII этих символов.

Если вы отправите 25.43, Serial.println отправит 7 символов 2, 5, ., 4, 3, возврат каретки и новую строку.

Мастер прочитает их как 50, 53, 46, 52, 51, 13 и 10. Затем ваш код выведет:

50.00
53.00
46.00
52.00
51.00
13.00
10.00

На вашем главном сервере loop() должен выглядеть так:

void loop() {
  if (Serial.available()) {
    char c = Serial.peek(); // просто смотрим на следующий символ в последовательном буфере
    if (c == '\r' || c == '\n') // игнорировать символы возврата каретки и новой строки
      Serial.read(); // удаляем символ из последовательного буфера, считывая его
    else {
      tempC = Serial.parseFloat(); // считываем и анализируем строку, представляющую значение с плавающей точкой
      Serial.println(tempC);
    }
  }
}
,

Значение — плавающая точка, а не целое число. Чтение целой части было бы началом, хотя это приведет к усечению, а не округлению. Возможные решения — разбор плавающей точки, округление до целого числа на отправителе или что-то вроде умножения на 100, округления, отправки этого, а затем на получателе копирование умноженного значения в плавающее число и обратное деление., @Chris Stratton

Я исправил это, и теперь он правильно считывает значение с плавающей точкой., @gre_gor