OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 14111|回复: 12

STM32 CAN多个报文发送程序调试遇到的疑问

[复制链接]

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
发表于 2014-8-16 23:34:17 | 显示全部楼层 |阅读模式
5金钱

关于以下程序我的疑问是:
1.以下程序在编译时候并未出错,在can.h中对发送函数:u8 CAN1_SendData(u8 *TXmsg1,u8 *TXmsg2)无法完成声明,一声明编译就过不了,由于main函数还没去写,所以这个问题不解决就没法去写main函数,是不是发送函数的参数写的不太对?。
2.can发送部分我的想法是实现2个报文的发送,在发送函数中我初始化了两次发送这样的做法对吗,可以实现我的想法吗?
3.潜在的错误:为了让can调试可以顺利进行,我将发送的数据定义为了常量;然而实际应一般肯定是变量,那么我该使用什么样的方式去实现变量的发送?

在此我诚挚请求论坛前辈能帮帮我,特别是原子大哥哥

/*发送数据(8Byte)声明*/
u8 Data_ECU_Base1[8] = {  Tem,speed_L,speed_H,Thro_L, Thro_H,BoostFlag,Tem_Null_6, Tem_Null_7};
u8 Data_ECU_Base2[8] = {TPressFlag,VIN_L, VIN_M,VIN_H, DoorFlag,LBeltFlag, OilPress_L,OilPress_H};

/*CAN发送部分*/
//发送2组报文,扩展格式ID
//数据长度 8 byte
//TXmsg:数据指针 8 byte
//返回值0:发送成功;其它:发送失败
u8 CAN1_SendData(u8 *TXmsg1,u8 *TXmsg2)
{
 u8 i,j;
 u8 TMailbox;
 CanTxMsg TxMessage; //申请报文空间

 /*ECU发送广播报文1*/
 TxMessage.StdId = (ExtId_ECU_B1>>18)&0x7ff;  //设置扩展CAN ID 标准基本ID部分 11位
 TxMessage.ExtId = ExtId_ECU_B1&0x3FFFF; //设置扩展CAN ID 扩展ID部分 18位
  TxMessage.RTR = CAN_RTR_DATA; //数据帧 0
  TxMessage.IDE = CAN_ID_EXT; //设置IDE为扩展格式ID标志 0
  TxMessage.DLC = 8;       //数据长度 8byte,每次发送1帧(1byte)
 for(i=0;i<8;i++)    //小端方式发送,共8帧
 {
   TxMessage.Data = TXmsg1;     //发送数据
 }
 TMailbox = CAN_Transmit(CAN1,&TxMessage);//发送的数据
 i=0;
   while((CAN_TransmitStatus(CAN1, TMailbox)==CAN_TxStatus_Failed)&&(i<0XFF))i++; //等待发送结束

 /*ECU发送广播报文2*/
 TxMessage.StdId = (ExtId_ECU_B2>>18)&0x7ff;  //设置扩展CAN ID 标准基本ID部分 11位
 TxMessage.ExtId = ExtId_ECU_B2&0x3FFFF;      //设置扩展CAN ID 扩展ID部分 18位
  TxMessage.RTR = CAN_RTR_DATA; //数据帧 0
  TxMessage.IDE = CAN_ID_EXT; //设置IDE为扩展格式ID标志 0
  TxMessage.DLC = 8;       //数据长度 8byte,每次发送1帧(1byte)
 for(j=0;j<8;j++)    //小端方式发送,共8帧
 {
   TxMessage.Data[j] = TXmsg2[j];     //发送数据
 }
 TMailbox = CAN_Transmit(CAN1,&TxMessage);//发送的数据
 j=0;
   while((CAN_TransmitStatus(CAN1, TMailbox)==CAN_TxStatus_Failed)&&(j<0XFF))j++; //等待发送结束
   if(i>=0XFFF||j>=0XFFF)return 1;

 return 0;  
}

can.h文本中关于CAN发送部分我是这样写的
/*发送报文ID宏定义*/
#define ExtId_ECU_B1 0x16FE03E4
#define ExtId_ECU_B2 0x16FE04E4

/*为了能调试过我把发送的数据在h文件中定义为常量*/
enum{Tem = 38,speed_L = 0xFF,speed_H = 0x03,Thro_L = 0xFF,Thro_H = 0xAF,
 BoostFlag = 0x01,Tem_Null_6 = 0xFF,Tem_Null_7 = 0xFF};
enum{TPressFlag = 0x02,VIN_L = 0x12,VIN_M = 0x34,VIN_H = 0x56,DoorFlag = 0xaa,
 LBeltFlag = 0x00,OilPress_L = 0x1E,OilPress_H =0x11};

最佳答案

查看完整内容[请看2#楼]

第一个问题解决了:确实是我的形参写的不对,应该加上“*”, 第二个问题就像我之前说的那样把两个邮箱的变量换成不一样的试一试,这个要等调试了才知道 第三个问题真的好难,还没想出解决办法,实在不行就只能申请buffer来存放了。 以上还请前辈们帮帮忙。谢谢了!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
 楼主| 发表于 2014-8-16 23:34:18 | 显示全部楼层
第一个问题解决了:确实是我的形参写的不对,应该加上“*”,
第二个问题就像我之前说的那样把两个邮箱的变量换成不一样的试一试,这个要等调试了才知道

第三个问题真的好难,还没想出解决办法,实在不行就只能申请buffer来存放了。

以上还请前辈们帮帮忙。谢谢了!
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
 楼主| 发表于 2014-8-16 23:52:34 | 显示全部楼层
看了看Tmailbox这个变量在发送2个不同报文的时候我用的是同一个报文邮箱,这也是错误,这样我估计调试的时候就只能发送同一个报文了。
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
 楼主| 发表于 2014-8-16 23:56:21 | 显示全部楼层
其实关于这个程序我也可以通过声明2个u32数据来表示一个8byte的报文的数据域,但是我不想那么做。好困,明天见,晚安!
回复

使用道具 举报

8

主题

193

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
303
金钱
303
注册时间
2012-12-19
在线时间
16 小时
发表于 2014-8-17 12:22:30 | 显示全部楼层
如果编译不过去的话你应该把提示写出来大家帮你分析,就把这个函数放在这里如何知道你是因为什么无法编译。
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
 楼主| 发表于 2014-8-17 13:52:16 | 显示全部楼层
//u8 CAN1_SendData(u8,u8);
上面是我要在can.h中声明的发送函数,只要取消编译屏蔽就会提示以下编译错误:
..\HARDWARE\CAN\CAN.c(173): error:  #147-D: declaration is incompatible with "u8 CAN1_SendData(u8, u8)" (declared at line 61 of "..\HARDWARE\CAN\can.h")

好像说我同一个函数形参发生冲突了,怎么就冲突了,我没太看出来。
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
 楼主| 发表于 2014-8-17 13:53:39 | 显示全部楼层
知道了,这个问题算是解决了,我再找找其它问题。
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
 楼主| 发表于 2014-8-17 20:21:35 | 显示全部楼层
嘿嘿 发送固定报文的程序 调试过了没有问题了,只剩下发送变量的问题了。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-17 21:35:59 | 显示全部楼层
回复【8楼】jondorthird:
---------------------------------
变量不很好解决么?
整一个参数就是了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
 楼主| 发表于 2014-8-19 01:06:55 | 显示全部楼层
嘿嘿,解决了,调试进行中,希望能顺利。谢谢@原子
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
发表于 2014-9-1 17:05:56 | 显示全部楼层
回复【10楼】jondorthird:
---------------------------------
请教一个问题,STM32是怎么选择使用哪个邮箱的,
比如我想使用邮箱0 发送  怎么选择邮箱0????

http://www.openedv.com/posts/list/38867.htm
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
 楼主| 发表于 2014-9-3 22:16:36 | 显示全部楼层
原子的CAN 初始化函数里面有的,你仔细看看
回复

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2013-11-13
在线时间
33 小时
 楼主| 发表于 2014-9-3 22:16:54 | 显示全部楼层
回复【11楼】wang12zhe:
---------------------------------
原子的CAN 初始化函数里面有的,你仔细看看
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表