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

2019-07-21 04:50发布

关于以下程序我的疑问是:
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};
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
jondorthird
1楼-- · 2019-07-21 09:30
第一个问题解决了:确实是我的形参写的不对,应该加上“*”,
第二个问题就像我之前说的那样把两个邮箱的变量换成不一样的试一试,这个要等调试了才知道

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

以上还请前辈们帮帮忙。谢谢了!
jondorthird
2楼-- · 2019-07-21 13:28
看了看Tmailbox这个变量在发送2个不同报文的时候我用的是同一个报文邮箱,这也是错误,这样我估计调试的时候就只能发送同一个报文了。
jondorthird
3楼-- · 2019-07-21 17:57
 精彩回答 2  元偷偷看……
sdwhupk
4楼-- · 2019-07-21 19:20
如果编译不过去的话你应该把提示写出来大家帮你分析,就把这个函数放在这里如何知道你是因为什么无法编译。
jondorthird
5楼-- · 2019-07-21 22:39
//u8 CAN1_SendData(u8,u8);
上面是我要在can.h中声明的发送函数,只要取消编译屏蔽就会提示以下编译错误:
..HARDWARECANCAN.c(173): error:  #147-D: declaration is incompatible with "u8 CAN1_SendData(u8, u8)" (declared at line 61 of "..HARDWARECANcan.h")

好像说我同一个函数形参发生冲突了,怎么就冲突了,我没太看出来。
jondorthird
6楼-- · 2019-07-21 23:31
知道了,这个问题算是解决了,我再找找其它问题。

一周热门 更多>