Ви не увійшли.
Спробую ще раз. У вашій програмі дві помилки, через які програма не працює як очікується...
Ваша старанність друкувати заслуговує на окрему повагу! Але чи не простіше було б просто надрукувати уривок коду, що дійсно працює?
Ніяку затримку зменшувати не треба, бо її там взагалі не має бути.
!? як що закоментувати позначений рядок - маю наступну відповідь, при однаковому сповіщєнні 147/258/369/321/654 , отримую наступний результат:
147_258_369_321_654
147_258_369_321_654
147_258_369_321_654
147_58_369_321_654
147_258_369_0_654
147_258_369_321_654
147_258_369_0_654
0_258_369_321_654
147_258_369_321_654
147_258_369_1_654
147_258_369_321_654
147_258_9_321_654
147_258_369_321_54
147_258_369_321_654
filat18 пише:jokeR пише:Ось наприклад я взяв такий код ....
ось тут я не розумію, як цей код пов'язон читанням повідоилень і як він реагує на закінчення повідомлення?
Це відноситься до експлуатації undefined behavior. Вам просто повезло що байти удачно розмістились.
як це відстежити на етапі випробування коду?
Ось наприклад я взяв такий код ....
ось тут я не розумію, як цей код пов'язон читанням повідоилень і як він реагує на закінчення повідомлення?
як можно зменшити затримку часа?
Ось варіат коду, що в мене стабільно працює:
int rArr[5] = {0};
int rIndex = 0;
void setup() {
Serial.begin(250000);
for (int i = 0; i < 5; i++) {
rArr[i] = 0;
}
rArr[1] = 1;
rIndex = 0;
}
void loop() {
String textcom = ""; // переменная для сбора текста из сом-порта
while (Serial.available() > 0) {
int inChar = Serial.read();
if ((inChar == '/') || (inChar == 'n')){
if (textcom != ""){
rArr[rIndex ] = textcom.toInt();
textcom = "";
delay(1); // ------------ чому без цього радка результат не стабільний????
}
rIndex++;
}else{
textcom += (char)inChar;
}
if (inChar == 'n') {
String text = String(rArr[0]) + "_" + String(rArr[1]) + "_" + String(rArr[2]) + "_" + String(rArr[3]) + "_" + String(rArr[4]);
Serial.println(text);
for (int i = 0; i < 5; i++) {
rArr[i] = 0;
}
rArr[1] = 1;
rIndex = 0;
}
}
delay(1);
}Було багато різнопланових зауважень без глобальної прив'язки. Ось код - як я зрозумів запропоновані редагування:
int rArr[10] = {0};
int rIndex = 0;
void setup() {
Serial.begin(250000);
rIndex = 0;
}
void loop() {
while (Serial.available() > 0) {
int inChar = Serial.read();
rArr[rIndex] *= 10;
rArr[rIndex] += inChar - '0';
rIndex++;
if (inChar == 'n') {
Serial.println(rArr[0]);
Serial.println(rArr[1]);
Serial.println(rArr[2]);
Serial.println(rArr[3]);
Serial.println(rArr[4]);
Serial.println(rArr[5]);
Serial.println(rArr[6]);
for (int i = 0; i < 10; i++) {
rArr[i] = 0;
}
rIndex = 0;
}
}
delay(1);
}Звіт по праці цього коду ніяк не пов'язаний відправленним повідомленням... ![]()
Також тут у вас доступ за межі масиву:
rArr[10] = {0};Це Undefined Behavior ("невизначена поведінка"). У масива з 10 елементів індекс останнього елемента 9.
Зауваження про rArr[10] = {0}? Ініциалізація виконується до setup, а у loop - виконую стирання. Випробую виконати стирання після вдалого считування:
if (inChar == 'n') {
Serial.println(rArr[0]);
Serial.println(rArr[1]);
Serial.println(rArr[2]);
rArr[10] = {0};
}
Зверну увагу на те, що затримка часу після rArr[10] = {0} нічого не дає, а працює лише у тому місці, що я виклав.
Проводив перевірку на платі UNO.
Плата отримує повідомлення у вигляді числового масиву не визначеної довжини (приклад: 2/954/67). Код, що використовується, працює тільки якщо використовую рядок затримки часу - якщо цей рядок закоментувати, то дані не потрапляють в масив.
int rArr[10]; // = {0};
int rIndex; // = 0;
void setup() {
Serial.begin(250000);
}
void loop() {
String textcom = "";
rArr[10] = {0};
rArr[1] = 1;
rIndex = 0;
while (Serial.available() > 0) {
int inChar = Serial.read();
delay(1); //-------------???
if ((inChar == 47) || (inChar == 'n')){ // 47 - код "/"
rArr[rIndex ] = textcom.toInt();
textcom = "";
rIndex++;
}else{
textcom += (char)inChar;
}
if (inChar == 'n') {
Serial.println(rArr[0]);
Serial.println(rArr[1]);
Serial.println(rArr[2]);
}
}
}Чому це відбувається і як прискорити роботу коду?