cancel
Showing results for 
Search instead for 
Did you mean: 

Rebroadcasting existing CAN msg on network issue

pulsar
Associate II

I'm working with an existing CAN network on which I want to read a msg, modify it slightly and rebroadcast.

I'm running into an issue where the code seems to crash/freeze if I broadcast the new message too close to the original one thats on the network.

Inside HAL_CAN_RxFifo0MsgPendingCallback() I listen for the msg I want to modify and do a HAL_CAN_AddTxMessage() call as soon as it arrives with the updated msg data.  This seems to be working fine. 

I then want to repeat identical msg just before the next time the original msg is broadcast on the network which is on a 30ms interval.  I use HAL_GetTick() to track when the last msg was received inside HAL_CAN_RxFifo0MsgPendingCallback() and then in the main while(1) loop again I use HAL_GetTick() to count down the ms to just before the next msg is expected to be and do a HAL_CAN_AddTxMessage() with the custom data.  This seems to be working fine unless I get within 4ms of the original msg at which point everything hangs.  I'd like to get as close as possible to the original msg.

Any suggestion how I can accomplish this or a better way of doing it?  I cannot modify the original CAN network, I can only read and broadcast messages.

4 REPLIES 4
SofLit
ST Employee

Hello @pulsar and welcome to the community,

Need to share your code to understand what you are intending to do.

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.
pulsar
Associate II

So this code is very crude...

 

 

void HAL_CAN_RxFifo0MsgPendingCallback_(CAN_HandleTypeDef *hcan_)
{
	HAL_CAN_GetRxMessage(&hcan, CAN_RX_FIFO0, &RxHeader, (uint8_t*)RxData);

	if(RxHeader.StdId == 0x250)
	{
		RxData[0] = 0;
		HAL_CAN_AddTxMessage(&hcan, &TxHeader, (uint8_t*)RxData, &TxMailbox);
		last_received_tick = HAL_GetTick();
		process_msg = 1;
	}
}

while (1)
{
	if (process_msg && (HAL_GetTick() - last_received_tick) >= 27) {
		HAL_CAN_AddTxMessage(&hcan, &TxHeader, (uint8_t*)our_msg, &TxMailbox);
		process_msg = 0;
	}
}

 

SofLit
ST Employee

Sorry I didn't understand this statement:


@pulsar wrote:

This seems to be working fine unless I get within 4ms of the original msg at which point everything hangs.  I'd like to get as close as possible to the original msg.


I think better to put a sketch or figure of what your program is intended to work and what the problem is ... 

To give better visibility on the answered topics, please click on "Accept as Solution" on the reply which solved your issue or answered your question.
pulsar
Associate II

I'm listing to an existing network for a specific msg id which is broadcast on 30ms interval. When that message is detected/received, I want to right away broadcast my own msg that's on the same id. Then I want to repeat this custom message broadcast before the next original version is broadcast on the network, as late as possible before its next 30ms cycle.