Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
CAN总线
CANopen_canfestival
5
标准CAN接收丢包,canopen协议发送丢包问题
发布于 2022-09-26 17:17:01 浏览:2364
订阅该版
[tocm] #CAN发送与接收的丢包问题 - 硬件:STM32F4IGT6 - 操作系统:RTTV4.1.0 - CAN使用RTT的设备驱动 - CAN波特率 1Mbps - 通讯线不超过1米,电机CAN线和单片机CAN线与分析仪can线采用单向连接 - 测量终端电阻值为60Ω ## 使用标准CAN通信,不使用CANOEPN协议进行收发。 1. 使用CAN分析仪进行发送 5ms间隔发送一帧标准帧 如图所示,单片机使用msh命令canstat查看接收丢包为0 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/585392823744b009c039f7049346d7f3.png) 2. 使用CAN分析仪进行发送 1ms间隔发送一帧标准帧 如图所示,基本就没有接收 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/1895ae307ef0885e5c1c4f858edea943.png) **问题1:为什么基本接收不到?是硬件问题,还是搭载操作系统导致的?** 3. 使用CAN分析仪进行接收 单片机1ms间隔发送一帧标准帧 如图所示,发送正常。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/ae8d8e06a9912d2d0a2ea432d57b6a97.png) 但是发送频率并不是1ms一次。而是3ms发送3次。 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/454da5b2884054affb39f567fde9ec90.png) 试了下无间隔发送,变成3ms发送十几次左右。也是无丢包 发送测试代码如下,间隔时间使用rt_thread_mdelay(1)函数 ```c 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软件包 1. 单片机发送数据,无接收 没有发送丢包 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/42557fb92f5c3bc16066a1710324b162.png) ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/d0ecb33879d905817a2f3b0451494f99.png) 2.单片机与电机通信,有收发 发送丢包率大概3.3% ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/8ab6e013d605b092850f26bb2fca9c3d.png) 通信内容 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/897d053cd67e87ba46ca69620994a270.png) 总线负载 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/a7be6c30ccab122e2c89c548f6d993ed.png) **问题3:为什么canfestival发送会丢包,裸机不会?为什么单独发送不会,收发就会? 是不是canfestival线程处理不够快导致的** ## 将can的自动重发功能打开 1. 可以不产生丢包 drv_can->CanHandle.Init.AutoRetransmission = ENABLE; ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220926/cb0354ac8a8d3e68a81b707b84f52cf1.png) **问题4:打开自动重发会有什么影响?会不会造成can通信延迟?** ?希望各位大佬可以解答一下我得到困惑。 刚用canopen,can之前也是使用标准can通信一下。对底层也不是很了解
查看更多
Ryan_CW
认证专家
2022-09-27
这家伙很懒,什么也没写!
没有使用过rtt的can驱动框架,之前项目使用到can通讯。使用esp32和stm32f407通讯,没有使用canopen,自己定义的通讯协议,主要发送json字符串数据,一个json字符串会发送多次can帧。 stm32f1 f4系列can只有3个发送和接收fifo,esp32快速发送can包时,stm32如果没有来得及取,fifo很容易就满了。 我当时的情况是,即使把can中断优先级调为最高,在中断中马上通过消息队列缓存起来,依然会产生大量丢包,can通讯速率从1M降到20kp还是一样。 最开始的解决办法是,发送3帧就延时5ms,太浪费效率了。 后来根据can协议发送成功是有ack标志位的,然后就是每次发送一条can消息就判断标志位是否接收成功,接收成功继续发送下一帧,超时就发送错误。 自动重发文档介绍的就很详细了,在我的项目中自动重发反而会导致一些问题还要占一个发送fifo,我就把它关了 ![screenshot_image.png](https://oss-club.rt-thread.org/uploads/20220927/05b7559cc99bf3f9bc528655bb8f5662.png.webp)
1
个回答
默认排序
按发布时间排序
撰写答案
登录
注册新账号
关注者
0
被浏览
2.4k
关于作者
用户名由3_15位
这家伙很懒,什么也没写!
提问
62
回答
229
被采纳
32
关注TA
发私信
相关问题
1
我也来传一个CANOpen移植,RTT+STM32F107+CanOpenNode
2
谁有STM32裸跑的CANopen程序啊???
3
CAN驱动程序框架
4
CAN驱动接口如何规范一下
5
RTT无法进入线程.Cannot access Memory
6
编译提示arm-none-eabi/bin/ld: cannot find crt0.o: No such file o
7
rtt 2.1.0 正式版 mdk4 bsp/stm32 编译canapp.c错误
8
STM32F10XCAN驱动使用的问题
9
2.1版本stm32f10x分支bxcan驱动波特率设置的bug
10
rtthread2.1.0下,找不到can1设备
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用百度AI助手辅助编写一个rt-thread下的ONVIF设备发现功能的功能代码
2
RT-Thread 发布 EtherKit开源以太网硬件!
3
rt-thread使用cherryusb实现虚拟串口
4
《C++20 图形界面程序:速度与渲染效率的双重优化秘籍》
5
《原子操作:程序世界里的“最小魔法单位”解析》
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
WIZnet_W5500
UART
ota在线升级
PWM
cubemx
freemodbus
flash
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
Debug
编译报错
msh
SFUD
keil_MDK
rt_mq_消息队列_msg_queue
ulog
C++_cpp
at_device
本月问答贡献
踩姑娘的小蘑菇
7
个答案
3
次被采纳
a1012112796
13
个答案
2
次被采纳
张世争
9
个答案
2
次被采纳
rv666
5
个答案
2
次被采纳
用户名由3_15位
11
个答案
1
次被采纳
本月文章贡献
程序员阿伟
8
篇文章
2
次点赞
hhart
3
篇文章
4
次点赞
大龄码农
1
篇文章
3
次点赞
ThinkCode
1
篇文章
1
次点赞
Betrayer
1
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部