开发环境:RTT4.1.0+STM32F407VET6
功能描述:基于CAN,实现CANopen基本的操作。
遇到问题:参考RTT官网的CAN例程,修改后,确实可以发送数据。但是,突然发现某个伺服电机不动,后来采集报文,发现数据不对。举个例子。我发的是4个字节的,0x00000b8f;但是通过CAN总线收到的确是0xffffbf8f,就像是0的地方都变成了f。试了很多次都是这样,发送其他数据又正常。
CAN发送数据的函数如下:
rt_err_t servo_send(rt_uint32_t nodeid, rt_uint16_t cmd, rt_int32_t speed)
{
rt_err_t ret = RT_EOK;
rt_size_t size = 0;
struct rt_can_msg msg = { 0 };
msg.id = nodeid;
msg.ide = RT_CAN_STDID; /* 标准格式 /
msg.rtr = RT_CAN_DTR; / 数据帧 /
msg.len = 6; / 数据长度为 8 /
/ 待发送的 8 字节数据 /
msg.data[0] = cmd;
msg.data[1] = cmd >> 8;
msg.data[2] = speed&0x000000ff;
msg.data[3] = (speed&0x0000ff00) >> 8;
msg.data[4] = (speed&0x00ff0000) >> 16;
msg.data[5] = (speed&0xff000000) >> 24;
/ 发送一帧 CAN 数据 */
size = rt_device_write(can_dev, 0, &msg, sizeof(msg));
if (size == 0)
{
ret = RT_ERROR;
rt_kprintf("can dev write data failed!\n");
}
return ret;
}
更多回帖