CAN发送与接收的丢包问题
硬件:STM32F4IGT6
操作系统:RTTV4.1.0
CAN使用RTT的设备驱动
CAN波特率 1Mbps
通讯线不超过1米,电机CAN线和单片机CAN线与分析仪can线采用单向连接
测量终端电阻值为60Ω
使用标准CAN通信,不使用CANOEPN协议进行收发。
使用CAN分析仪进行发送 5ms间隔发送一帧标准帧
如图所示,单片机使用msh命令canstat查看接收丢包为0
使用CAN分析仪进行发送 1ms间隔发送一帧标准帧
如图所示,基本就没有接收
问题1:为什么基本接收不到?是硬件问题,还是搭载操作系统导致的?
使用CAN分析仪进行接收 单片机1ms间隔发送一帧标准帧
如图所示,发送正常。
但是发送频率并不是1ms一次。而是3ms发送3次。
试了下无间隔发送,变成3ms发送十几次左右。也是无丢包
发送测试代码如下,间隔时间使用rt_thread_mdelay(1)函数
void can_send_test(void)
{
struct rt_can_msg msg = {0};
rt_size_t size;
static rt_uint8_t num = 0;
msg.id = 0x78; /* ID 为 0x78 /
msg.ide = RT_CAN_STDID; / 标准格式 /
msg.rtr = RT_CAN_DTR; / 数据帧 /
msg.len = 8; / 数据长度为 8 /
/ 待发送的 8 字节数据 /
msg.data[0] = 0x00;
msg.data[1] = num++;
msg.data[2] = 0x22;
msg.data[3] = 0x33;
msg.data[4] = num++;
msg.data[5] = 0x55;
msg.data[6] = 0x66;
msg.data[7] = 0x77;
/ 发送一帧 CAN 数据 /
for(int i = 0;i < 1000;i++)
{
rt_thread_mdelay(1);
size = rt_device_write(can_dev, 0, &msg, sizeof(msg));
if (size == 0)
{
rt_kprintf("can dev write data failed!\n");
}
}
}
/ 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(can_send_test, can send test);
问题2:为什么发送会隔几秒发送多次?是不是fifo导致的?
使用CANOEPN协议进行收发,使用canfestival软件包
单片机发送数据,无接收
没有发送丢包
.单片机与电机通信,有收发
发送丢包率大概3.3%
通信内容
总线负载
问题3:为什么canfestival发送会丢包,裸机不会?为什么单独发送不会,收发就会?
是不是canfestival线程处理不够快导致的
将can的自动重发功能打开
可以不产生丢包
drv_can->CanHandle.Init.AutoRetransmission = ENABLE;
问题4:打开自动重发会有什么影响?会不会造成can通信延迟?
希望各位大佬可以解答一下我得到困惑。
刚用canopen,can之前也是使用标准can通信一下。对底层也不是很了解
更多回帖