Ви не увійшли.
Сторінки 1
Honey, дякую!
І чому ця форма запису ніде не задокументована?!
Загальна ідея була така: експлуатація виробу планується на мега, де виводи використовуються як ціфрові... А ось обкатка, зачасту йде на нано чи уно, і при звернені до відсутніх віводів... - відбуваєтся богна що. Через окремі меркування, реалізувати відхилення звернень до відсутніх виводів на рівні верхнього керовання не можно. Тому й задав це питання, щоб не множити окремі скетчі до різних плат, а один раз закласти перевирку номерів....
Якщо відповідь не подобається, можна її проігнорувати
ні, я якраз питав про протилежний варіант
нано/уно/мега/... - різні плати мають різну кількість виводів (які, зокрема, мають особисту нумерацію).
Чи існують оператори коду, за допомогою яких, при наявности номера, можно б було виконати перевірку - чи є у плати, на яку записан цей скетч, реальний вивод за перевіряємим номером?
Чому на форумі не має кнопки Прийняти рішення/відповідь?
switch - це оператор, що перевіряє чи відповідає перемінна окремим значенням.
Чи можно у цьому операторі вказати умови перевірки відповідності до окремих діапазонів?
Наприклад, якщо пермінна є int х, то перевірити наступні віпадки: 1. х == 1; 2. х > 3 & x < 5; 3. x == 6; 4. x >= 8 ...?
dimich, дякую за варіант коду - дуже цікаво! З затиранням даних зрозуміло. А от що цікаво: код дає різну кількість отриманих груп для повідомлення 4/5 і для 4/5/
Мав меркування, що розділення на масив має буте швидше, ниж займатися розділом після отримання...
Но ті результати, що отримую та Ваші зауваження - підтвержують хибність моїх меркувань...
Загальні вимоги до скетчу:
1 Якщо приходить повідомлення в вигляді цислового масива не визначеної довжини (від 1 до до 5, наприклад: 1/24/35 або 759/ або1/0/245/657/841 або...) треба занесті відповідні числа у масив rArr. Ділянки масиву, що не отримали новид даних, повинні отримати 0.
2. після отриманя числовиго массина та розкладання його у rArr, потрібно викликати зовнішний void.
3. ящо у повідомленні є символи, що не належать числовому масиву, всі значення rArr потрібно перетворити у 0 і перейти до очикування наступного сповіщення.
Спробую ще раз. У вашій програмі дві помилки, через які програма не працює як очікується...
Ваша старанність друкувати заслуговує на окрему повагу! Але чи не простіше було б просто надрукувати уривок коду, що дійсно працює?
Ніяку затримку зменшувати не треба, бо її там взагалі не має бути.
!? як що закоментувати позначений рядок - маю наступну відповідь, при однаковому сповіщєнні 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]);
}
}
}
Чому це відбувається і як прискорити роботу коду?
Сторінки 1