Проблема с массивом последовательной записи 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
@Mucahit Kayadan, 👍0
Обсуждение2 ответа
Лучший ответ:
вы заменяете 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
Последовательность:
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
- Самый прямой способ назначить байты Serial.read() массиву?
- Последовательная связь между ESP8266 и Arduino Uno
- Как связаться с датчиком через порты RX/TX Arduino?
- Программирование Arduino Micro через RX/TX
- Serial Comm. проблема синхронизации между Arduino и Pyserial
- Печать массива с помощью функции печати и последовательной записи в Arduino Uno
- Двоичный в десятичный с использованием побитовых операторов
- Как создать массив из serial.read?
Символ отправляется как символ ascii, а не десятичное значение. Попробуйте преобразовать его в int или попробуйте использовать DEC в качестве второго параметра. При такой низкой скорости передачи данных, может быть, лучше добавить разделитель? Например, запятую между значениями., @Jot
мы не видим определения массива, @Juraj
@Juraj Извините, были некоторые ненужные определения. Когда я публиковал, я их удалил, и определение массива было вне поля зрения. Я исправил, отредактировал его., @Mucahit Kayadan
@Jot Я могу добавить запятую между каждым значением в списке Python, но будет ли это проще? Я не понял алгоритм, о котором вы говорите., @Mucahit Kayadan
Опубликуйте код, который не работает, @Juraj
@Juraj В чем ошибка? У меня работает. Требуется последовательное соединение, и у меня оно есть. Если у вас его нет, может быть, поэтому. Я не уверен, но у меня работает., @Mucahit Kayadan