Справка по коду в Arduino (последовательные данные)

Мне нужна помощь в этом коде

Я пытаюсь присвоить serial.write(OutData[i]) байтовым данным[]. Может ли кто-нибудь помочь мне назначить его.

Вот мой код

#define ECHOPIN 11// Пин для получения эхо-импульса
#define TRIGPIN 12// Пин для отправки триггерного импульса
int distance=0;
 byte OutData[] = {0x05, 0x03, 0x04, 0x43, 0x65, 0xBA, 0x7D, 0x04, 0xE8};
#include <Crc16.h>
Crc16 crc; 
void setup()\
{
  Serial.begin(9600);
 pinMode(ECHOPIN, INPUT);
  pinMode(TRIGPIN, OUTPUT);
  digitalWrite(ECHOPIN, HIGH);
}
void loop() {
digitalWrite(TRIGPIN, LOW); // Установить вывод триггера в низкий уровень на 2 мкс
  delayMicroseconds(2);
  digitalWrite(TRIGPIN, HIGH); // Отправляем максимум 10 мкс, чтобы активировать ранжирование
  delayMicroseconds(10);
  digitalWrite(TRIGPIN, LOW); // Снова отправляем низкий пин
  distance = pulseIn(ECHOPIN, HIGH,26000); // Чтение импульса времени
  distance= distance/58;
  Serial.print(distance, HEX);
   OutData[3] = 0x00;

  OutData[4] = 0x00;

  OutData[5] = 0x41;

  OutData[6] = distance;
for (int i = 0; i <= sizeof(OutData); i++) {

    Serial.write(OutData[i]);

    byte data[] = OutData[i];
    crc.clearCrc();
  for(byte i=0;i<9;i++)
  {
     Serial.print("byte ");
     Serial.print(i);
     Serial.print(" = ");
     Serial.println(data[i]);
     crc.updateCrc(data[i]);
  }
  unsigned short value = crc.getCrc();
  Serial.print("crc = 0x");
  Serial.println(value, HEX);

  Serial.println("The crc Check of the byte array");


  //Modbus
  value = crc.Modbus(data,0,9);
  Serial.print("Modbus crc = 0x");    
  Serial.println(value, HEX);


  while(true);
}
int calcrc(char *ptr, int count)
{
    int  crc;
    char i;
    crc = 0;
    while (--count >= 0)
    {
        crc = crc ^ (int) *ptr++ << 8;
        i = 8;
        do
        {
            if (crc & 0x8000)
                crc = crc << 1 ^ 0x1021;
            else
                crc = crc << 1;
        } while(--i);
    }
    return (crc);
}

Моя ошибка:

C:\Users\system3\AppData\Local\Temp\arduino_modified_sketch_307616\sketch_dec13a.ino: In function 'void loop()':

sketch_dec13a:34:25: error: initializer fails to determine size of 'data'

     byte data[] = sizeof(OutData);

                         ^

sketch_dec13a:34:25: error: array must be initialized with a brace-enclosed initializer

sketch_dec13a:60:1: error: a function-definition is not allowed here before '{' token

 {

 ^

sketch_dec13a:77:1: error: expected '}' at end of input

 }

 ^

Multiple libraries were found for "Crc16.h"
 Used: C:\Users\system3\Documents\Arduino\libraries\Crc16-master
exit status 1
initializer fails to determine size of 'data'

, 👍2

Обсуждение

Я не вижу никакого вызова Serial.read() в вашем коде (и этот метод, я думаю, не имеет параметра). Также вы должны включить полное сообщение об ошибке, включая информацию о проблемной строке., @chrisl

Мне очень жаль, что это Serial.write(). И полное сообщение об ошибке: инициализатору не удается определить размер «данных»., @Josh Earnest

Под полным сообщением об ошибке я имел в виду полный вывод компилятора или хотя бы полный раздел, где описана ошибка. Когда компилятор находит ошибку, он также выводит, где он нашел ошибку. Это облегчает нам поиск проблемы. Также иногда ошибка вызвана предыдущей ошибкой, поэтому полный вывод компилятора — лучший способ включить всю информацию, которая может иметь значение., @chrisl

Я добавил дополнительное сообщение об ошибке, которое отображается сейчас., @Josh Earnest


2 ответа


Лучший ответ:

0

Следующий блок кода не имеет смысла:

for (int i = 0; i <= sizeof(OutData); i++) {
    Serial.write(OutData[i]);
    byte data[] = OutData[i];
    crc.clearCrc();
} // Я добавил эту скобку для вас.
  1. Формально неправильно создавать массив таким образом. У компилятора нет никакого способа узнать, насколько большим должен быть массив. Я думаю, что объявление с [] работает только тогда, когда вы инициализируете массив, но вы просто присваиваете ему значение 1 байт. byte не совпадает с массивом byte. Так что это не может работать. Чтобы сделать это формально корректным, вы можете либо изменить data на простую переменную byte (не массив), либо определить размер массива через byte data[ 3]; и затем присвоение значения OutData[i] одному из его элементов в следующей строке;

  2. Выше я добавил для вас закрывающую фигурную скобку после первого цикла for. Кажется, вы забыли об этом, поэтому вы получите больше ошибок из-за несбалансированных скобок.

  3. Вы создаете переменную/массив внутри цикла for, который нигде не используется. Как только текущая итерация цикла for завершится, переменная/массив выйдет за пределы области видимости и исчезнет. Вы должны объявить его вне цикла for (либо внутри функции loop(), либо глобально), чтобы вы могли использовать его в следующем коде.

  4. Похоже, вы пытаетесь скопировать данные из массива OutData в массив data, чтобы вывести значения в более позднем коде и вычислить CRC ценить. Я не понимаю, зачем ты это делаешь. Есть ли причина, по которой вы не можете сделать это напрямую с массивом OutData? Я не вижу необходимости копировать данные в дополнительный массив.

  5. Следующая строка может легко вызвать проблему:

    OutData[6] = distance;
    

    distance определяется как int, который представляет собой 16-битное/2-байтовое число со знаком. OutData определяется как массив byte, который представляет собой число без знака размером 8 бит/1 байт. pulseIn() возвращает unsigned long (32-битное/4-байтовое беззнаковое число). Поскольку вы настроили тайм-аут 26000, вы не столкнетесь с конфликтом, но легко при попытке присвоить значение distance элементу OutData. Вы можете получить значения расстояния до 448, но byte может содержать только числа от 0 до 255. Таким образом, вы получите переполнение и, следовательно, искаженные данные. Вам нужно будет отправить оба байта distance, чтобы всегда получать полное значение. (Вы можете легко найти в Google, как получить отдельные байты int; в среде Arduino даже есть определения для этого, lowByte и highByte, я думаю).

,

Большое спасибо, @Josh Earnest

@JoshEarnest Если вы считаете, что один из ответов правильный, вы можете отметить его как правильный ответ. Таким образом, другие узнают, что на этот вопрос был успешно дан ответ и какой из ответов помог вам больше всего., @chrisl


0

byte data[] = OutData[i]; — недопустимый оператор.

Вы пытаетесь инициализировать массив неизвестного размера [] одним элементом.
вы должны использовать массив для инициализации массива, а не отдельного элемента.

байтовые данные[] = {0xca, 0xfe, 0xba, 0xbe};

инициализирует данные массивом из четырех элементов.

,

Спасибо за ценный комментарий, @Josh Earnest