CAN和485都是差分线,但CAN具有链路层收发器,使得它能多主通信,尤其在多组件系统比如汽车电子系统、机器人多关节联动、无人机各部件协作等都能见到它的身影。手头的Arduino Giga R1 WiFi板载的STM32H747XI带有2路CANFD,故此可以借助它能模拟电力开关上的CAN通信比如与物联锁具的DLT698.45通信。
将TTL-CAN的串口和Arduino Giga R1 WiFi板子的JANALOG的串口交叉连接即TTL-CAN的TX接CANRX,RX接CANTX,
然后打开arduino IDE,可以导入CAN例程或者新建sketch,

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

相应代码如下:
#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);
}
我要赚赏金
