Доброго времени суток! Есть код, который должен принимать команды через (UART) Код (C++): #define RAPI_BUFLEN 13 int LAMP_STATE = 0; class RAPI { int m_RAPIinByte; // RAPI byte being read in char m_RAPIinstr[RAPI_BUFLEN]; // RAPI byte being read in int m_RAPIstrCount; //RAPI string counter public: RAPI(); void Init(); void flush() { Serial.flush(); } void getInput(); uint8_t getInt(); }; RAPI g_RAPI; RAPI::RAPI() { m_RAPIstrCount = 0; } void RAPI::Init() { g_RAPI.flush(); } uint8_t RAPI::getInt() { uint8_t c; uint8_t num = 0; do { c = Serial.read(); // read the byte if ((c >= '0') && (c <= '9')) { num = (num * 10) + c - '0'; } } while (c != 13); return num; } void RAPI::getInput() { if(Serial.available()) { // if byte(s) are available to be read m_RAPIinByte = Serial.read(); // read the byte Serial.print(char(m_RAPIinByte)); digitalWrite(13, HIGH); if(m_RAPIinByte != 13) { m_RAPIinstr[m_RAPIstrCount] = char(m_RAPIinByte); m_RAPIstrCount++; } if(m_RAPIinByte == 13) { if (strcmp(m_RAPIinstr, "$ST 1") == 0){ //if match LAMP_STATE = 1; } else if (strcmp(m_RAPIinstr, "$ST 2") == 0) { // string compare LAMP_STATE = 2; } g_RAPI.flush(); m_RAPIstrCount = 0; // get ready for new input... reset strCount m_RAPIinByte = 0; // reset the inByte variable digitalWrite(13, LOW); for(int i = 0; m_RAPIinstr[i] != '\0'; i++) { // while the string does not have null m_RAPIinstr[i] = '\0'; // fill it with null to erase it } } } } void setup() { pinMode(9, OUTPUT); pinMode(13, OUTPUT); Serial.begin(9600); } void loop() { { g_RAPI.getInput(); } if(LAMP_STATE == 0) { digitalWrite(9, LOW); } if (LAMP_STATE == 1) { digitalWrite(9, HIGH); } if (LAMP_STATE == 2) { digitalWrite(9, LOW); } } Загружаю скетч, открываю последовательный порт и ввожу команды типа $ST 1 / $ST 2, но никаких действий не происходит, должен был загореться светодиод на 9 пине. На UNO во время ввода команды подмаргивает RX/TX. В чем проблема?
В свое время я так собирал строку по сериал порту: Код (C++): String inputString = ""; // a string to hold incoming data boolean stringComplete = false; // whether the string is complete void setup() { Serial.begin(115200); } void loop() { if (stringComplete) { boolean flagADC=false; boolean flagSweep=false; if (inputString.substring(0,1)=="!") {flagADC=true; flagSweep=false;} //ADC if (inputString.substring(0,1)=="?") {flagADC=false; flagSweep=true;} //SWEEP inputString = inputString.substring(1,inputString.length()-1); if (flagADC) {workADC();} if (flagSweep) {workSWEEP();} inputString = ""; stringComplete = false; } } void serialEvent() { while (Serial.available()) { char inChar = (char)Serial.read(); inputString += inChar; if (inChar == ':') {stringComplete = true;} } } Во входящей строке символ ":" означает конец строки, поэтому я его жду в serialEvent, поэтому же я его отрезаю в loope. SerialEvent это прерывание. ps. кажется, подсмотрено из примера)
Одна из проблем -- терминал, который используется на PC для отправки данных в последовательный порт, не отправляет символ новой строки (\n). В скетче символ новой строки используется как разделитель команд.