산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

간단한 명령줄 인터페이스

구성품 및 소모품

Arduino UNO
× 1

이 프로젝트 정보

명령줄

센서의 값을 찾아야 하거나 로봇에게 "왼쪽으로 이동"과 같은 작업을 수행하도록 지시하려는 경우가 있습니다. 프로그램에 변수의 런타임 값을 요청하거나 디지털 전위차계의 값을 설정해야 할 수도 있습니다.

필요한 것은 명령줄입니다. 예, Arduino가 텍스트 명령에 응답하도록 하는 것은 쉽습니다.

여기에 구축할 수 있는 항목이 있습니다. 간단하고 빠르며 메모리 효율성이 매우 높은 명령줄 인터페이스 (CLI)를 사용하여 몇 분 안에 잘라서 자신의 코드에 붙여넣고 실행할 수 있습니다. 명령은 이름과 여러 인수로 구성됩니다. 명령을 입력할 때 백스페이스도 지원합니다.

빠른 개요

모든 스케치에는 loop()가 있습니다. 기능. 다음과 같이 간단할 수 있습니다. CommandLine.h라는 별도의 탭에서 두 개의 루틴을 호출합니다. . 이 두 파일을 통해 안내해 드리겠습니다. 그러면 바로 사용할 수 있습니다.

루프

기능: 매번 loop() 실행하여 직렬 포트에서 명령이 있는지 확인하고 getCommandLineFromSerialPort()를 호출합니다. . CommandLine 변수 CommandLine.h에 선언되어 있습니다. 하지만 스타일적으로는 메인 루프 탭으로 옮기고 싶을 수도 있습니다. 전체 명령이 직렬 포트에 도착하고 명령 버퍼에 복사된 경우:

 char commandLine[COMMAND_BUFFER_LENGTH + 1]; 

그런 다음 loop() DoMyCommand() 호출 적절한 명령을 실행합니다.

이제 CommandLine.h에 무엇이 있는지 살펴보겠습니다. . 모든 코드를 CommandLine.h에 넣었음을 지적해야 합니다. , 왜냐하면 이 코드를 잘라내어 Arduino IDE의 새 탭에 붙여넣기만 하면 되기 때문입니다(탭에 ".h로 끝나는 이름을 지정해야 합니다. "). 그런 다음 이 파일을 기본 파일, 즉

에 포함합니다.
 #include "CommandLine.h" 

이렇게 하면 모든 명령줄 코드를 하나의 탭에 넣고 추가 코드 없이 프로그램의 다른 곳에서 해당 루틴을 참조할 수 있습니다.

CommandLine.h에서 보기

CommandLine.h 파일 이 게시물의 끝에 포함되어 있습니다. CommandLine.h 내 , 수정해야 하는 각 줄은 //Modify here 주석으로 표시됩니다. . 파일에는 두 개의 샘플 명령 add이 포함되어 있습니다. 및 하위 DoMyCommand 내에서 어떻게 호출되는지 보여줍니다. .

많은 분들이 필요로 하는 전부입니다. CommandLine.h를 살펴보세요. . 좀 더 자세히 보고 싶은 분들은 계속 읽어주세요.

자세히 보기

CommandLine.h 내 먼저 를 포함합니다. . 문자열.h C 표준 라이브러리입니다. . C 라이브러리를 접해본 적이 없다면 "C 프로그래밍 언어"에 대한 빠른 인터넷 검색을 수행하십시오. C 성경은 몇 년 전에 Brian Kernigan과 Dennis Ritchie에 의해 작성되었으며 최신 상태로 유지되었습니다. 대부분의 사람들이 사본을 소유하고 있지만 온라인에서 무료로 찾을 수 있습니다.

strtok()만 사용합니다. 의 루틴(문자열에서 토큰으로) . 이 루틴은 토큰, 즉 특정 문자로 구분된 단어(strtok의 두 번째 매개변수)를 읽습니다. ). 이렇게 작동합니다.

<울>
  • 처음 호출할 때 ptr 문자열을 전달합니다. 첫 번째 토큰을 반환합니다.
  • <울>
  • 다음 호출에서 (여기에 영광스러운 해킹 부분이 있음) 문자열 ptr 대신 NULL을 전달합니다. 초기 문자열에서 중단된 위치에서 계속되므로 한 번에 하나의 토큰(대략 단어)을 얻습니다.
  • 도 포함됩니다. 여기서 atoi()만 사용합니다. ASCII에서 정수로의 변환을 위해. 걱정하지 마십시오. 컴파일러는 전체 라이브러리가 아닌 이 하나의 루틴만 포함하지만 유용하므로 이 라이브러리의 다른 루틴을 확인하는 것이 좋습니다.

    다음은 내가 작성한 print2:라는 작은 선택적 매크로입니다.

    #define print2(x,y) (Serial.print(x), Serial.println(y) 

    나는 항상 레이블과 문자열을 인쇄하고 싶습니다. 다음과 같이 사용합니다.

    print2("myVar =", myVar); 

    myVar가 25이면 직렬 창에 인쇄됩니다.

    myVar =25 

    CommandLine.h getCommandLineFromSerialPort() 포함 직렬 포트에서 명령줄을 어셈블합니다. 호출될 때마다 직렬 포트에서 읽고 입력을 전역 입력 버퍼인 CommandLine[]에 저장합니다. . return에 도달하면 true를 반환하는 명령의 끝을 나타내는 문자 .

    완전히 어셈블된 버퍼는 이제 DoMyCommand()에 전달됩니다. 사용자가 요청한 기능을 파악하고 호출합니다. 많은 수의 명령을 사용하면 상당히 다루기 힘든 if-the-else 문을 얻을 수 있습니다.

    정말 엄청난 수의 명령이 있는 경우 해싱 기능을 채택하는 것과 같이 속도를 높일 수 있는 방법이 많이 있습니다. 또는 명령을 한 문자로만 만든 다음 해당 문자를 switch-case 문의 레이블로 사용할 수 있습니다. 나는 이것들 중 어느 것도 매우 자주 필요하지 않다는 것을 발견합니다. 단어는 단일 문자보다 훨씬 기억하기 쉽고 이것이 Arduino라는 점을 감안할 때 칩의 공간이 다 떨어지기 전에 실제로 얼마나 많은 명령을 가질 수 있습니까?

    추가 및 하위

    각 명령 함수는 자체 인수를 구문 분석할 책임이 있습니다. 이것은 그것을 수행하는 간단한 방법이며 쉽게 수정할 수 있습니다. 이에 대한 대안은 DoMyCommand에서 모든 인수를 즉시 읽는 것입니다. . 개별 인수를 문자열 argv[]의 전역 배열에 넣을 수 있습니다. .

    이 예제의 목적을 위해 두 개의 명령을 정의했습니다. add하위 . 둘 다 숫자 인수를 사용하지만 readWord를 포함했습니다. (readStringToken이라고 부를 수 있습니다. ) 단어를 반환합니다. 이 readStringToken을 수정할 수도 있습니다. "이것은 문자열입니다와 같은 문자열을 허용합니다. ". 독자에게 맡겨진 연습이라고 생각하세요.

    가장 빠르게 달리는 방법

    위와 같은 메인 루프 파일이 있다면 아두이노 IDE 창 오른쪽에 아래쪽 삼각형을 이용하여 새 탭을 만들고 CommandLine.h를 복사합니다. (아래) 파일에 add를 입력할 수 있어야 합니다. 및 하위 명령.

    이제 당신에게 달려 있습니다!

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Arduino용 간단한 명령줄 해석기
  • ArduinoC/C++용 간단한 명령줄 해석기
    Arduino 스케치에 간단한 명령줄을 추가하려면 이 기사 또는 코드의 주석을 참조하십시오.

    다음과 같은 명령을 추가할 수 있습니다.
    5, 10을 더하다
    10, 5 빼기

    또는 기타 필요한 것<사전>/******************************************** ******************************** CommandLine 사용 방법:스케치를 만듭니다. 아래에서 샘플 설정 및 기본 루프 코드를 찾아 복사하여 새 스케치에 붙여넣습니다. 새 탭을 만듭니다. (Arduino 편집기의 맨 오른쪽에 있는 드롭다운 메뉴(작은 삼각형)를 사용합니다. 탭 이름을 CommandLine.h로 지정합니다. 이 파일을 여기에 붙여넣습니다. 테스트:평소와 같이 Arduino에 방금 생성한 스케치를 다운로드하고 직렬 창을 엽니다. 다음 명령을 입력한 다음 return:add 5, 10 빼기 10, 5 포함된 더하기 및 빼기 명령을 보고 직접 작성하십시오!********************* ************************************************** *************************************************************************************************************************************************************** **************************************** 간단하고 명확한 명령줄 해석기 이 파일은 다음을 허용합니다. 직렬 창에 명령을 입력하려면 Arduino에서 실행 중인 스케치에 23,599 blink 5 playSong 어제를 추가하고 실행하십시오. 인터프리터, 당신도 공간이 부족하고 String 객체는 공간이 비효율적인 경향이 있습니다. 1) 단순 프로토콜 명령은 공백이나 쉼표로 구분된 단어와 숫자입니다. 첫 번째 단어는 명령이고, 각 추가 단어는 인수입니다. "\n"은 각 명령을 종료합니다. 2) C 라이브러리 루틴 strtok 사용:명령은 다음으로 구분된 단어입니다. 공백 또는 쉼표. 공백이나 쉼표와 같은 특정 문자로 구분된 단어를 토큰이라고 합니다. 토큰을 하나씩 얻으려면 C lib 라우팅 strtok을 사용합니다(C stdlib.h의 일부는 아래에서 포함하는 방법 참조). 온라인에서 찾을 수 있는 C 언어 라이브러리 의 일부입니다. 기본적으로 당신은:1) 문자열(그리고 사용하는 구분 기호, 즉 공백 및 comman)을 전달하고 문자열에서 첫 번째 토큰을 반환합니다. 2) 후속 호출에서 NULL(문자열 ptr 대신)을 전달하면 초기 문자열로 중단된 곳에서 계속합니다. 몇 가지 기본 도우미 루틴을 작성했습니다. readNumber:strtok 및 atoi(atoi:ascii에서 int로, 다시 C stdlib.h의 일부)를 사용하여 정수를 반환합니다. atoi는 int를 반환하고 uint8_t와 같은 1바이트 int를 사용하는 경우 lowByte()를 가져와야 합니다. readWord:텍스트 단어에 대한 ptr을 반환합니다. 4) DoMyCommand:각 명령에 대한 if-then-else 목록입니다. 모든 명령이 단일 문자인 경우 이를 case 문으로 만들 수 있습니다. 단어를 사용하면 더 읽기 쉽습니다. 이 예제의 목적을 위해 다음이 있습니다. Add Subtract nullCommand*//******************샘플 메인 루프 코드 ************* *********************** #include "CommandLine.h" void setup() { Serial.begin(115200); } 무효 루프() { 부울 수신 =getCommandLineFromSerialPort(CommandLine); //전역 CommandLine은 CommandLine.h에 정의되어 있습니다. if (received) DoMyCommand(CommandLine); }**************************************************** *********************************///이 탭의 이름을 다음과 같이 지정합니다. CommandLine.h#include #include //다음 매크로는 디버깅에 좋습니다. 예를 들어 print2("myVar=", myVar);#define print2(x,y) (Serial.print(x), Serial.println(y))#define CR '\r'#define LF '\n'#define BS '\b'#define NULLCHAR '\0'#define SPACE ' '#define COMMAND_BUFFER_LENGTH 25 // 들어오는 명령에 대한 직렬 버퍼 길이char CommandLine[COMMAND_BUFFER_LENGTH + 1]; // 직렬에서 이 버퍼로 명령을 읽습니다. 종료에 대한 길이 +1 charconst char *delimiters =", \n"; //명령은 리턴, 공백 또는 쉼표로 구분할 수 있습니다./**************************************** ************************************************** ********************** 여기에 명령 이름을 입력하세요.*/const char *addCommandToken ="add"; //여기서 수정 const char *subtractCommandToken ="sub"; //여기서 수정/************************************************ ************************************************** ************** getCommandLineFromSerialPort() 다음 명령의 문자열을 반환합니다. 명령은 반환으로 구분됩니다." BackSpace 문자 처리 모든 문자를 소문자로 만듭니다.**************************************** ************************************************** **********************/boolgetCommandLineFromSerialPort(char * commandLine){ static uint8_t charsRead =0; //참고:COMAND_BUFFER_LENGTH는 255자 미만이어야 합니다 // 전체 명령이 입력될 때까지 비동기적으로 읽기 while (Serial.available()) { char c =Serial.read(); switch (c) { case CR://지금 버퍼에 전체 명령이 있을 가능성이 높으므로 명령은 CR 및/또는 LS 경우 LF:commandLine[charsRead] =NULLCHAR; //null은 우리의 명령 char 배열을 종료합니다. if (charsRead> 0) { charsRead =0; //charsRead는 정적이므로 Serial.println(commandLine)을 재설정해야 합니다. return true; } break; case BS:// 입력에서 백스페이스 처리:마지막 char에 공백을 넣습니다. if (charsRead> 0) { //commandLine 및 charsRead 조정 commandLine[--charsRead] =NULLCHAR; Serial < 합계는 =", 결과); } else { if (strcmp(ptrToCommandName,subtractCommandToken) ==0) { //여기서 수정 result =subtractCommand(); //K&R string.h pg. 251회 } else { nullCommand(ptrToCommandName); } }}

    제조공정

    1. C# 주석
    2. C# 인터페이스
    3. 자바 인터페이스
    4. 무선 진입로 센서에 대한 인터페이스
    5. 디지털 인터페이스가 있는 간단한 아날로그 근접 센서(Raspberry Pi용) [최종 업데이트:2014년 2월 7일]
    6. ANDY:다목적 "인간형" 로봇
    7. 간단한 파이 로봇
    8. C - 명령줄 인수
    9. C# - 인터페이스
    10. 철강 코일 슬리 팅 라인이란 무엇입니까?