松灵一代车CAN的校验位

接下来的时间开始弄回老本行用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万一有人想找我交流呢😂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值