2012-04-09 3 views
3

제발 저를 참아주세요. 저는 C에서 새로운데, 저는 Arduino를 프로그래밍하려고합니다. 0-255 범위의 바이트 값을 특정 길이의 데이터 프레임 밖으로 뱉어 프로그램을 작성하고 싶습니다. 오류를 재현하는 최소 코드는 아래 코드 블록에 있습니다. 오류 : 'char *'에서 'char'로의 변환이 올바르지 않습니다.

sketch_apr09b.cpp: In function ‘char assembleFrame()’: 
sketch_apr09b.cpp:9:10: error: invalid conversion from ‘char*’ to ‘char’ 

지금 내 느낌이 나는 '반환 프레임을'학대하고있어 것입니다,하지만 난 그냥 뭐가 잘못 알아낼 수 없습니다 : 컴파일 할 때 나는 다음과 같은 오류가 발생합니다. 나는 수신 PC의 16 진 덤프를 실행하면

char assembleFrame() { 
    char frame[] = { 
    0x61 , 0x62 , 0x63 
    }; 
    return frame; 
} 

void setup() { 
    Serial.begin(115200); 
}; 

void loop() { 
    char frame = assembleFrame(); 
    Serial.print(frame); 
} 

, 내가보고 싶어 :

00000000 61 62 63           |abc| 
00000003 

내가 비슷한 질문을 많이 발견했습니다, 난 무엇을 알아낼 수 없습니다 잘못하고있다.

편집 : 이것은 내가 지금까지 생각해 냈지만 잘못된 데이터를받는 것입니다. 나는 이것으로 실제 데이터에 포인터를 보내고 있다고 생각한다.

byte *assembleFrame() { 
    byte frame[] = { 4 , 'a' , 'b' , 'c' }; 
    return frame; 
} 

void setup() { 
    Serial.begin(115200); 
}; 

void loop() { 
    byte *frame = assembleFrame(); 
    Serial.write(frame , frame[ 0 ]); 
} 

답변

3

char 유형은 단일 char (바이트)을 저장하는 데 사용됩니다.

귀하의 함수 정의 char assembleFrame이 기능은 하나의 char 반환됩니다 지정, 그래서 당신은 char[]/char * (char 배열/포인터)을 반환하려고하면 실패합니다.

Serial.print()char *을 처리 할 수 ​​있으며, 길이 지정자를 요구하지 않으므로 null 종료 될 수 있습니다.

char *assembleFrame() { 
    char frame[] = { 
    0x61, 0x62, 0x63, 0x00 // null byte to signify end of string 
    }; 
    return frame; 
} 

void setup() { 
    Serial.begin(115200); 
}; 

void loop() { 
    char *frame = assembleFrame(); 
    Serial.print(frame); 
} 
+0

이 코드는 컴파일되며, 내가 잘못한 것을 봅니다. 나는 char * assembleFrame() 대신에'char * assembleFrame()'을 타이핑했다. 하지만 이제는 새로운 문제가 생겼습니다. 페이로드에 null 바이트가 포함될 수 있으므로 null로 끝나는 문자열을 사용할 수 없습니다. 고정 크기는 문제가되지 않습니다. 그렇게 쉽게 해결할 수 있습니까? (귀하의 회신에 대해 언급하면서 나는 DuckDuckGo에 갈 기회가 없었지만 지금 당장 그것을 할 것입니다). – jippie

+0

한 번에 하나씩'Serial.write() '에 바이트를 보낼 수 있는데, 이는 널을 허용해야합니다. 어쩌면'assembleFrame' 프레임을 버퍼 (문자열을 가리키는 포인터)에 쓰고 길이를 반환하면 버퍼를 반복하고'char '를'Serial.write()'할 수 있습니다. – lunixbochs

+1

네, 그냥 1 초 전 자신을 발견 :) 실제로 당신은 Serial.write (buf, len 0)로 길이 매개 변수를 전달할 수 있습니다. – jippie

-1

assembleFrame 반환 char 당신은 char*를 반환하면서. 내가 뭘하고 있는지 모르겠으니 그걸 고칠 방법을 제안 할 수는 없다. 반환 유형을 수정하는 것이 적절한 방법 일 수 있습니다. 이 코드를 보면

0

: 나중에 그것을 사용하는 방법

char frame = assembleFrame(); 

감안할 때, 분명 frame 요구하지 charchar *를 선언하고, assembleFrame 요구 char *을 반환로 선언되어야한다.

관련 문제