2014-11-06 5 views
1

이것은 C++ newbie 질문입니다. 나는 블루투스 저에너지 UART 통보를 전송하기 위해 다음과 같은 Arduino 스케치를 가지고있다.문자열에서 부호없는 char *로 캐스팅 쓰레기 수거

command이 5자인 경우 블루투스 수신기 쪽에서 5 문자를 얻습니다. 그러나 한 문자 명령으로 5 문자 command을 따라 가면받은 문자는 이전 문자 인 command의 마지막 3 문자가옵니다.

예는

command-1,0t이다. 내가받는 것은 -1,0t입니다. 그러나 다음 command은 단지 r입니다. 내가받는 것은 r,0t입니다.

여기가 어떻게됩니까? "r"은 어떻게 얻나요?

int BLEsend(String command){ 
    byte length = sizeof(command);  
    unsigned char* notification = (unsigned char*) command.c_str(); // cast from string to unsigned char* 
    Serial.print(length); 
    BLE.sendData(UART_SEND, notification, length); 
    Serial.print("Notification Sent: "); Serial.println(command); 
    delay(100); 
    return 1; 
} 
+7

주'를 sizeof (명령)'* * 당신에게 문자열의 길이를 제공하지 않습니다. ['length'] (http://arduino.cc/en/Reference/StringLength) 멤버 함수를 사용해야합니다. –

+0

그게 문제 였어! 감사. 대답을 적어주세요. 받아 들일 것입니다. (나는 바보처럼 느껴진다.) – Chirantan

답변

0

sizeof()은 문자열의 길이를 알려주지 않습니다.

대신 int length = command.length();을 사용할 수 있습니다.

command.size();도 잘 작동합니다.

+0

"오래된"것이 아닙니다. 중복성 및 결함을 포함합니다. (a)'std :: string'이 이미 길이를 캐시 할 때 길이를 찾기 위해 문자열을 트래버스 할 필요가 없습니다. 그래서 그 접근법은 O (1) 대신에 O (n)입니다. (b) 문자열은 바이너리 안전하지만'strlen' 길이 계산 기법은 그렇지 않습니다. ..... 간단히 말해서 우리가 오래 전에 그런 종류의 것들을 포기한 _ 이유가 있습니다. 우리는 시간의 임의적 인 통과 때문에 그것을하지 않습니다. 게다가,'strlen (someCString)'은 "오래된"하지만'strlen (aCPlusPlusString.c_str())'은 바보 같았습니다. –

+0

@ LightnessRacesinOrbit 당신은 항상 내 답변에서 그것을 제거했습니다. 더 이상 이것을 가르치지 않는 것이 좋습니다. – deW1

0

당신은 notification에 문자열 command.c_str()을 복사 할 수도 필요

notification = new char[length + 1]; 
strcpy(notification , command.c_str()); 
관련 문제