这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【ArduinoGigaR1WiFi】CAN通信及电力抄读

共1条 1/1 1 跳转至

【ArduinoGigaR1WiFi】CAN通信及电力抄读

菜鸟
2026-02-05 23:26:27     打赏

         CAN485都是差分线,但CAN具有链路层收发器,使得它能多主通信,尤其在多组件系统比如汽车电子系统、机器人多关节联动、无人机各部件协作等都能见到它的身影。手头的Arduino Giga R1 WiFi板载的STM32H747XI带有2CANFD,故此可以借助它能模拟电力开关上的CAN通信比如与物联锁具的DLT698.45通信。

         TTL-CAN的串口和Arduino Giga R1 WiFi板子的JANALOG的串口交叉连接即TTL-CANTXCANRXRXCANTX

然后打开arduino IDE,可以导入CAN例程或者新建sketch

CAN例程.png


这里新建项目,借助mbed下的CAN类来进行初始化,发送数据,上位机有收到发送过来的DLT698.45报文,

CAN报文发送.PNG



相应代码如下:

#include "CAN.h"
 
mbed::CAN can1(PB_5, PB_13);
uint8_t counter = 0;
 
void printHex(char arr[],int len)
{
  for(int i=0;i<len;i++)
  {
    if(arr[i]<16)
    {
      Serial.print("0");
    }
    Serial.print(arr[i],HEX);
    Serial.print(" ");    
  }
}
void send() {
  char canTx[]={0x68,0x17,0x00,0x43,0x15,0x01,0x11,0x11,
    0x11,0x11,0x11,0x01,0xd3,0xd9,0x05,0x01,
    0x01,0x43,0x10,0x0b,0x00,0x00,0x0e,0x59,
    0x16};//DLT698.45报文
  int arrLen= sizeof(canTx)/sizeof(char);
  int nSeg=arrLen%8?arrLen/8+1:arrLen%8;
  for(int i=0;i<nSeg;i++)
  {
    Serial.print("[TX]:" );
    if (can1.write(mbed::CANMessage(0x408, &canTx[8*i], i==nSeg-1?arrLen%8:8))) {
      printHex(&canTx[8*i],i==nSeg-1?arrLen%8:8);
    } else {
      Serial.println("Transmission error");
      Serial.println(can1.tderror());
      can1.reset();
    }
    Serial.println("");
 
  }
 
}
 
void receive() {
  mbed::CANMessage msg;
  Serial.print("Message received: ");
  char canRx[8];
  if (can1.read(msg)) {
    for(int i=0;i<8;i++)
    {
      sprintf(canRx,"%02x ",msg.data[i]);
      Serial.print(canRx);
    }
      //Serial.printf(canRx);
  }
  Serial.println();
}
 
void setup() {
  Serial.begin(115200);
  can1.frequency(1000000);
}
 
bool receiver = false;
void loop() {
  if (receiver) {
    receive();
  } else {
    send();
  }
  delay(1000);
}





关键词: 电力    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]