Последовательная связь между двумя Arduino для аналогового чтения

У меня есть оптический датчик, подключенный к A0 на Arduino № 1 (Nano), который дает мне значения от 200 до 1010. Мне нужно получить эти значения в Arduino № 2 (Nano) через последовательную связь. Я использовал простой код для отправки и получения байтов, но я не понимаю, как получить фактические значения датчика как int. Я нашел несколько примеров, показывающих одиночные значения, но, насколько я понимаю, значения переменных более сложны.

Код передатчика:

void setup() {
  pinMode(A0, INPUT);
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(A0);
  Serial.println(sensorValue);
}

Код получателя:

void setup() {
        Serial.begin(9600);
}
void loop() {
        if (Serial.available() > 0) {
        int incomingByte = Serial.read();
        Serial.print("I received: ");
        Serial.println(incomingByte, DEC);
        }
}

, 👍0

Обсуждение

Возможно, вам следует замедлить последовательную печать на стороне передатчика. Arduino довольно быстро заполнит весь буфер, и каждая последовательная запись с полным буфером приведет к значениям, которые не будут переданы. Это также может быть проблемой с ответом Руди. Попробуйте добавить короткую задержку (100);, @chrisl


2 ответа


1

Вам нужно ознакомиться со стандартной функцией C sscanf(). Он делает именно то, что вам нужно, преобразует строку ASCII в любой тип, который вам нравится.

API sscanf()

Код для чтения целого числа из последовательного порта будет выглядеть примерно так:

  char recv_buf[10];  int recv_int;
  Serial.readBytesUntil('\n', recv_buf, 9);
  recv_buf[9] = 0;  // убедитесь, что он завершается нулем
  sscanf(recv_buf, "%d", &recv_int);
  Serial.print("I received: ");
  Serial.println(recv_int);
,

1

Один байт равен 8 битам, поэтому 2^8 равно 255. Один байт может содержать значение до 255. Поскольку у вас есть значение 1023 (максимально возможное), вам нужно разделить значение на два байта. Вот пример:

unsigned byte highValueByte(int value)
{
    return (value >> 8);
}

unsigned byte lowValueByte(int value)
{
    return (value - (highValueByte(value) << 8));
}

int giveValue(unsigned byte highByte, unsigned byte lowByte)
{
    return ((highByte << 0) & 0xFF) + ((lowByte << 8) & 0xFFFF);
}



void loop()
{
    int senValue = analogRead(/* PIN NUMBER */);
    int byteOne = highValueByte(senValue);
    senValue = lowValueByte(senValue);
}

Ваш код работает для одного байта (попробуйте), но не для двух байтов. Поскольку у вас есть два байта, вы должны ввести какой-то буфер. Пример: буфер байтов без знака[2] = { 0, 0 }; Также убедитесь, что вы правильно подключили контакты. RX от Arduino №1 переходит в TX от Arduino №2 и наоборот.

О синхронизации последовательной связи

,