|
UART缓冲区1800字节左右,波特率921600,用的空闲中断+DMA接收
void UART5_IRQHandler(void)
{
if(__HAL_UART_GET_FLAG(&huart5, UART_FLAG_IDLE) != RESET){ // 串口空闲中断
__HAL_UART_CLEAR_IDLEFLAG(&huart5); // 清除空闲中断标志位
HAL_UART_DMAStop(&huart5); // 停止接收 DMA
UART05_RX_LENGTH = UART05_IDLE_MAX_RECEIVE - __HAL_DMA_GET_COUNTER(&hdma_uart5_rx); // 计算接收到的数据长度
HAL_UART_Receive_DMA(&huart5, (uint8_t*)UART05_IDLE_BUFF, UART05_IDLE_MAX_RECEIVE); // 重新打开DMA
UART5_APPrxFramDone = 1;
}
HAL_UART_IRQHandler(&huart5); // 重新打开中断
}
现在需要将UART接收到的数据通过CAN转发出去,CAN用的标准CAN,波特率1M
CAN配置为:
hfdcan1.Instance = FDCAN1; /* 配置FDCAN1 */
hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC; /* 配置使用FDCAN可变波特率 */
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; /* 配置使用正常模式 */
hfdcan1.Init.AutoRetransmission = DISABLE; /* 使能自动重发 */
hfdcan1.Init.TransmitPause = DISABLE; /* 配置禁止传输暂停特性 */
hfdcan1.Init.ProtocolException = ENABLE; /* 协议异常处理使能 */
hfdcan1.Init.NominalPrescaler = 0x02;
hfdcan1.Init.NominalSyncJumpWidth = 0x04;
hfdcan1.Init.NominalTimeSeg1 = 0x05;
hfdcan1.Init.NominalTimeSeg2 = 0x04;
CAN发送函数为:
void can1_SendPacket(uint8_t *_DataBuf,uint16_t _BufferSize)
{
uint8_t dataBuf[8];
FDCAN_TxHeaderTypeDef TxHeader = {0};
/* 第1步:配置发送参数 ===================================================================*/
TxHeader.Identifier = 0x001; /* 设置接收帧消息的ID */
TxHeader.IdType = FDCAN_STANDARD_ID; /* 标准ID */
TxHeader.TxFrameType = FDCAN_DATA_FRAME; /* 数据帧 */
TxHeader.DataLength = FDCAN_DLC_BYTES_8; /* 发送数据长度 */
TxHeader.ErrorStateIndicator = FDCAN_ESI_ACTIVE; /* 设置错误状态指示 */
TxHeader.BitRateSwitch = FDCAN_BRS_OFF; /* 关闭可变波特率 */
TxHeader.FDFormat = FDCAN_FD_CAN; /* FDCAN格式 */
TxHeader.TxEventFifoControl = FDCAN_STORE_TX_EVENTS; /* 用于发送事件FIFO控制, 不存储 */
TxHeader.MessageMarker = 1; /* 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF */
/* 第2步:添加数据到TX FIFO, 连续添加三组 ================================================*/
for(uint16_t i = 0; i < _BufferSize; i+=8)
{
uint16_t bytesToSend = _BufferSize - i;
if (bytesToSend < 8)
{
memset(dataBuf, 0, sizeof(dataBuf)); // 用0填充剩余的部分
memcpy(dataBuf, _DataBuf + i, bytesToSend); // 复制剩余的数据
}
else
{
memcpy(dataBuf, _DataBuf + i, sizeof(dataBuf)); // 复制8字节数据
}
HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &TxHeader, dataBuf); /* 根据需要,可以修改_DataBuf数值 */
}
}
现在的问题是,CAN转发的数据总是出现覆盖,第一帧数据没发完,第二帧数据又来了,想请问下这个怎么解决啊
|
|