Мусор в линии i2c. Появляется периодически на определенное время.

CollSpack
CollSpack аватар
Offline
Зарегистрирован: 10.07.2015

Связь между контроллерами по i2c. Master задает и контролирует параметры у 6 Slaves. При тестовом прогоне кода обнаружилась НЁХ.

Функция SetTemperatureToController возвращает false.

Похоже что линия i2c перестает работать с некоторой периодичностью.

В чем может быть проблема?

Спецом сделал очищенный скетч от всего лишнего и взял 2 чистые ардуины. Все то же самое. Периодически на Slave приходит мусор. Я даже скорость до 10к уменьшил.

Master:

#include <Wire.h>

unsigned int Command = 0;
char TwoBytes [2];

bool SetTemperatureToController (double TemperatureToSet, byte ControllerToSet) {
  //Отправить температуру
  Command = TemperatureToSet * 10;
  Wire.beginTransmission(ControllerToSet);
  Wire.write(Command >> 8);
  Wire.write(Command & 0xFF);
  Wire.endTransmission();
  Serial.print("Sended: ");Serial.print(Command);
  
  //Команда на получение температуры
  Command = 3;
  Wire.beginTransmission(ControllerToSet);
  Wire.write(Command >> 8);
  Wire.write(Command & 0xFF);
  Wire.endTransmission();
  Serial.print(" && ");Serial.println(Command);
  
  //Получить температуру
  Wire.requestFrom((int)ControllerToSet, (int)2);
  TwoBytes[0] = NULL;
  TwoBytes[1] = NULL;
  while (Wire.available()) {
    TwoBytes[0] = Wire.read();
    TwoBytes[1] = Wire.read();
    while (Wire.available()) {
      Wire.read();
    }
  }
  Command = 0;
  Command = ((unsigned int)TwoBytes[0] << 8) + ((unsigned int)TwoBytes[1]);
  Serial.print("Receiv: ");Serial.print(Command);
  //Serial.print(TemperatureToSet); Serial.print(" == "); Serial.println((double)Command/10);
  
  
  //Проверка на успешное задание температуры
  if (TemperatureToSet == (double)Command/10){
    Serial.println(" OK");
    return true;
  }
  else{
    Serial.println(" FALSE");
    return false;
  } 
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(10000);
  
  for (double d = 10.0; d < 130.0; d+=0.5){
    SetTemperatureToController (d, 1);
    delay(100);
  }
}

void loop() {
    
}

Slave:

#include <Wire.h>

unsigned int Command = 0;
char TwoBytes [2];

bool SetTemperatureToController (double TemperatureToSet, byte ControllerToSet) {
  //Отправить температуру
  Command = TemperatureToSet * 10;
  Wire.beginTransmission(ControllerToSet);
  Wire.write(Command >> 8);
  Wire.write(Command & 0xFF);
  Wire.endTransmission();
  Serial.print("Sended: ");Serial.print(Command);
  
  //Команда на получение температуры
  Command = 3;
  Wire.beginTransmission(ControllerToSet);
  Wire.write(Command >> 8);
  Wire.write(Command & 0xFF);
  Wire.endTransmission();
  Serial.print(" && ");Serial.println(Command);
  
  //Получить температуру
  Wire.requestFrom((int)ControllerToSet, (int)2);
  TwoBytes[0] = NULL;
  TwoBytes[1] = NULL;
  while (Wire.available()) {
    TwoBytes[0] = Wire.read();
    TwoBytes[1] = Wire.read();
    while (Wire.available()) {
      Wire.read();
    }
  }
  Command = 0;
  Command = ((unsigned int)TwoBytes[0] << 8) + ((unsigned int)TwoBytes[1]);
  Serial.print("Receiv: ");Serial.print(Command);
  //Serial.print(TemperatureToSet); Serial.print(" == "); Serial.println((double)Command/10);
  
  
  //Проверка на успешное задание температуры
  if (TemperatureToSet == (double)Command/10){
    Serial.println(" OK");
    return true;
  }
  else{
    Serial.println(" FALSE");
    return false;
  } 
}

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.setClock(10000);
  
  for (double d = 10.0; d < 130.0; d+=0.5){
    SetTemperatureToController (d, 1);
    delay(100);
  }
}

void loop() {
    
}

Master serial monitor:

Sended: 100 && 3
Receiv: 100 OK
Sended: 105 && 3
Receiv: 105 OK
Sended: 110 && 3
Receiv: 110 OK
Sended: 115 && 3
Receiv: 115 OK
Sended: 120 && 3
Receiv: 120 OK
Sended: 125 && 3
Receiv: 125 OK
Sended: 130 && 3
Receiv: 125 FALSE
Sended: 135 && 3
Receiv: 125 FALSE
Sended: 140 && 3
Receiv: 125 FALSE
Sended: 145 && 3
Receiv: 125 FALSE
Sended: 150 && 3
Receiv: 125 FALSE
Sended: 155 && 3
Receiv: 125 FALSE
Sended: 160 && 3
Receiv: 125 FALSE
Sended: 165 && 3
Receiv: 125 FALSE
Sended: 170 && 3
Receiv: 125 FALSE
Sended: 175 && 3
Receiv: 125 FALSE
Sended: 180 && 3
Receiv: 125 FALSE
Sended: 185 && 3
Receiv: 125 FALSE
Sended: 190 && 3
Receiv: 125 FALSE
Sended: 195 && 3
Receiv: 125 FALSE
Sended: 200 && 3
Receiv: 125 FALSE
Sended: 205 && 3
Receiv: 125 FALSE
Sended: 210 && 3
Receiv: 125 FALSE
Sended: 215 && 3
Receiv: 125 FALSE
Sended: 220 && 3
Receiv: 125 FALSE
Sended: 225 && 3
Receiv: 125 FALSE
Sended: 230 && 3
Receiv: 125 FALSE
Sended: 235 && 3
Receiv: 125 FALSE
Sended: 240 && 3
Receiv: 125 FALSE
Sended: 245 && 3
Receiv: 125 FALSE
Sended: 250 && 3
Receiv: 125 FALSE
Sended: 255 && 3
Receiv: 125 FALSE
Sended: 260 && 3
Receiv: 260 OK
Sended: 265 && 3
Receiv: 265 OK
Sended: 270 && 3
Receiv: 270 OK
Sended: 275 && 3
Receiv: 275 OK
Sended: 280 && 3
Receiv: 280 OK
Sended: 285 && 3
Receiv: 285 OK
Sended: 290 && 3
Receiv: 290 OK
Sended: 295 && 3
Receiv: 295 OK
Sended: 300 && 3
Receiv: 300 OK
Sended: 305 && 3
Receiv: 305 OK
Sended: 310 && 3
Receiv: 310 OK
Sended: 315 && 3
Receiv: 315 OK
Sended: 320 && 3
Receiv: 320 OK
Sended: 325 && 3
Receiv: 325 OK
Sended: 330 && 3
Receiv: 330 OK
Sended: 335 && 3
Receiv: 335 OK
Sended: 340 && 3
Receiv: 340 OK
Sended: 345 && 3
Receiv: 345 OK
Sended: 350 && 3
Receiv: 350 OK
Sended: 355 && 3
Receiv: 355 OK
Sended: 360 && 3
Receiv: 360 OK
Sended: 365 && 3
Receiv: 365 OK
Sended: 370 && 3
Receiv: 370 OK
Sended: 375 && 3
Receiv: 375 OK
Sended: 380 && 3
Receiv: 380 OK
Sended: 385 && 3
Receiv: 65409 FALSE
Sended: 390 && 3
Receiv: 65414 FALSE
Sended: 395 && 3
Receiv: 65419 FALSE
Sended: 400 && 3
Receiv: 65424 FALSE
Sended: 405 && 3
Receiv: 65429 FALSE
Sended: 410 && 3
Receiv: 65434 FALSE
Sended: 415 && 3
Receiv: 65439 FALSE
Sended: 420 && 3
Receiv: 65444 FALSE
Sended: 425 && 3
Receiv: 65449 FALSE
Sended: 430 && 3
Receiv: 65454 FALSE
Sended: 435 && 3
Receiv: 65459 FALSE
Sended: 440 && 3
Receiv: 65464 FALSE
Sended: 445 && 3
Receiv: 65469 FALSE
Sended: 450 && 3
Receiv: 65474 FALSE
Sended: 455 && 3
Receiv: 65479 FALSE
Sended: 460 && 3
Receiv: 65484 FALSE
Sended: 465 && 3
Receiv: 65489 FALSE
Sended: 470 && 3
Receiv: 65494 FALSE
Sended: 475 && 3
Receiv: 65499 FALSE
Sended: 480 && 3
Receiv: 65504 FALSE
Sended: 485 && 3
Receiv: 65509 FALSE
Sended: 490 && 3
Receiv: 65514 FALSE
Sended: 495 && 3
Receiv: 65519 FALSE
Sended: 500 && 3
Receiv: 65524 FALSE
Sended: 505 && 3
Receiv: 65529 FALSE
Sended: 510 && 3
Receiv: 65534 FALSE
Sended: 515 && 3
Receiv: 515 OK
Sended: 520 && 3
Receiv: 520 OK
Sended: 525 && 3
Receiv: 525 OK
Sended: 530 && 3
Receiv: 530 OK
Sended: 535 && 3
Receiv: 535 OK
Sended: 540 && 3
Receiv: 540 OK
Sended: 545 && 3
Receiv: 545 OK
Sended: 550 && 3
Receiv: 550 OK
Sended: 555 && 3
Receiv: 555 OK
Sended: 560 && 3
Receiv: 560 OK
Sended: 565 && 3
Receiv: 565 OK
Sended: 570 && 3
Receiv: 570 OK
Sended: 575 && 3
Receiv: 575 OK
Sended: 580 && 3
Receiv: 580 OK
Sended: 585 && 3
Receiv: 585 OK
Sended: 590 && 3
Receiv: 590 OK
Sended: 595 && 3
Receiv: 595 OK
Sended: 600 && 3
Receiv: 600 OK
Sended: 605 && 3
Receiv: 605 OK
Sended: 610 && 3
Receiv: 610 OK
Sended: 615 && 3
Receiv: 615 OK
Sended: 620 && 3
Receiv: 620 OK
Sended: 625 && 3
Receiv: 625 OK
Sended: 630 && 3
Receiv: 630 OK
Sended: 635 && 3
Receiv: 635 OK
Sended: 640 && 3
Receiv: 128 FALSE
Sended: 645 && 3
Receiv: 133 FALSE
Sended: 650 && 3
Receiv: 138 FALSE
Sended: 655 && 3
Receiv: 143 FALSE
Sended: 660 && 3
Receiv: 148 FALSE
Sended: 665 && 3
Receiv: 153 FALSE
Sended: 670 && 3
Receiv: 158 FALSE
Sended: 675 && 3
Receiv: 163 FALSE
Sended: 680 && 3
Receiv: 168 FALSE
Sended: 685 && 3
Receiv: 173 FALSE
Sended: 690 && 3
Receiv: 178 FALSE
Sended: 695 && 3
Receiv: 183 FALSE
Sended: 700 && 3
Receiv: 188 FALSE
Sended: 705 && 3
Receiv: 193 FALSE
Sended: 710 && 3
Receiv: 198 FALSE
Sended: 715 && 3
Receiv: 203 FALSE
Sended: 720 && 3
Receiv: 208 FALSE
Sended: 725 && 3
Receiv: 213 FALSE
Sended: 730 && 3
Receiv: 218 FALSE
Sended: 735 && 3
Receiv: 223 FALSE
Sended: 740 && 3
Receiv: 228 FALSE
Sended: 745 && 3
Receiv: 233 FALSE
Sended: 750 && 3
Receiv: 238 FALSE
Sended: 755 && 3
Receiv: 243 FALSE
Sended: 760 && 3
Receiv: 248 FALSE
Sended: 765 && 3
Receiv: 253 FALSE
Sended: 770 && 3
Receiv: 770 OK
Sended: 775 && 3
Receiv: 775 OK
Sended: 780 && 3
Receiv: 780 OK
Sended: 785 && 3
Receiv: 785 OK
Sended: 790 && 3
Receiv: 790 OK
Sended: 795 && 3
Receiv: 795 OK
Sended: 800 && 3
Receiv: 800 OK
Sended: 805 && 3
Receiv: 805 OK
Sended: 810 && 3
Receiv: 810 OK
Sended: 815 && 3
Receiv: 815 OK
Sended: 820 && 3
Receiv: 820 OK
Sended: 825 && 3
Receiv: 825 OK
Sended: 830 && 3
Receiv: 830 OK
Sended: 835 && 3
Receiv: 835 OK
Sended: 840 && 3
Receiv: 840 OK
Sended: 845 && 3
Receiv: 845 OK
Sended: 850 && 3
Receiv: 850 OK
Sended: 855 && 3
Receiv: 855 OK
Sended: 860 && 3
Receiv: 860 OK
Sended: 865 && 3
Receiv: 865 OK
Sended: 870 && 3
Receiv: 870 OK
Sended: 875 && 3
Receiv: 875 OK
Sended: 880 && 3
Receiv: 880 OK
Sended: 885 && 3
Receiv: 885 OK
Sended: 890 && 3
Receiv: 890 OK
Sended: 895 && 3
Receiv: 895 OK
Sended: 900 && 3
Receiv: 388 FALSE
Sended: 905 && 3
Receiv: 393 FALSE
Sended: 910 && 3
Receiv: 398 FALSE
Sended: 915 && 3
Receiv: 403 FALSE
Sended: 920 && 3
Receiv: 408 FALSE
Sended: 925 && 3
Receiv: 413 FALSE
Sended: 930 && 3
Receiv: 418 FALSE
Sended: 935 && 3
Receiv: 423 FALSE
Sended: 940 && 3
Receiv: 428 FALSE
Sended: 945 && 3
Receiv: 433 FALSE
Sended: 950 && 3
Receiv: 438 FALSE
Sended: 955 && 3
Receiv: 443 FALSE
Sended: 960 && 3
Receiv: 448 FALSE
Sended: 965 && 3
Receiv: 453 FALSE
Sended: 970 && 3
Receiv: 458 FALSE
Sended: 975 && 3
Receiv: 463 FALSE
Sended: 980 && 3
Receiv: 468 FALSE
Sended: 985 && 3
Receiv: 473 FALSE
Sended: 990 && 3
Receiv: 478 FALSE
Sended: 995 && 3
Receiv: 483 FALSE
Sended: 1000 && 3
Receiv: 488 FALSE
Sended: 1005 && 3
Receiv: 493 FALSE
Sended: 1010 && 3
Receiv: 498 FALSE
Sended: 1015 && 3
Receiv: 503 FALSE
Sended: 1020 && 3
Receiv: 508 FALSE
Sended: 1025 && 3
Receiv: 1025 OK
Sended: 1030 && 3
Receiv: 1030 OK
Sended: 1035 && 3
Receiv: 1035 OK
Sended: 1040 && 3
Receiv: 1040 OK
Sended: 1045 && 3
Receiv: 1045 OK
Sended: 1050 && 3
Receiv: 1050 OK
Sended: 1055 && 3
Receiv: 1055 OK
Sended: 1060 && 3
Receiv: 1060 OK
Sended: 1065 && 3
Receiv: 1065 OK
Sended: 1070 && 3
Receiv: 1070 OK
Sended: 1075 && 3
Receiv: 1075 OK
Sended: 1080 && 3
Receiv: 1080 OK
Sended: 1085 && 3
Receiv: 1085 OK
Sended: 1090 && 3
Receiv: 1090 OK
Sended: 1095 && 3
Receiv: 1095 OK
Sended: 1100 && 3
Receiv: 1100 OK
Sended: 1105 && 3
Receiv: 1105 OK
Sended: 1110 && 3
Receiv: 1110 OK
Sended: 1115 && 3
Receiv: 1115 OK
Sended: 1120 && 3
Receiv: 1120 OK
Sended: 1125 && 3
Receiv: 1125 OK
Sended: 1130 && 3
Receiv: 1130 OK
Sended: 1135 && 3
Receiv: 1135 OK
Sended: 1140 && 3
Receiv: 1140 OK
Sended: 1145 && 3
Receiv: 1145 OK
Sended: 1150 && 3
Receiv: 1150 OK
Sended: 1155 && 3
Receiv: 643 FALSE
Sended: 1160 && 3
Receiv: 648 FALSE
Sended: 1165 && 3
Receiv: 653 FALSE
Sended: 1170 && 3
Receiv: 658 FALSE
Sended: 1175 && 3
Receiv: 663 FALSE
Sended: 1180 && 3
Receiv: 668 FALSE
Sended: 1185 && 3
Receiv: 673 FALSE
Sended: 1190 && 3
Receiv: 678 FALSE
Sended: 1195 && 3
Receiv: 683 FALSE
Sended: 1200 && 3
Receiv: 688 FALSE
Sended: 1205 && 3
Receiv: 693 FALSE
Sended: 1210 && 3
Receiv: 698 FALSE
Sended: 1215 && 3
Receiv: 703 FALSE
Sended: 1220 && 3
Receiv: 708 FALSE
Sended: 1225 && 3
Receiv: 713 FALSE
Sended: 1230 && 3
Receiv: 718 FALSE
Sended: 1235 && 3
Receiv: 723 FALSE
Sended: 1240 && 3
Receiv: 728 FALSE
Sended: 1245 && 3
Receiv: 733 FALSE
Sended: 1250 && 3
Receiv: 738 FALSE
Sended: 1255 && 3
Receiv: 743 FALSE
Sended: 1260 && 3
Receiv: 748 FALSE
Sended: 1265 && 3
Receiv: 753 FALSE
Sended: 1270 && 3
Receiv: 758 FALSE
Sended: 1275 && 3
Receiv: 763 FALSE
Sended: 1280 && 3
Receiv: 1280 OK
Sended: 1285 && 3
Receiv: 1285 OK
Sended: 1290 && 3
Receiv: 1290 OK
Sended: 1295 && 3
Receiv: 1295 OK

Slave serial monitor:

Receiv: 100 && 3
Sended: 100
Receiv: 105 && 3
Sended: 105
Receiv: 110 && 3
Sended: 110
Receiv: 115 && 3
Sended: 115
Receiv: 120 && 3
Sended: 120
Receiv: 125 && 3
Sended: 125
Receiv: 65410 && 3
Sended: 125
Receiv: 65415 && 3
Sended: 125
Receiv: 65420 && 3
Sended: 125
Receiv: 65425 && 3
Sended: 125
Receiv: 65430 && 3
Sended: 125
Receiv: 65435 && 3
Sended: 125
Receiv: 65440 && 3
Sended: 125
Receiv: 65445 && 3
Sended: 125
Receiv: 65450 && 3
Sended: 125
Receiv: 65455 && 3
Sended: 125
Receiv: 65460 && 3
Sended: 125
Receiv: 65465 && 3
Sended: 125
Receiv: 65470 && 3
Sended: 125
Receiv: 65475 && 3
Sended: 125
Receiv: 65480 && 3
Sended: 125
Receiv: 65485 && 3
Sended: 125
Receiv: 65490 && 3
Sended: 125
Receiv: 65495 && 3
Sended: 125
Receiv: 65500 && 3
Sended: 125
Receiv: 65505 && 3
Sended: 125
Receiv: 65510 && 3
Sended: 125
Receiv: 65515 && 3
Sended: 125
Receiv: 65520 && 3
Sended: 125
Receiv: 65525 && 3
Sended: 125
Receiv: 65530 && 3
Sended: 125
Receiv: 65535 && 3
Sended: 125
Receiv: 260 && 3
Sended: 260
Receiv: 265 && 3
Sended: 265
Receiv: 270 && 3
Sended: 270
Receiv: 275 && 3
Sended: 275
Receiv: 280 && 3
Sended: 280
Receiv: 285 && 3
Sended: 285
Receiv: 290 && 3
Sended: 290
Receiv: 295 && 3
Sended: 295
Receiv: 300 && 3
Sended: 300
Receiv: 305 && 3
Sended: 305
Receiv: 310 && 3
Sended: 310
Receiv: 315 && 3
Sended: 315
Receiv: 320 && 3
Sended: 320
Receiv: 325 && 3
Sended: 325
Receiv: 330 && 3
Sended: 330
Receiv: 335 && 3
Sended: 335
Receiv: 340 && 3
Sended: 340
Receiv: 345 && 3
Sended: 345
Receiv: 350 && 3
Sended: 350
Receiv: 355 && 3
Sended: 355
Receiv: 360 && 3
Sended: 360
Receiv: 365 && 3
Sended: 365
Receiv: 370 && 3
Sended: 370
Receiv: 375 && 3
Sended: 375
Receiv: 380 && 3
Sended: 380
Receiv: 129 && 3
Sended: 129
Receiv: 134 && 3
Sended: 134
Receiv: 139 && 3
Sended: 139
Receiv: 144 && 3
Sended: 144
Receiv: 149 && 3
Sended: 149
Receiv: 154 && 3
Sended: 154
Receiv: 159 && 3
Sended: 159
Receiv: 164 && 3
Sended: 164
Receiv: 169 && 3
Sended: 169
Receiv: 174 && 3
Sended: 174
Receiv: 179 && 3
Sended: 179
Receiv: 184 && 3
Sended: 184
Receiv: 189 && 3
Sended: 189
Receiv: 194 && 3
Sended: 194
Receiv: 199 && 3
Sended: 199
Receiv: 204 && 3
Sended: 204
Receiv: 209 && 3
Sended: 209
Receiv: 214 && 3
Sended: 214
Receiv: 219 && 3
Sended: 219
Receiv: 224 && 3
Sended: 224
Receiv: 229 && 3
Sended: 229
Receiv: 234 && 3
Sended: 234
Receiv: 100 && 3
Sended: 100
Receiv: 105 && 3
Sended: 105
Receiv: 110 && 3
Sended: 110
Receiv: 115 && 3
Sended: 115
Receiv: 120 && 3
Sended: 120
Receiv: 125 && 3
Sended: 125
Receiv: 65410 && 3
Sended: 125
Receiv: 65415 && 3
Sended: 125
Receiv: 65420 && 3
Sended: 125
Receiv: 65425 && 3
Sended: 125
Receiv: 65430 && 3
Sended: 125
Receiv: 65435 && 3
Sended: 125
Receiv: 65440 && 3
Sended: 125
Receiv: 65445 && 3
Sended: 125
Receiv: 65450 && 3
Sended: 125
Receiv: 65455 && 3
Sended: 125
Receiv: 65460 && 3
Sended: 125
Receiv: 65465 && 3
Sended: 125
Receiv: 65470 && 3
Sended: 125
Receiv: 65475 && 3
Sended: 125
Receiv: 65480 && 3
Sended: 125
Receiv: 65485 && 3
Sended: 125
Receiv: 65490 && 3
Sended: 125
Receiv: 65495 && 3
Sended: 125
Receiv: 65500 && 3
Sended: 125
Receiv: 65505 && 3
Sended: 125
Receiv: 65510 && 3
Sended: 125
Receiv: 65515 && 3
Sended: 125
Receiv: 65520 && 3
Sended: 125
Receiv: 65525 && 3
Sended: 125
Receiv: 65530 && 3
Sended: 125
Receiv: 65535 && 3
Sended: 125
Receiv: 260 && 3
Sended: 260
Receiv: 265 && 3
Sended: 265
Receiv: 270 && 3
Sended: 270
Receiv: 275 && 3
Sended: 275
Receiv: 280 && 3
Sended: 280
Receiv: 285 && 3
Sended: 285
Receiv: 290 && 3
Sended: 290
Receiv: 295 && 3
Sended: 295
Receiv: 300 && 3
Sended: 300
Receiv: 305 && 3
Sended: 305
Receiv: 310 && 3
Sended: 310
Receiv: 315 && 3
Sended: 315
Receiv: 320 && 3
Sended: 320
Receiv: 325 && 3
Sended: 325
Receiv: 330 && 3
Sended: 330
Receiv: 335 && 3
Sended: 335
Receiv: 340 && 3
Sended: 340
Receiv: 345 && 3
Sended: 345
Receiv: 350 && 3
Sended: 350
Receiv: 355 && 3
Sended: 355
Receiv: 360 && 3
Sended: 360
Receiv: 365 && 3
Sended: 365
Receiv: 370 && 3
Sended: 370
Receiv: 375 && 3
Sended: 375
Receiv: 380 && 3
Sended: 380
Receiv: 129 && 3
Sended: 129
Receiv: 134 && 3
Sended: 134
Receiv: 139 && 3
Sended: 139
Receiv: 144 && 3
Sended: 144
Receiv: 149 && 3
Sended: 149
Receiv: 154 && 3
Sended: 154
Receiv: 159 && 3
Sended: 159
Receiv: 164 && 3
Sended: 164
Receiv: 169 && 3
Sended: 169
Receiv: 174 && 3
Sended: 174
Receiv: 179 && 3
Sended: 179
Receiv: 184 && 3
Sended: 184
Receiv: 189 && 3
Sended: 189
Receiv: 194 && 3
Sended: 194
Receiv: 199 && 3
Sended: 199
Receiv: 204 && 3
Sended: 204
Receiv: 209 && 3
Sended: 209
Receiv: 214 && 3
Sended: 214
Receiv: 219 && 3
Sended: 219
Receiv: 224 && 3
Sended: 224
Receiv: 229 && 3
Sended: 229
Receiv: 234 && 3
Sended: 234
Receiv: 239 && 3
Sended: 239
Receiv: 244 && 3
Sended: 244
Receiv: 249 && 3
Sended: 249
Receiv: 254 && 3
Sended: 254
Receiv: 515 && 3
Sended: 515
Receiv: 520 && 3
Sended: 520
Receiv: 525 && 3
Sended: 525
Receiv: 530 && 3
Sended: 530
Receiv: 535 && 3
Sended: 535
Receiv: 540 && 3
Sended: 540
Receiv: 545 && 3
Sended: 545
Receiv: 550 && 3
Sended: 550
Receiv: 555 && 3
Sended: 555
Receiv: 560 && 3
Sended: 560
Receiv: 565 && 3
Sended: 565
Receiv: 570 && 3
Sended: 570
Receiv: 575 && 3
Sended: 575
Receiv: 580 && 3
Sended: 580
Receiv: 585 && 3
Sended: 585
Receiv: 590 && 3
Sended: 590
Receiv: 595 && 3
Sended: 595
Receiv: 600 && 3
Sended: 600
Receiv: 605 && 3
Sended: 605
Receiv: 610 && 3
Sended: 610
Receiv: 615 && 3
Sended: 615
Receiv: 620 && 3
Sended: 620
Receiv: 625 && 3
Sended: 625
Receiv: 630 && 3
Sended: 630
Receiv: 635 && 3
Sended: 635
Receiv: 384 && 3
Sended: 384
Receiv: 389 && 3
Sended: 389
Receiv: 394 && 3
Sended: 394
Receiv: 399 && 3
Sended: 399
Receiv: 404 && 3
Sended: 404
Receiv: 409 && 3
Sended: 409
Receiv: 414 && 3
Sended: 414
Receiv: 419 && 3
Sended: 419
Receiv: 424 && 3
Sended: 424
Receiv: 429 && 3
Sended: 429
Receiv: 434 && 3
Sended: 434
Receiv: 439 && 3
Sended: 439
Receiv: 444 && 3
Sended: 444
Receiv: 449 && 3
Sended: 449
Receiv: 454 && 3
Sended: 454
Receiv: 459 && 3
Sended: 459
Receiv: 464 && 3
Sended: 464
Receiv: 469 && 3
Sended: 469
Receiv: 474 && 3
Sended: 474
Receiv: 479 && 3
Sended: 479
Receiv: 484 && 3
Sended: 484
Receiv: 489 && 3
Sended: 489
Receiv: 494 && 3
Sended: 494
Receiv: 499 && 3
Sended: 499
Receiv: 504 && 3
Sended: 504
Receiv: 509 && 3
Sended: 509
Receiv: 770 && 3
Sended: 770
Receiv: 775 && 3
Sended: 775
Receiv: 780 && 3
Sended: 780
Receiv: 785 && 3
Sended: 785
Receiv: 790 && 3
Sended: 790
Receiv: 795 && 3
Sended: 795
Receiv: 800 && 3
Sended: 800
Receiv: 805 && 3
Sended: 805
Receiv: 810 && 3
Sended: 810
Receiv: 815 && 3
Sended: 815
Receiv: 820 && 3
Sended: 820
Receiv: 825 && 3
Sended: 825
Receiv: 830 && 3
Sended: 830
Receiv: 835 && 3
Sended: 835
Receiv: 840 && 3
Sended: 840
Receiv: 845 && 3
Sended: 845
Receiv: 850 && 3
Sended: 850
Receiv: 855 && 3
Sended: 855
Receiv: 860 && 3
Sended: 860
Receiv: 865 && 3
Sended: 865
Receiv: 870 && 3
Sended: 870
Receiv: 875 && 3
Sended: 875
Receiv: 880 && 3
Sended: 880
Receiv: 885 && 3
Sended: 885
Receiv: 890 && 3
Sended: 890
Receiv: 895 && 3
Sended: 895
Receiv: 644 && 3
Sended: 644
Receiv: 649 && 3
Sended: 649
Receiv: 654 && 3
Sended: 654
Receiv: 659 && 3
Sended: 659
Receiv: 664 && 3
Sended: 664
Receiv: 669 && 3
Sended: 669
Receiv: 674 && 3
Sended: 674
Receiv: 679 && 3
Sended: 679
Receiv: 684 && 3
Sended: 684
Receiv: 689 && 3
Sended: 689
Receiv: 694 && 3
Sended: 694
Receiv: 699 && 3
Sended: 699
Receiv: 704 && 3
Sended: 704
Receiv: 709 && 3
Sended: 709
Receiv: 714 && 3
Sended: 714
Receiv: 719 && 3
Sended: 719
Receiv: 724 && 3
Sended: 724
Receiv: 729 && 3
Sended: 729
Receiv: 734 && 3
Sended: 734
Receiv: 739 && 3
Sended: 739
Receiv: 744 && 3
Sended: 744
Receiv: 749 && 3
Sended: 749
Receiv: 754 && 3
Sended: 754
Receiv: 759 && 3
Sended: 759
Receiv: 764 && 3
Sended: 764
Receiv: 1025 && 3
Sended: 1025
Receiv: 1030 && 3
Sended: 1030
Receiv: 1035 && 3
Sended: 1035
Receiv: 1040 && 3
Sended: 1040
Receiv: 1045 && 3
Sended: 1045
Receiv: 1050 && 3
Sended: 1050
Receiv: 1055 && 3
Sended: 1055
Receiv: 1060 && 3
Sended: 1060
Receiv: 1065 && 3
Sended: 1065
Receiv: 1070 && 3
Sended: 1070
Receiv: 1075 && 3
Sended: 1075
Receiv: 1080 && 3
Sended: 1080
Receiv: 1085 && 3
Sended: 1085
Receiv: 1090 && 3
Sended: 1090
Receiv: 1095 && 3
Sended: 1095
Receiv: 1100 && 3
Sended: 1100
Receiv: 1105 && 3
Sended: 1105
Receiv: 1110 && 3
Sended: 1110
Receiv: 1115 && 3
Sended: 1115
Receiv: 1120 && 3
Sended: 1120
Receiv: 1125 && 3
Sended: 1125
Receiv: 1130 && 3
Sended: 1130
Receiv: 1135 && 3
Sended: 1135
Receiv: 1140 && 3
Sended: 1140
Receiv: 1145 && 3
Sended: 1145
Receiv: 1150 && 3
Sended: 1150
Receiv: 899 && 3
Sended: 899
Receiv: 904 && 3
Sended: 904
Receiv: 909 && 3
Sended: 909
Receiv: 914 && 3
Sended: 914
Receiv: 919 && 3
Sended: 919
Receiv: 924 && 3
Sended: 924
Receiv: 929 && 3
Sended: 929
Receiv: 934 && 3
Sended: 934
Receiv: 939 && 3
Sended: 939
Receiv: 944 && 3
Sended: 944
Receiv: 949 && 3
Sended: 949
Receiv: 954 && 3
Sended: 954
Receiv: 959 && 3
Sended: 959
Receiv: 964 && 3
Sended: 964
Receiv: 969 && 3
Sended: 969
Receiv: 974 && 3
Sended: 974
Receiv: 979 && 3
Sended: 979
Receiv: 984 && 3
Sended: 984
Receiv: 989 && 3
Sended: 989
Receiv: 994 && 3
Sended: 994
Receiv: 999 && 3
Sended: 999
Receiv: 1004 && 3
Sended: 1004
Receiv: 1009 && 3
Sended: 1009
Receiv: 1014 && 3
Sended: 1014
Receiv: 1019 && 3
Sended: 1019
Receiv: 1280 && 3
Sended: 1280
Receiv: 1285 && 3
Sended: 1285
Receiv: 1290 && 3
Sended: 1290
Receiv: 1295 && 3
Sended: 1295

CollSpack
CollSpack аватар
Offline
Зарегистрирован: 10.07.2015

ААА. Как отредаткировать пост? Перепутал код на Slave.

Вот код:

#include <Wire.h>

unsigned int Command;
char TwoBytes [2];
double TemperatureToSet;
byte EEPROM_WireAddress = 1;

void receiveEvent(byte bytes) {
  //Прочитать команду
  TwoBytes[0] = NULL;
  TwoBytes[1] = NULL;
  while (!Wire.available()) {
  }
  while (Wire.available()) {
    TwoBytes[0] = Wire.read();
    TwoBytes[1] = Wire.read();
    while (Wire.available()) {
      Wire.read();
    }
  }
  Command = NULL;
  Command = ((unsigned int)TwoBytes[0] << 8) + ((unsigned int)TwoBytes[1]);

  //Записать температуру в TemperatureToSet
  if (Command < 10000 && Command >= 100) {
    TemperatureToSet = (double)Command / 10;
  }
  
  if (Command == 3) {
    Serial.print(" && ");Serial.println(Command);
  }
  else {
    Serial.print("Receiv: ");Serial.print(Command);
  }
}

void requestEvent() {
  //Отправить температуру из TemperatureToSet
  if (Command == 3) {
    Command = TemperatureToSet * 10;
    Wire.write(Command >> 8);
    Wire.write(Command & 0xFF);
    Serial.print("Sended: ");Serial.println(Command);
    Command = NULL;
  }
}


void setup() {
  Serial.begin(115200);
  Wire.begin(EEPROM_WireAddress);
  Wire.setClock(10000);
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
}

void loop() {
}

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Не знаю, как это скажется на решении проблемы, но подумайте над этим фрагментом:

 while (Wire.available()) {
    TwoBytes[0] = Wire.read();
    TwoBytes[1] = Wire.read();
    while (Wire.available()) {
      Wire.read();
    }
  }

Допустим, что первое Wire.available() вернуло 1 байт в буфере...

b707
Offline
Зарегистрирован: 26.05.2017

В коде куча косяков, которые могут дать такой эффект - например проверка на равенство вещественных типов, что запросто может дать FALSE даже если температура принята правильно.

Ну а главное, на мой взгляд - строчки с 8 по 20 приемника. Что это за ерунда - зачем у вас три цикла while? -это получается рулетка, странно что вы вообще что-то получаете при таком коде...

CollSpack
CollSpack аватар
Offline
Зарегистрирован: 10.07.2015

sadman41 пишет:

Не знаю, как это скажется на решении проблемы, но подумайте над этим фрагментом:

 while (Wire.available()) {
    TwoBytes[0] = Wire.read();
    TwoBytes[1] = Wire.read();
    while (Wire.available()) {
      Wire.read();
    }
  }

Допустим, что первое Wire.available() вернуло 1 байт в буфере...

Эта часть эволюционировала од простого

TwoBytes[0] = Wire.read();
TwoBytes[1] = Wire.read();

Ничего не менялось.

b707
Offline
Зарегистрирован: 26.05.2017

CollSpack пишет:

Эта часть эволюционировала од простого

TwoBytes[0] = Wire.read();
TwoBytes[1] = Wire.read();

Ничего не менялось.

ну как хотите - в конце концов проблема у вас, а не у нас. На мой взгляд эта процедура - просто бредятина

CollSpack
CollSpack аватар
Offline
Зарегистрирован: 10.07.2015

b707 пишет:

CollSpack пишет:

Эта часть эволюционировала од простого

TwoBytes[0] = Wire.read();
TwoBytes[1] = Wire.read();

Ничего не менялось.

ну как хотите - в конце концов проблема у вас, а не у нас. На мой взгляд эта процедура - просто бредятина

Вернул к истокам. Все так же шлет мусор.

void receiveEvent(byte bytes) {
  //Прочитать команду
  TwoBytes[0] = NULL;
  TwoBytes[1] = NULL;
  TwoBytes[0] = Wire.read();
  TwoBytes[1] = Wire.read();
  Command = NULL;
  Command = ((unsigned int)TwoBytes[0] << 8) + ((unsigned int)TwoBytes[1]);

  //Записать температуру в TemperatureToSet
  if (Command < 10000 && Command >= 100) {
    TemperatureToSet = (double)Command / 10;
  }
  
  if (Command == 3) {
    Serial.print(" && ");Serial.println(Command);
  }
  else {
    Serial.print("Receiv: ");Serial.print(Command);
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

ну так теперь исправляйте другие ляпы. Вы посылаете в линию четыре байта, а читаете по два. Где гарантия, что прочитанные байты именно первый и второй или третий и четвертый? Как вы в коде отслеживаете вероятность прочитать например, второй байт из команды и первый из температуры?

Ну и еще куча мелких огрехов, которые простот режут глаз - Сравнение на равенство типов double. использование NULL вместо нуля и так далее - поправте хотя бы их, может ситуация станет лучше

b707
Offline
Зарегистрирован: 26.05.2017

CollSpack - подумайте над логикой приемника. Сейчас вы просто читаете из линии два байта и потом принимаете. что это температура. Это логически неверно.

Я бы сделал так - искал бы в принятом потоке комбинацию из 4х байт, первые два из которых - 0х00 0х03. Если таковые нашлись - значит следующие два (без перерывов) за ними - температура.

sadman41
Онлайн
Зарегистрирован: 19.10.2016

b707 пишет:

Сейчас вы просто читаете из линии два байта и потом принимаете. что это температура. 

Даже не так - просто читается что-то, не глядя на: Stream.read() - The first byte of incoming data available (or -1 if no data is available).

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Даже не так - просто читается что-то, не глядя на: Stream.read() - The first byte of incoming data available (or -1 if no data is available).

ооо, точно :) этот косяк я и не заметил...

ну тогда тем более :))))

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Вообще, чтобы убедиться в том, что "мусора на линии нет", можно мастером слать значение нарастающего счётчика,  а слейвом каждый принятый байт печатать (чтобы уж точно не ошибиться в алгоритме). Если вдруг следующий байт будет "непорядочным", то искать проблему в физике/библиотеке (всё же I2C не помехозащищённый протокол). В случае того, если всё будет ОК в простейшей приёмо-передаче, то однозначно - неправильно интерпретируете поступающие данные.

b707
Offline
Зарегистрирован: 26.05.2017

все, похоже ТС завис :)

ща опять нам скажут что тут "бесполезный форум" :)

CollSpack
CollSpack аватар
Offline
Зарегистрирован: 10.07.2015

Не завис, а покуриваю гугл работая на работе.

CollSpack
CollSpack аватар
Offline
Зарегистрирован: 10.07.2015

Блин. Ответ вроде бы под носом лежит но всеровно все одно и то же.

Мастер отсылает по очереди unsigned int Command = (100 - 10000) после отсылает unsigned int Command = 3. Команда 3 говорит что слейв при следующем запросе должен отправить температуру как unsigned int Command = (100 - 10000).

3 - всегда приходит! Без мусора! 100-10000 - приходит с переменным успехом. Не могу понять почему так сложно отправить 2 байта? И почему нету нормальных примеров и библиотек чтобы разобрать их и научиться! Откуда берется рассинхрон в передаче? Сначала все работает, потом перестает. Уже и аппаратно сделал так, что не приколупаешся.

На команды нужно именно 2 байта. В реальной программе будет много команд, которые вполне вмещаются в unsigned int. Передавать 4 байта? Чтоб мусора в 2 раза больше было?

У меня уже психоз начинается. =(

b707
Offline
Зарегистрирован: 26.05.2017

попробуйте все же подумать над тем, что написал вам садман41

Я вам чуть подскажу - вы читаете байты из шины, не проверяя, пришли ли они или нет. Если байты пришли - у вас читаетеся верно, а если еще нет - вы читаете из шины мусор (точнее. читаете число -1, но после преобразования в температуру получается мусор)

b707
Offline
Зарегистрирован: 26.05.2017

Отложите пока свою температуру, сделайте то, что вам посоветовали в сообщении #11. Когда наладите там прием без ошибок - расширите пример на свои данные

CollSpack
CollSpack аватар
Offline
Зарегистрирован: 10.07.2015

Вот же ж хрень такая! Решил посмотреть какие значения приходят.

TwoBytes[0] = Wire.read();
TwoBytes[1] = Wire.read();
Serial.println(TwoBytes[0], HEX);
Serial.println(TwoBytes[1], HEX);

1250 приходит как 0 и 7D, а 1300 приходит как 0 и FFFFFF82.

Поменял char TwoBytes [2]; на byte TwoBytes [2]; и проблемы как небыло!

Дело было в том что диапазон char -128 до 127, а unsigned char или byte 0 - 255. Собственно сама Wire.read() возвращает 0-255.

Может я чего-то не понимаю, но как char может принять в себя FFFFFF82?

b707
Offline
Зарегистрирован: 26.05.2017

CollSpack пишет:

Поменял char TwoBytes [2]; на byte TwoBytes [2]; и проблемы как небыло!

"Не обманывай себя, Маша!" (с)

Проблемы. о которых писали выше мы с Садманом - никуда не делись. Их все равно надо решать....