接下来的时间开始弄回老本行用32写路径规划,使用的是松灵一代小车底盘(阿克曼转向,最大速度1.5米每秒,最大转向角度25.5°),今天是第一篇,写CAN总线校验码问题。
根据用户手册:
可能看着还是有点蒙蔽,我直接写成了可以直接用的生成校验码的程序:
#include<stdio.h>
#include<stdint.h>
#include <stdlib.h>
typedef unsigned __int16 uint16_t;
typedef unsigned __int8 uint8_t;
uint16_t id = 0x130;
uint8_t len = 8;
uint8_t data[40] = {0x01,0x00,0x9c,0x00,0x00,0x00,0x00};
//生成10进制的校验码
static uint8_t Agilex_CANMsgChecksum(uint16_t id, uint8_t* data, uint8_t len)
{
uint8_t checksum = 0x00;
checksum = (uint8_t)(id & 0x00ff) + (uint8_t)(id >> 8) + len;
printf("测试低8位 %d\n", id & 0x00ff);
printf("测试高八位%d\n", id >> 8);
printf("高低八位值相加,再加上长度后%d\n",checksum);
printf("len是:%d\n", len);
for (uint8_t i = 0; i < (len - 1); i++)
{
checksum += data[i];
}
printf("再加上data值后的checksum%d\n", checksum);
return checksum;
}
//10进制转16进制
void dec2hex(int n)
{
char str[100];
int p;
int i;
int digit;
char c;
p = 0;
do {
digit = n % 16;
if (digit < 10)
{
str[p] = digit + '0';
}
else
{
str[p] = digit - 10 + 'A';
}
p++;
n = n / 16;
} while (n > 0);
str[p] = '\0';
for (i = 0; i < p / 2; i++)
{
c = str[i];
str[i] = str[p - 1 - i];
str[p - 1 - i] = c;
}
puts(str);
}
int main() {
int ret = Agilex_CANMsgChecksum( id, data, len);
printf("输出的10进制结果:%d\n",ret);
//把10进制转换为16进制
printf("输出的16进制数是:",ret);
dec2hex(ret);
return 0;
}
这样可以直接修改下ID和data就可以获取到真确的的校验码。
通过pcan与小车连接,是可以正常控制小车转向与执行的。
同时,2号位是控制速度,3号位是控制转向,要注意下负号问题,即右转与后退。这里推荐下个可以转码的小工具:https://www.23bei.com/tool-56.html
符号16进制用补码,这里用下可以控制达到后退效果。
顺便吐槽下PCAN现在是真的贵。还是留下qq:3233456044万一有人想找我交流呢😂。