2017-11-21 2 views
1

내 프로젝트에서 RFID 태그의 고유 ID를 읽은 결과는 uint8_t TagRead[4] 형식입니다.uint8_t 값에 유형 할당

결과를 미리 정의 된 여러 태그 ID 값과 비교하여 어떤 태그가 읽혔는지 확인합니다. 예를 들어

:

uint8_t RED1[4] = { 0x73, 0xD5, 0xB7, 0xAC }; 
uint8_t RED2[4] = { 0x7E, 0x27, 0x49, 0x4E }; 
uint8_t RED3[4] = { 0x02, 0xFD, 0x06, 0x40 }; 
uint8_t GREEN1[4] = { 0xAB, 0xEC, 0x68, 0x80 }; 
uint8_t GREEN2[4] = { 0xEE, 0x20, 0x50, 0x4E }; 
uint8_t GREEN3[4] = { 0x27, 0x06, 0x40, 0x73 }; 

if (*((uint32_t *)TagRead) == *((uint32_t *)RED2)) { 
    // RED2 tag has been read 
} 

else if (*((uint32_t *)TagRead) == *((uint32_t *)GREEN3)) { 
    // GREEN3 tag has been read 
} 

내 질문은 액션이 스캔 된 태그의 색상에 따라 수행 할 수 있도록 태그 그룹에 형/범주를 할당 할 수있는에 관한 것이다.

RED 태그를 스캔 할 때 빨간색 LED가 켜지고 녹색 태그가 스캔 될 때 파란색 LED가 켜질 수 있습니다.

각 색상별로 대략 50 개의 태그가 있기 때문에 If 문에 모든 태그 이름을 나열하고 싶지 않습니다. 대신, 태그에 색상을 지정할 수 있습니까?

그 다음을 수행 할 수있을 것입니다 : 스캔 태그 유형 RED이다

경우, 빨간색 행동을한다. 스캔 한 태그의 유형이 녹색 인 경우 녹색 작업을 수행하십시오.

도움 주셔서 감사합니다.

답변

1

먼저 비교가 정의되지 않은 동작입니다. 가는 올바른 방법은 std::memcmp입니다. 또한 엔디안을 돌볼 필요가 있습니다. 그래서 당신은 적절한를 조회 할 std::find()을 사용할 수 있습니다 당신이 구조체를 가지고 일단

struct rfid_tag 
{ 
    uint8_t value[4]; 
    enum { ... } color; 
}; 

, 당신은 operator== 그것을 풍부하게 할 수 있습니다 태그에 (색상 등) 특성을 부착하기 위해

, 단순히 구조체를 정의 한 줄에 태그 : 당신은 ID와 컬러 열거와 구조를 만들 수 있습니다

#include <iostream> 
#include <array> 
#include <algorithm> 
#include <cstring> 

struct rfid_tag 
{ 
    enum color_type { red = 10, blue = 11 }; 

    std::array<uint8_t, 4> value; 
    color_type    color; 
}; 

bool operator==(std::array<uint8_t, 4> const& tagvalue, rfid_tag const& rhs) 
{ 
    return std::memcmp(tagvalue.data(), rhs.value.data(), rhs.value.size()) == 0; 
} 

bool operator==(rfid_tag const& lhs, std::array<uint8_t, 4> const& tagvalue) 
{ 
    return tagvalue == lhs; 
} 


static const std::array<rfid_tag, 3> known_tags = { 
    rfid_tag{ { 0x00, 0x01, 0x02, 0x03 }, rfid_tag::red }, 
    rfid_tag{ { 0x10, 0x11, 0x12, 0x13 }, rfid_tag::blue }, 
    rfid_tag{ { 0x20, 0x21, 0x22, 0x23 }, rfid_tag::red } 
}; 

int main() 
{ 
    const std::array<uint8_t, 4> tag_to_find{ 0x10, 0x11, 0x12, 0x13 }; 
    std::cout << std::find(begin(known_tags), end(known_tags), tag_to_find)->color << "\n"; // outputs "11" as expected 
} 

demo

1

:

enum class Color { red, green }; 

struct Tag 
{ 
    uint8_t id[4]; 
    Color color; 
}; 

Tag RED1 = { { 0x73, 0xD5, 0xB7, 0xAC }, Color::red } ; 
Tag RED2 = { { 0x7E, 0x27, 0x49, 0x4E }, Color::red } ; 
Tag RED3 = { { 0x02, 0xFD, 0x06, 0x40 }, Color::red } ; 
Tag GREEN1 = { { 0xAB, 0xEC, 0x68, 0x80 }, Color::green } ; 
Tag GREEN2 = { { 0xEE, 0x20, 0x50, 0x4E }, Color::green } ; 
Tag GREEN3 = { { 0x27, 0x06, 0x40, 0x73 }, Color::green } ; 

void test(Tag tag) 
{ 
    if (tag.color == Color::red) 
    { 
     // 
    } 
    else if (tag.color == Color::green) 
    { 

    } 
} 
+0

감사합니다. 모든 독자가 제공하는 구조체의 ID 부분입니다, 그래서 어떻게 그 ID가 속한 태그를 반환하는 데 사용할 수 있습니까? 이 작업을 수행 할 수 있다면, 내가 한 것처럼 tag.color를 사용하여 색상을 얻을 수 있습니다. – mgh75

0

여러 가지가 있습니다.

당신은 같은 색상과 함께 태그를 포함하는 구조체, 쓸 수있다 :이

std map<uint8_t[4], std::string> tags; 

public void fillTags() 
{ 
    tags[RED1] = "Red"; 
    tags[RED2] = "Red"; 
    //... 

} 

std::string getColor(uint8_t tag) 
{ 
    return tags[tag]; 

} 
같은 태그에 색상을 할당 할 std::map를 사용할 수

struct ColoredTag 
{ 
    uint8_t[4] value; 
    std::string color; 

} typename ColoredTag_t; 

ColoredTag_t RED1 = {{ 0x73, 0xD5, 0xB7, 0xAC }, "Red"}; 
ColoredTag_t RED2 = {{ 0x7E, 0x27, 0x49, 0x4E }, "Red"}; 
ColoredTag_t RED3 = {{ 0x02, 0xFD, 0x06, 0x40 }, "Red"}; 
ColoredTag_t GREEN1 = {{ 0xAB, 0xEC, 0x68, 0x80 }, "Green"}; 
ColoredTag_t GREEN2 = {{ 0xEE, 0x20, 0x50, 0x4E }, "Green"}; 
ColoredTag_t GREEN3 = {{ 0x27, 0x06, 0x40, 0x73 }, "Green"}; 

또는

이 문제에 대한 해결책이 더 있을지 모르지만 이러한 문제가 내 마음에 처음으로 제기되었습니다.

관련 문제