Пример "парсинга"-разбора команд есть в PROTEUS в папке SAMPLES\VSM MPLAB Viewer\App Notes\AN696 Это апноут микрочип \\\\\\\\\\\\\\ кучачек из исходника //-------------- Краткий курс по микроконтроллерам www.avr123.nm.ru // DoCommand() // Processes incoming USART data. //------------------------------------------------------------------- void DoCommand(void) { if(comcount == 0) // If this is the first parameter of the input { // command... switch(inpbuf[0]) { case 'X': parameter = DIST; // Segment distance change break; case 'V': parameter = VEL; // Segment velocity change break; case 'A': parameter = ACCEL; // Segment acceleration change break; case 'T': parameter = TIME; // Segment delay time change break; case 'P': parameter = 'P'; // Change proportional gain break; case 'I': parameter = 'I'; // Change integral gain break; case 'D': parameter = 'D'; // Change differential gain break; case 'L': parameter = 'L'; // Loop a range of segments break; case 'S': stat.run = 0; // Stop execution of segments break; case 'G': parameter = 'G'; // Execute a range of segments break; case 'W': if(PORTEbits.RE2) // Enable or disable motor { // driver IC putrsUSART("\r\nPWM On"); PORTEbits.RE2 = 0; } else { putrsUSART("\r\nPWM Off"); PORTEbits.RE2 = 1; } break; default: if(inpbuf[0] != '\0') { putrsUSART(badcmd); } break; } } else if(comcount == 1) // If this is the second parameter of the { // input command. if(parameter < 4) segnum = atob(inpbuf); else switch(parameter) { case 'P': kp = atoi(inpbuf); // proportional gain change ExtEEWrite(122, kp); // Store value in EEPROM break; case 'I': ki = atoi(inpbuf); // integral gain change ExtEEWrite(124, ki); // Store value in EEPROM break; case 'D': kd = atoi(inpbuf); // differential gain change ExtEEWrite(126, kd); // Store value in EEPROM break; case 'G': firstseg = atob(inpbuf); break; // Get the first segment in // the range to be executed. case 'L': firstseg = atob(inpbuf); break; default: break; } } else if(comcount == 2) { if(!stat.run) // If no profile is executing { if(parameter < 4) // If this was a segment parameter { // change. if(segnum < 12) { // Write the segment paramater into data memory segment1[segnum][parameter] = atoi(inpbuf); // Compute EEPROM address and write data to EEPROM eeadr = (segnum << 3) + (parameter << 1); ExtEEWrite(eeadr, segment1[segnum][parameter]); } else if(segnum < 24) // Write segment parameter data into data memory segment2[segnum - 12][parameter] = atoi(inpbuf); } else switch(parameter) { case 'G': lastseg = atob(inpbuf); // Get value for segnum = firstseg; // last segment. stat.loop = 0; stat.run = 1; // Start profile. break; case 'L': lastseg = atob(inpbuf); // Get value for segnum = firstseg; // last segment. stat.loop = 1; // Enable looping stat.run = 1; // Start profile break; default: break; } } } }