본문 바로가기

코딩 테크닉/C 코드 테크닉

CAN 통신에서 자동차 속도값 읽는 방법

반응형

CAN(Controller Area Network) 통신 패킷에서 

데이터는 CANopen, SAE J1939를 준수하지만 제조사마다 약간 다르게 표현하는 경우가 많다.

CAN으로 자동차에서 들어오는 8바이트 데이터 패킷에서 만약 자동차의 속도 100km/h를 표현하려면 어떻게 읽어야할까?

 

CAN에서 데이터 형식 정의를 확인해야 한다.

 


데이터 형식의 정의는 '특정 형식'과 '스케일링값'을 의미한다.
일반적으로는 정의된 배율 인수(인자값)를 사용하여

km/h, mph 또는 m/s와 같이 같은 속도값이라고 하더라도 작은 단위로 속도를 표시하는 경우도 있다.

바이트 순서, 데이터 유형(int형 또는 float형)

 

 

데이터가 '빅엔디안'으로 표현되는지 또는 '리틀엔디안'으로 표현되는지
바이트 순서를 확인해야 한다.

데이터 유형과 길이를 알아야 한다.
속도가 정수(예: uint8, uint16) 또는 부동 소수점 숫자로 표시되는지 여부에 따라
이 데이터에 할당된 바이트 수가 달라지기 때문에 프로토콜을 알아야 할 필요가 있다.

 




만약, 속도가 시간당 킬로미터(km/h) 단위이며,

부호 없는 16비트 정수로 표시되고

바이트 순서가 리틀 엔디안인 간단한 경우라면 아래와 같은 절차를 따른다.



속도를 정수로 변환한다.
ㄴ 100km/h는 100(16진수로 0x0064)으로 표현된다.


데이터 형식
ㄴ 리틀 엔디안 순서의 경우 최하위 바이트가 먼저오고, 반대라면 최상위 바이트가 먼저온다.

ㄴ 리틀 엔디안 순서에서는 [0x64, 0x00]으로 표시된다.

데이터 패킷 구성
ㄴ 속도 데이터를 8바이트 데이터 패킷 내의 지정된 위치에 배치한다.
ㄴ 속도 데이터가 처음 2바이트를 차지하는 경우 패킷은 이렇게 표현된다.

ㄴ [0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]


 

728x90

'코딩 테크닉 > C 코드 테크닉' 카테고리의 다른 글

C++ 연산자 오버로딩  (0) 2024.03.03