|
使用CAN2连续发送4个包,因为之前使用CAN1的时候遇到过发送超过3个就会丢包的问题,那个时候用的方法是用while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0)进行判断,如果发送队列空,然后继续发送,今天使用CAN2的时候遇到了同样的问题,但是使用同样的方法就不能解决这个问题了。CAN1和CAN2都已经初始化了,使用的是最新的CUBE MX进行初始化的,有人遇到同样的问题没有- /*
- 函数名:CAN1_Send_Msg
- 形 参:
- msg:待发送的数组
- stdid:CAN StdID
- extid:CAN extid
- len:发送的数据长度,最长8
- 返回值:无
- 功 能:CAN1发送函数
- */
- void CAN1_Send_Msg(uint8_t msg[],uint32_t stdid,uint32_t extid,uint8_t len)
- {
- uint32_t can1_return;
-
- can1_tx.StdId=stdid;
- can1_tx.ExtId=extid;
- can1_tx.IDE=CAN_ID_STD;
- can1_tx.RTR=CAN_RTR_DATA;
- can1_tx.DLC=len;
- if(len>8)
- {
- printf("ERROR:CAN DLC MAX LEN 8");
- }
- while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan1)==0) /*CAN发送FIFO只有3个,灯待发送完毕后再发送,否则会造成数据丢包*/
- {
- printf("CAN1 FIFO发送队列溢出!\r\n");
- }
- HAL_CAN_AddTxMessage(&hcan1,&can1_tx,msg,&can1_return);
- }
- /*
- 函数名:CAN2_Send_Msg
- 形 参:
- msg:待发送的数组
- stdid:CAN StdID
- extid:CAN extid
- len:发送的数据长度,最长8
- 返回值:无
- 功 能:CAN2发送函数
- */
- void CAN2_Send_Msg(uint8_t* msg,uint32_t stdid,uint32_t extid,uint8_t len)
- {
- uint32_t can2_return;
- can2_tx.StdId=stdid;
- can2_tx.ExtId=extid;
- can2_tx.IDE=CAN_ID_STD;
- can2_tx.RTR=CAN_RTR_DATA;
- can2_tx.DLC=len;
- if(len>8)
- {
- printf("ERROR:CAN DLC MAX LEN 8");
- }
- while(HAL_CAN_GetTxMailboxesFreeLevel(&hcan2)==0)
- {
- printf("CAN2 FIFO发送队列溢出!\r\n");
- }
- HAL_CAN_AddTxMessage(&hcan2, &can2_tx, msg, &can2_return);
-
- }
复制代码
|
|