GitHub -> ntrexlab/AHRS_Can
void RecvCanMessage(CAN_HANDLE h){
char rdata[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
long rid;
int rlen, ext, rtr;
// 데이터를 수신한다.
int ret = CAN_Recv(h, &rid, &rlen, rdata, &ext, &rtr);
if (ret) {
// 수신된 메시지가 있다면 리턴 값은 1이다.
// 수신된 메시지가 없다면 리턴 값은 0이다.
// 또한, 잘못된 핸들에 대해 수신을 시도할 경우에도 리턴 값은 0이다.
printf ("Recv: [%d] %02X %02X %02X %02X %02X %02X %02X %02X (%d)\n",
rid, (int)(unsigned char)rdata[0], (int)(unsigned char)rdata[1],
(int)(unsigned char)rdata[2], (int)(unsigned char)rdata[3],
(int)(unsigned char)rdata[4], (int)(unsigned char)rdata[5],
(int)(unsigned char)rdata[6], (int)(unsigned char)rdata[7],
rlen);
//추가
#define ACC 0x33
#define GYR 0x34
#define ANG 0x35
// 4. Datasheet 참고 설정
void RecvCanMessage(CAN_HANDLE h){
char rdata[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
long rid;
int rlen, ext, rtr;
//추가
int16_t acc_x = 0, acc_y = 0, acc_z = 0, gyr_x = 0, gyr_y = 0, gyr_z = 0, ang_x = 0, ang_y = 0, ang_z = 0;
//배열 값을 int16_t 형식으로 받기 위해 선언.
float accx = 0, accy = 0, accz = 0, gyrx =0 , gyry=0,gyrz=0,angx=0, angy=0, angz=0;
// 최종 값을 받기 위해 선언.
// 데이터를 수신한다.
int ret = CAN_Recv(h, &rid, &rlen, rdata, &ext, &rtr);
if (ret) {
// 수신된 메시지가 있다면 리턴 값은 1이다.
// 수신된 메시지가 없다면 리턴 값은 0이다.
// 또한, 잘못된 핸들에 대해 수신을 시도할 경우에도 리턴 값은 0이다.
//추가
switch (rdata[1]){
// rdata[1] -> index (4. DataSheet 참고 설정)
case ACC:
acc_x = ((int)(unsigned char)rdata[2] | (int)(unsigned char)rdata[3] << 8);
acc_y = ((int)(unsigned char)rdata[4] | (int)(unsigned char)rdata[5] << 8);
acc_z = ((int)(unsigned char)rdata[6] | (int)(unsigned char)rdata[7] << 8);
//rdata 배열에 있는 값을 int 형식으로 저장.
accx = acc_x / 1000.0;
accy = acc_y / 1000.0;
accz = acc_z / 1000.0;
// int16_t 형식을 /1000.0으로 저장.(4.DataSheet 참고 설정)
printf("ACC는 : %+.2f %+.2f %+.2f \n", accx, accy, accz);
// 값이 +일땐 +로, -일땐 -로 소수점 2번째 자리까지 출력.
break;
case GYR:
gyr_x = ((int)(unsigned char)rdata[2] | (int)(unsigned char)rdata[3] << 8);
gyr_y = ((int)(unsigned char)rdata[4] | (int)(unsigned char)rdata[5] << 8);
gyr_z = ((int)(unsigned char)rdata[6] | (int)(unsigned char)rdata[7] << 8);
//rdata 배열에 있는 값을 int 형식으로 받아옴.
gyrx = gyr_x / 10.0;
gyry = gyr_y / 10.0;
gyrz = gyr_z / 10.0;
// int16_t 형식을 /10.0으로 저장.(4.DataSheet 참고 설정)
printf("GYR는 : %+.2f %+.2f %+.2f \n", gyrx, gyry, gyrz);
// 값이 +일땐 +로, -일땐 -로 소수점 2번째 자리까지 출력.
break;
case ANG:
ang_x = ((int)(unsigned char)rdata[2] | (int)(unsigned char)rdata[3] << 8);
ang_y = ((int)(unsigned char)rdata[4] | (int)(unsigned char)rdata[5] << 8);
ang_z = ((int)(unsigned char)rdata[6] | (int)(unsigned char)rdata[7] << 8);
//rdata 배열에 있는 값을 int 형식으로 받아옴.
angx = ang_x / 100.0;
angy = ang_y / 100.0;
angz = ang_z / 100.0;
//int16_t 형식을 /100.0으로 저장.(4.DataSheet 참고 설정)
printf("ANG는 : %+.2f %+.2f %+.2f \n", angx, angy, angz);
// 값이 +일땐 +로, -일땐 -로 소수점 2번째 자리까지 출력.
break;
}
printf("\n");
}
}