2014-02-06 2 views
1

나는 arduino에서 일하고 있는데, 나는 웹 서비스에서 들어오는 char를 저장하고 싶다. 코드는 그 자체로 설명합니다 : 모두 잘 작동루프 함수의 스톡 들어오는 문자

void loop() { 
    if (wifly.avaible()) { 
     char c = wifly.read(); 
     Serial.print(c); 
    } 
} 

, 모든 문자가 기록됩니다

void loop() { 
    static int i = 0; 
    static int count = 0; 
    static char tmp[100]; 

    if (wifly.avaible()) { 
     char c = wifly.read(); 
     Serial.print(c); 
     tmp[i] = c; 
     i++; 
     if (c == '"') 
     count++; 
     if (count == 2) 
     { 
     Serial.print("Received : "); 
     Serial.println(tmp); 
     } 
    } 
} 

난 단지이 코드를 할 경우. 하지만 전체 문자열을 구문 분석하기 위해 들어오는 모든 문자를 저장해야합니다.

재고를 확보하려고 할 때 프로그램이 작동을 멈추고 아무 것도 쓸 수없는 이유가 있습니까?

+1

일단 101 번째 문자를 얻으면 버퍼 오버 플로우가 발생 했나요? – Jarod42

+1

서비스에서 최대 99자를받을 수 있습니까? 버퍼 오버 플로우를 막을 수있는 코드는 없습니다. – suspectus

+0

아마도 관련이 없지만, 끝나면'i'와'count'를 0으로 재설정해야합니다. – molbdnilo

답변

0

버퍼 오버 플로우로부터 보호해야합니다. 버퍼 tmp은 0 값 바이트로 끝나야합니다. tmp은 정적이므로 0으로 채워집니다. 버퍼의 마지막 바이트가 0 값으로 종료되도록 센티넬 값 (BufferMaxChars)을 사용하십시오.

여기서 추측하고 있습니다.하지만 따옴표로 묶인 문자열 값을 출력하고 싶을 수도 있습니다. 이 경우 tmp 버퍼는 한 번 count == 1 (첫 번째 따옴표가 발견되었을 때)에만 할당됩니다.

void loop() { 
    const int BufferMaxChars = 100-1; 
    static int i = 0; 
    static int count = 0; 
    static char tmp[BufferMaxChars]; 

    if (wifly.avaible()) { 
     char c = wifly.read(); 
     Serial.print(c); 
     tmp[i] = c; 
     i++; 
     if (c == '"') 
     count++; 
     if (i >= BufferMaxChars || count == 2) 
     { 
     Serial.print("Received : "); 
     Serial.println(tmp); 
     } 
    } 
} 
+0

늦게 승인을해서 죄송합니다. 하지만 네가 옳고 바보 같았 어. 나는 .. 버퍼 오버 플로우 였어. 고마워요! – carndacier

+0

다행스럽게도 우리 모두 비슷한 실수를 저질렀습니다! – suspectus