2017-10-23 1 views
0

현재 UART를 통해 내 PC와 ARM M4 마이크로 컨트롤러간에 데이터를 전송하고 있습니다. 각 메시지가 다음과 같이 보이는 고유 한 프로토콜을 정의했습니다.
START_CHAR LEN TYPE SEQ DATA CRC
START_CHAR 및 LEN 필드는 데이터가 끝나는 시점을 결정하는 데 도움이되며, 그 후에 데이터를 확인하기 위해 TYPE (상수 오프셋 3)을 찾습니다. 메시지 클래스에 압축을 풀기 위해 어떤 데이터가 왔습니까?생성 된 플랫 버퍼 헤더에 메타 데이터를 포함 할 수 있습니까?

이제 flatbuffers를 살펴보고 실제 메시지 안에 TYPE을 포함시키지 않으면 TYPE을 인코딩 할 수 없다는 점을 제외하고는 완벽 해 보입니다. 다음은 내가하려는 일입니다.

namespace FlatMessage; 

uint8 const TYPE = 50; // does not compile 

table String { 
    value:string; 
} 

root_type String; 

나는 열거 형을 만들 수 있지만 지저분합니다. 고맙습니다!

[편집] 프로토콜을 END_CHAR으로 바꿀 수 있다고 덧붙여 야하지만 기존의 이유로 TYPE 필드를 지원해야합니다.

글쎄 실제로, 나는 flatbuffer로 그것을 deserialize하는 방법을 알아 내기 위해 타입을 필요로한다고 생각합니다.

uint8_t *buf = builder.GetBufferPointer(); // I can do this with END_CHAR because I could get the buffer. 

    auto receive_string = GetString(buf); // But I wouldn't know what the type is. e.g. this could be GetCoolString(buf). 

답변

1

당신은 FlatBuffer과 유형을 저장하는 몇 가지 옵션이 있습니다

  • 접두어는 형식으로 자신을 버퍼.
  • FlatBuffer의 유형을 식별 할 수 있도록 FlatBuffers의 file_identifier 기능을 사용하십시오.
  • 형식을 공용 형식을 사용하여 FlatBuffers 자체에 저장합니다. 루트 테이블에 단일 공용 필드가 있도록하십시오.
+0

감사합니다. 나는 유니온 타입이 좋은 해결책이 될 것이라고 생각했지만, 그렇다면 모든 메시지 정의를 내 임베디드 프로세서에 포함시켜야 할 것이다. 나는 file_identifier로 이동할 것이다. 고맙습니다! – user2316667