Проблема с массивом последовательной записи Arduino

Я пытаюсь наладить связь ПК - Arduino Uno.

Мой код Arduino здесь: (Он работает следующим образом)

int ndx = 0;
char pack[12];            
void setup() {
Serial.begin(9600);
while(!Serial){;}
}

  void loop() { 

   while(Serial.available() ){  
    char rb = Serial.read();
    pack[ndx] = rb;
    ndx++;
    Serial.write(rb);
    if(ndx == 12){ 
        ndx=0;
      }     
    }
    }

Если я попробую

Serial.write(rb);

Вот так:

Serial.write(pack[ndx]);

Программа ведет себя странно, я имею в виду, отправляет странные байты. Я не знаю, в чем причина. Можете ли вы мне помочь, пожалуйста? Что происходит в коде? Мой код на Python: https://github.com/mucahitkayadan/Python

, 👍0

Обсуждение

Символ отправляется как символ ascii, а не десятичное значение. Попробуйте преобразовать его в int или попробуйте использовать DEC в качестве второго параметра. При такой низкой скорости передачи данных, может быть, лучше добавить разделитель? Например, запятую между значениями., @Jot

мы не видим определения массива, @Juraj

@Juraj Извините, были некоторые ненужные определения. Когда я публиковал, я их удалил, и определение массива было вне поля зрения. Я исправил, отредактировал его., @Mucahit Kayadan

@Jot Я могу добавить запятую между каждым значением в списке Python, но будет ли это проще? Я не понял алгоритм, о котором вы говорите., @Mucahit Kayadan

Опубликуйте код, который не работает, @Juraj

@Juraj В чем ошибка? У меня работает. Требуется последовательное соединение, и у меня оно есть. Если у вас его нет, может быть, поэтому. Я не уверен, но у меня работает., @Mucahit Kayadan


2 ответа


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

0

вы заменяете Serial.write(rb); на Serial.write(pack[ndx]); и получаете?:

char rb = Serial.read();
pack[ndx] = rb;
ndx++;
Serial.write(pack[ndx]);

затем вы читаете неинициализированный элемент массива по следующему индексу

,

На самом деле, это работает без использования массива. Если вы используете напрямую " Serial.write(inByte); ", это работает нормально. Но если вы используете " Serial.write(array[index]); ", то это работает странно. Отправка 0-255 случайных чисел или, может быть, не случайных, но я не знаю причину или значение этих странных чисел., @Mucahit Kayadan

Я изменил ответ., @Juraj

Мне нужно обработать данные, поэтому мне нужно обработать массив, а именно 'pack[index]', поэтому я не хочу использовать Serial.write(rb); Когда я пишу "Serial.write(pack[ndx]);", программа выдает мне разные странные числа., @Mucahit Kayadan

у вас есть ndx++ перед write(pack[ndx]);?, @Juraj

Да, именно по этой причине. Теперь это работает. Такая элементарная вещь, что я сам не могу поверить, упустил из виду., @Mucahit Kayadan

И можно ли отправлять данные в цикле for? Вот так: for(int i = 0 ; i < 12; i++){ Serial.write(pack[i]); }, @Mucahit Kayadan

да, вы можете сделать это в цикле for, @Juraj


0

Последовательность:

pack[ndx] = rb;
ndx++;
Serial.write(rb);

изменяет ndx перед печатью. Так что в первом случае — печатая 'rb' — вы печатаете значение, которое только что сохранили в массиве; во втором случае печатая 'pack[ndx]' — вы печатаете все, что происходит быть в следующем члене массива. Поменяв местами второе и третье выражение в моем отрывке, мы исправим это.

,

Мои пакеты имеют 12 байт, а всего у меня 7 пакетов. Я попробовал просто отправить свой индекс, а именно 'ndx'. И он получает правильно. Я имею в виду, что ПК получает числа 0-11 каждый раз для каждого пакета. Это ожидаемо. Это то, чего я не мог понять, для каждой итерации rb и pack[rdx] равны. Почему write(rb) работает правильно, а write(pack[ndx]) не работает?, @Mucahit Kayadan