你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32f103CAN口怎么接收来自上机位的一包32字节的数据

[复制链接]
黄同学来学习 提问时间:2019-1-14 11:06 /
阅读主题, 点击返回1楼
收藏 1 评论20 发布时间:2019-1-14 11:06
20个回答
黄同学来学习 回答时间:2019-1-14 14:49:42
stm1024 发表于 2019-1-14 13:21
你的问题可能不是丢包,应该是数据被新的数据给替换了

//ÖжϷþÎñº¯Êý                            
void USB_LP_CAN1_RX0_IRQHandler(void)
{
          CanRxMsg RxMessage;
                int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
//                        for(i=0;i<RxMessage.DLC;i++)
//                                {
//                                        if(RxMessage.Data==0x40)
//                                        {
//                                                canData=RxMessage.Data;
//                                        }
                        for(i=0;i<8;i++)//ÓÐÊý¾Ý½ÓÊÕÖжϣ¬ÕâÀï½ÓÊÕµ½Ò»Ö¡Êý¾Ý£¬¼´8×Ö½Ú
                        {
                                canData[j]=RxMessage.Data;
                                j++;
                        }
                       
                        if(canData[0]==0x40)//ÅжÏÊÇ·ñ±¨ÎĵÚÒ»×Ö½ÚÊÇ·ñΪ0x40
                        {       
                                canData_len=(canData[1]<<8|canData[2]);//½«µ±Ç°±¨Îij¤¶È°´8×Ö½Ú¼ÆËã
                                sun=canData_len/8;//¼ÆË㵱ǰ±¨ÎÄÓжàÉÙÖ¡Êý¾Ý
                        }
                        if(sun==0)//ÊÇ·ñ½ÓÊÕÍ굱ǰ±¨ÎÄÖ¡Êý
                        {
                                j=0;//½«Êý×éϱ껹ԭΪ0
                        }       
                        sun--;

//        j++;
//        printf("\r\n%d\r\n",j);
//                printf("\r\n");
}


这个是我改的中断服务函数   一直不行
黄同学来学习 回答时间:2019-1-14 14:55:13
stm1024 发表于 2019-1-14 13:21
你的问题可能不是丢包,应该是数据被新的数据给替换了

//中断服务函数                            
void USB_LP_CAN1_RX0_IRQHandler(void)
{
          CanRxMsg RxMessage;
                int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
//                        for(i=0;i<RxMessage.DLC;i++)
//                                {
//                                        if(RxMessage.Data==0x40)
//                                        {
//                                                canData=RxMessage.Data;
//                                        }
                        for(i=0;i<8;i++)//有数据接收中断,这里接收到一帧数据,即8字节
                        {
                                canData[j]=RxMessage.Data;
                                j++;
                        }
                       
                        if(canData[0]==0x40)//判断是否报文第一字节是否为0x40
                        {       
                                canData_len=(canData[1]<<8|canData[2]);//将当前报文长度按8字节计算
                                sun=canData_len/8;//计算当前报文有多少帧数据
                        }
                        if(sun==0)//是否接收完当前报文帧数
                        {
                                j=0;//将数组下标还原为0
                        }       
                        sun--;

//        j++;
//        printf("\r\n%d\r\n",j);
//                printf("\r\n");
}
黄同学来学习 回答时间:2019-1-14 14:57:28
stm1024 发表于 2019-1-14 13:21
你的问题可能不是丢包,应该是数据被新的数据给替换了

//中断服务函数                            
void USB_LP_CAN1_RX0_IRQHandler(void)
{
          CanRxMsg RxMessage;
                int i=0;
    CAN_Receive(CAN1, 0, &RxMessage);
//                        for(i=0;i<RxMessage.DLC;i++)
//                                {
//                                        if(RxMessage.Data==0x40)
//                                        {
//                                                canData=RxMessage.Data;
//                                        }
                        for(i=0;i<8;i++)//有数据接收中断,这里接收到一帧数据,即8字节
                        {
                                canData[j]=RxMessage.Data;
                                j++;
                        }
                       
                        if(canData[0]==0x40)//判断是否报文第一字节是否为0x40
                        {       
                                canData_len=(canData[1]<<8|canData[2]);//将当前报文长度按8字节计算
                                sun=canData_len/8;//计算当前报文有多少帧数据
                        }
                        if(sun==0)//是否接收完当前报文帧数
                        {
                                j=0;//将数组下标还原为0
                        }       
                        sun--;

//        j++;
//        printf("\r\n%d\r\n",j);
//                printf("\r\n");
}
stm1024 回答时间:2019-1-14 15:35:02
黄同学来学习 发表于 2019-1-14 14:57
//中断服务函数                            
void USB_LP_CAN1_RX0_IRQHandler(void)
{

if(RxMessage.Data==0x40)
为什么有这种写法?Data是一个数组啊喂
zts329547875 回答时间:2019-1-14 15:52:29
打包,拆包,重组,校验

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

mmuuss586 回答时间:2019-1-14 16:04:29

分成多个包发,一个中断接收

评分

参与人数 1蝴蝶豆 +1 收起 理由
STMCU + 1

查看全部评分

黄同学来学习 回答时间:2019-1-14 17:18:11
Johnson Cao 发表于 2019-1-14 13:57
使用环形缓冲区,中断写,main里读就行了.环形缓冲研究下,以后搞通信,用得上的地方多了去. ...

can是按帧发送的   非常感谢大家支持
黄同学来学习 回答时间:2019-1-14 17:19:03
谢谢三位大神的指教   自己已经搞定了   非常感谢
黄同学来学习 回答时间:2019-1-14 17:20:21
stm1024 发表于 2019-1-14 15:35
if(RxMessage.Data==0x40)
为什么有这种写法?Data是一个数组啊喂

是写漏了  谢谢哈
黄同学来学习 回答时间:2019-1-14 17:20:50
zts329547875 发表于 2019-1-14 15:52
打包,拆包,重组,校验

是的   就是实现起来才难

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版