Помогите пожалуйста с управлением Сделал приложение и написал код все вроде работает но иногда после регулировки ползунками кнопки срабатывают с трудом Может я не правильно метку ползунка отправляю. Так как загрузил скетч SoftwareSerialExample кнопки отрабатывают четко а с ползунков приходит что то непонятное Хотя значения типа EpromSpeed[0] меняются как положено. Блоки Inventor на скриншоте Код (C++): #include <SoftwareSerial.h> SoftwareSerial softSerial(2, 3); byte key() { if (softSerial.available()) { int valserial = softSerial.read(); if (valserial == 'W') { //Up return 1; } else if ( valserial == 'S') { //Down return 2; } else if ( valserial == 'A') { //Left return 3; } else if ( valserial == 'D') { //Right return 4; } else if ( valserial == 'B') { // Set return 5; } else if ( valserial == 'T') { // DolRight return 6; } else if ( valserial == 'R') { //DolLeft return 7; } else if ( valserial == 'L') { //PanRight return 8; } else if ( valserial == 'Y') { //PanLeft return 9; } else if ( valserial == 'G') { //TiltUp return 10; } else if ( valserial == 'J') { //TiltDown return 11; } else if ( valserial == 'K') { //Calibration return 12; } else if ( valserial == 'Z') { EpromSpeed[0] = softSerial.read(); return 20; } else if ( valserial == 'P') { EpromAcceleration[0] = softSerial.read(); return 21; } else if ( valserial == 'U') { EpromSpeed[1] = softSerial.read(); return 22; } else if ( valserial == 'V') { EpromAcceleration[1] = softSerial.read(); return 23; } else if ( valserial == 'I') { EpromSpeed[2] = softSerial.read(); return 24; } else if ( valserial == 'Q') { EpromAcceleration[2] = softSerial.read(); return 25; } // delay(1); } else return 0; } void setup() { Serial.begin(9600); softSeria.begin(38400); } void loop() { Serial.print("SPEED"); Serial.println(EpromSpeed[1]); Serial.print("KEY"); Serial.println(KEY); } https://disk.yandex.ru/i/ln52xj_FfLUl4Q
Что я делаю не так? Помогите с протоколом приема! Проверяю SoftwareSerialExample приходит как положено метка разделитель значение и конц строки 6$108; А в скетче меняется только первое значение и то криво. Код (C++): #include <SoftwareSerial.h> SoftwareSerial softSerial(2, 3); int EpromAcceleration[] = {0, 0, 0}; int EpromSpeed[] = {0, 0, 0}; char divider = '$'; char ending = ';'; const char *headers[] = { "slide1", // 0 "slide2", // 1 "slide3", // 2 "slide4", // 3 "slide5", // 4 "slide6", // 5 }; enum names { SLAIDER1, // 0 SLAIDER2, // 1 SLAIDER3, // 2 SLAIDER4, // 3 SLAIDER5, // 4 SLAIDER6, // 5 }; names thisName; byte headers_am = sizeof(headers) / 2; uint32_t prsTimer; String prsValue = ""; String prsHeader = ""; enum stages {WAIT, HEADER, GOT_HEADER, VALUE, SUCCESS}; stages parseStage = WAIT; boolean recievedFlag; void parsingSeparate() { if (softSerial.available() > 0) { if (parseStage == WAIT) { parseStage = HEADER; prsHeader = ""; prsValue = ""; } if (parseStage == GOT_HEADER) parseStage = VALUE; char incoming = (char)softSerial.read(); if (incoming == divider) { parseStage = GOT_HEADER; } else if (incoming == ending) { parseStage = SUCCESS; } if (parseStage == HEADER) prsHeader += incoming; else if (parseStage == VALUE) prsValue += incoming; prsTimer = millis(); } if (parseStage == SUCCESS) { for (byte i = 0; i < headers_am; i++) { if (prsHeader == headers[i]) { thisName = i; } } recievedFlag = true; parseStage = WAIT; } if ((millis() - prsTimer > 50) && (parseStage != WAIT)) { // таймаут parseStage = WAIT; } } byte key() { if (softSerial.available()) { int valserial = softSerial.read(); if (valserial == 'W') { //Up return 1; } else if ( valserial == 'S') { //Down return 2; } else if ( valserial == 'A') { //Left return 3; } else if ( valserial == 'D') { //Right return 4; } else if ( valserial == 'B') { // Set return 5; } else if ( valserial == 'T') { // DolRight return 6; } else if ( valserial == 'R') { //DolLeft return 7; } else if ( valserial == 'L') { //PanRight return 8; } else if ( valserial == 'Y') { //PanLeft return 9; } else if ( valserial == 'G') { //TiltUp return 10; } else if ( valserial == 'J') { //TiltDown return 11; } else if ( valserial == 'K') { //Calibration return 12; } else { parsingSeparate(); } } else return 0; } void setup() { softSerial.begin(38400); Serial.begin(9600); } void loop() { byte KEY = key(); if (KEY != 0) { Serial.print("KEY= "); Serial.println(KEY); } if (recievedFlag) { recievedFlag = false; switch (thisName) { case SLAIDER1: EpromSpeed[0] = prsValue.toInt(); Serial.print("slide1 "); Serial.println(EpromSpeed[0]); break; case SLAIDER2: EpromAcceleration[0] = prsValue.toInt(); Serial.print("slide2 "); Serial.println(EpromAcceleration[0]); break; case SLAIDER3: EpromSpeed[1] = prsValue.toInt(); Serial.print("slide3 "); Serial.println(EpromSpeed[1]); break; case SLAIDER4: EpromAcceleration[1] = prsValue.toInt(); Serial.print("slide4 "); Serial.println(EpromAcceleration[0]); break; case SLAIDER5: EpromSpeed[2] = prsValue.toInt(); Serial.print("slide5 "); Serial.println(EpromSpeed[2]); break; case SLAIDER6: EpromAcceleration[2] = prsValue.toInt(); Serial.print("slide6 "); Serial.println(EpromAcceleration[2]); break; } } }
1. <thisName = i;> thisName это enum, i это byte. Так можно? Об этом компилятор должен предупреждать. 2. Красота c return в <byte key()> может вернуть ничего. Скорее всего и тут компилятор ругается. 3. Не факт, что после исправления 1 и 2 все заработает.