Справка по коду в 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'
@Josh Earnest, 👍2
Обсуждение2 ответа
Лучший ответ:
Следующий блок кода не имеет смысла:
for (int i = 0; i <= sizeof(OutData); i++) {
Serial.write(OutData[i]);
byte data[] = OutData[i];
crc.clearCrc();
} // Я добавил эту скобку для вас.
Формально неправильно создавать массив таким образом. У компилятора нет никакого способа узнать, насколько большим должен быть массив. Я думаю, что объявление с
[]
работает только тогда, когда вы инициализируете массив, но вы просто присваиваете ему значение 1 байт.byte
не совпадает с массивомbyte
. Так что это не может работать. Чтобы сделать это формально корректным, вы можете либо изменитьdata
на простую переменнуюbyte
(не массив), либо определить размер массива черезbyte data[ 3];
и затем присвоение значенияOutData[i]
одному из его элементов в следующей строке;Выше я добавил для вас закрывающую фигурную скобку после первого цикла for. Кажется, вы забыли об этом, поэтому вы получите больше ошибок из-за несбалансированных скобок.
Вы создаете переменную/массив внутри цикла for, который нигде не используется. Как только текущая итерация цикла for завершится, переменная/массив выйдет за пределы области видимости и исчезнет. Вы должны объявить его вне цикла for (либо внутри функции
loop()
, либо глобально), чтобы вы могли использовать его в следующем коде.Похоже, вы пытаетесь скопировать данные из массива
OutData
в массивdata
, чтобы вывести значения в более позднем коде и вычислить CRC ценить. Я не понимаю, зачем ты это делаешь. Есть ли причина, по которой вы не можете сделать это напрямую с массивомOutData
? Я не вижу необходимости копировать данные в дополнительный массив.Следующая строка может легко вызвать проблему:
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
byte data[] = OutData[i];
— недопустимый оператор.
Вы пытаетесь инициализировать массив неизвестного размера []
одним элементом.
вы должны использовать массив для инициализации массива, а не отдельного элемента.
байтовые данные[] = {0xca, 0xfe, 0xba, 0xbe};
инициализирует данные массивом из четырех элементов.
Спасибо за ценный комментарий, @Josh Earnest
- Float печатается только 2 десятичных знака после запятой
- Отправка и получение различных типов данных через I2C в Arduino
- Избегайте математических вычислений с плавающей запятой, чтобы ускорить Arduino
- Хранение значений широты и долготы в виде символов с заданной точностью
- Умножение с плавающей запятой Возвращает ovf или -0,0 для небольших целых чисел с плавающей запятой.
- Преобразование Float в int не работает прямо в методе с использованием varargs
- Создть число с плавающей запятой, используя целые числа
- Аномальное поведение операций АЦП, цифровой записи и операций с плавающей запятой.
Я не вижу никакого вызова
Serial.read()
в вашем коде (и этот метод, я думаю, не имеет параметра). Также вы должны включить полное сообщение об ошибке, включая информацию о проблемной строке., @chrislМне очень жаль, что это Serial.write(). И полное сообщение об ошибке: инициализатору не удается определить размер «данных»., @Josh Earnest
Под полным сообщением об ошибке я имел в виду полный вывод компилятора или хотя бы полный раздел, где описана ошибка. Когда компилятор находит ошибку, он также выводит, где он нашел ошибку. Это облегчает нам поиск проблемы. Также иногда ошибка вызвана предыдущей ошибкой, поэтому полный вывод компилятора — лучший способ включить всю информацию, которая может иметь значение., @chrisl
Я добавил дополнительное сообщение об ошибке, которое отображается сейчас., @Josh Earnest