포스트

CAN통신

CAN통신

CAN통신

송신

#include <SPI.h>
#include <mcp_can.h>

// MCP2515 CS 핀 설정
MCP_CAN CAN0(10);

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

  // MCP2515 초기화 (500 kbps, 8 MHz 클럭)
  if (CAN0.begin(MCP_ANY, 500000, MCP_8MHZ) == CAN_OK) {
    Serial.println("MCP2515 초기화 성공 (송신기)");
  } else {
    Serial.println("MCP2515 초기화 실패");
    while (1);
  }

  CAN0.setMode(MCP_NORMAL); // CAN 일반 모드 설정
  Serial.println("CAN 모듈 준비 완료");
}

void loop() {
  // 송신 데이터 (8바이트)
  byte data[8] = {0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70};

  // 메시지 송신 (ID: 0x100)
  if (CAN0.sendMsgBuf(0x100, 0, 8, data) == CAN_OK) {
    Serial.println("메시지 전송 성공");
  } else {
    Serial.println("메시지 전송 실패");
  }

  delay(5000); // 1초 대기
}

수신

#include <SPI.h>
#include <mcp_can.h>

// MCP2515 CS 핀 설정
MCP_CAN CAN0(10);

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

  // MCP2515 초기화 (500 kbps, 8 MHz 클럭)
  if (CAN0.begin(MCP_ANY, 500000, MCP_8MHZ) == CAN_OK) {
    Serial.println("MCP2515 초기화 성공 (수신기)");
  } else {
    Serial.println("MCP2515 초기화 실패");
    while (1);
  }

  CAN0.setMode(MCP_NORMAL); // CAN 일반 모드 설정
  Serial.println("CAN 모듈 준비 완료");
}

void loop() {
  // 수신 데이터 저장용 변수
  long unsigned int rxId;
  unsigned char len = 0;
  unsigned char rxBuf[8];

  // 메시지 수신
  if (CAN0.checkReceive() == CAN_MSGAVAIL) {
    CAN0.readMsgBuf(&rxId, &len, rxBuf);

    Serial.print("수신된 ID: 0x");
    Serial.println(rxId, HEX);

    Serial.print("데이터 길이: ");
    Serial.println(len);

    Serial.print("데이터: ");
    for (int i = 0; i < len; i++) {
      //Serial.print(rxBuf[i], HEX);
      Serial.print((char)rxBuf[i]);
      Serial.print(" ");
    }
    Serial.println();
  }
}