发新帖我要提问
12
返回列表
打印
[STM32F2]

STM32F207 CAN的远程帧怎么会有数据呀?

[复制链接]
楼主: fengyefeng
手机看帖
扫描二维码
随时随地手机跟帖
21
xlsbz| | 2014-11-13 21:28 | 只看该作者 回帖奖励 |倒序浏览
是不是自己请求自己了啊  这个远程帧我也不咋熟悉 。

使用特权

评论回复
22
fengyefeng|  楼主 | 2014-11-13 21:41 | 只看该作者
xlsbz 发表于 2014-11-13 21:28
是不是自己请求自己了啊  这个远程帧我也不咋熟悉 。

这个。。。我也不知道是怎么回事儿:(

使用特权

评论回复
23
xlsbz| | 2014-11-13 21:44 | 只看该作者
                printf("消息长度:%d字节  \n",RxMessage.DLC);
                for (i=0;i<8;i++)
                {
                        printf("  %#x",RxMessage.Data);
                }

使用特权

评论回复
24
xlsbz| | 2014-11-13 21:45 | 只看该作者
               if (RxMessage.RTR==CAN_RTR_REMOTE)                //远程帧
                {
                        printf("\n有远程帧请求\n");

                printf("消息长度:%d字节  \n",RxMessage.DLC);
                for (i=0;i<8;i++)
                {
                        printf("  %#x",RxMessage.Data);
                }
                }

使用特权

评论回复
25
xlsbz| | 2014-11-13 21:46 | 只看该作者
你打印的是以前的信息 兄弟

使用特权

评论回复
26
fengyefeng|  楼主 | 2014-11-13 22:25 | 只看该作者
xlsbz 发表于 2014-11-13 21:46
你打印的是以前的信息 兄弟

谢谢你的回答,有可能我没有看明白,我刚又看了一下我的代码,测试思路是:中断中接收数据并置标志位,主程序中检测到标志位后进行打印并清标志,打印完成后清除接收数据缓存,没有明白你说的打印的以前的是指哪个地方,还请指明一下。这个打印出来的数据内容确实是我在发扩展数据帧时的数据内容,我只是将帧类型在分析仪中由数据帧改成了远程帧,结果就发现收到的数据长度是0,但是内容却是没改帧类型之前的数据内容,可是我明明打印后将缓存都清干净了啊

使用特权

评论回复
27
fengyefeng|  楼主 | 2014-11-13 22:25 | 只看该作者
CanTxMsg TxMessage;                                        //发送全局邮箱
CanRxMsg RxMessage;                                        //接收全局邮箱

/*************************************************************************
函数名称:BSP_CAN1_RX0_IRQn
函数功能:CAN1接收数据中断服务函数
参数说明:无
返回值:  无
作者:
版本:REV 1.0
*************************************************************************/
void CAN1_RX0_IRQHandler(void)
{       
        if(SET == CAN_GetITStatus(CAN1, CAN_IT_FMP0))
        {
                Can1Rxflag=TRUE;                        //表明数据以收到
                CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
                CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
        }       
}

//main函数中:
if (Can1Rxflag==1)        //接收到消息
        {
                printf("CAN1收到的消息如下:");
                Can1Rxflag=FALSE;                                        //清除,没有收到数据不打印
               
                printf("接收的消息如下:\n");
                printf("扩展帧ID:%#x  \n",RxMessage.ExtId);
                printf("标准帧ID:%#x  \n",RxMessage.StdId);
                printf("RxMessage.IDE:%#x  \n",RxMessage.IDE);
                printf("RxMessage.RTR:%#x  \n",RxMessage.RTR);
                printf("消息长度:%d字节  \n",RxMessage.DLC);
                for (i=0;i<8;i++)                                                        //打印出刚接收到的数据
                {
                        printf("  %#x",RxMessage.Data[i]);
                }
                printf("\n");
                printf("显示如下:\n");       
                if (RxMessage.IDE==CAN_ID_EXT)                        //扩展帧
                {
                        printf("扩展帧ID:%#x  \n",RxMessage.ExtId);
                }
                else if(RxMessage.IDE==CAN_ID_STD)
                {
                        printf("标准帧ID:%#x  \n",RxMessage.StdId);
                }
                if (RxMessage.RTR==CAN_RTR_REMOTE)                //远程帧
                {
                        printf("\n有远程帧请求\n");
                }
                printf("消息长度:%d字节  \n",RxMessage.DLC);
                for (i=0;i<8;i++)
                {
                        printf("  %#x",RxMessage.Data[i]);
                }
                printf("\n");
                memset(&RxMessage,'\0',sizeof(RxMessage));                //清除接收缓存中的所有数据
                printf("清零后消息如下:\n");
                printf("扩展帧ID:%#x  \n",RxMessage.ExtId);
                printf("标准帧ID:%#x  \n",RxMessage.StdId);
                printf("RxMessage.IDE:%#x  \n",RxMessage.IDE);
                printf("RxMessage.RTR:%#x  \n",RxMessage.RTR);
                printf("消息长度:%d字节  \n",RxMessage.DLC);
                for (i=0;i<8;i++)                //注意,接收的远程帧数据内容
                {
                        printf("  %#x",RxMessage.Data[i]);
                }
                printf("\n");
        }

使用特权

评论回复
28
xlsbz| | 2014-11-13 22:51 | 只看该作者

               if (RxMessage.RTR==CAN_RTR_REMOTE)                //远程帧
                {
                        printf("\n有远程帧请求\n");

                printf("消息长度:%d字节  \n",RxMessage.DLC);
                for (i=0;i<8;i++)
                {
                        printf("  %#x",RxMessage.Data);
                }
                }

使用特权

评论回复
29
LOVE_ELEC| | 2014-11-14 12:29 | 只看该作者
fengyefeng 发表于 2014-11-13 21:03
每次打印完后就清除了,而且是确定清除了,但是一发远程帧就又打出了数据,虽说数据长度是0,找了半天也 ...

我的意思不是仅在打印之后清除,而是在你接收到数据帧之后或者发送数据帧之后进行清零!这样防止前一次写入的数据对后一次产生影响。楼主现在的问题应该就是因为用完未清除,造成的现在这种现象!

使用特权

评论回复
30
fengyefeng|  楼主 | 2014-11-14 19:56 | 只看该作者
LOVE_ELEC 发表于 2014-11-14 12:29
我的意思不是仅在打印之后清除,而是在你接收到数据帧之后或者发送数据帧之后进行清零!这样防止前一次写 ...

明白你意思了,这个很有可能,我清的是缓存,而数据源头并不是在缓存中,谢谢指教

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则