From eb5628c9985d9c6b485eae7ebf8d666c4f8ba269 Mon Sep 17 00:00:00 2001
From: darya
Date: Tue, 23 Jun 2026 09:04:21 +0300
Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?=
=?UTF-8?q?=D0=BD=D0=B8=D0=B5=2023.06.2026?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Inc/CanSerialPortFrame.h | 2 ++
Src/CanSerialPortFrame.c | 43 ++++++++++++++++++++++++++++------------
2 files changed, 32 insertions(+), 13 deletions(-)
diff --git a/Inc/CanSerialPortFrame.h b/Inc/CanSerialPortFrame.h
index e45ef48..17059d9 100644
--- a/Inc/CanSerialPortFrame.h
+++ b/Inc/CanSerialPortFrame.h
@@ -54,6 +54,8 @@ typedef struct {
uint8_t CAN_INDEX;
+ osMessageQueueId_t txDataQueueCan;
+
uint32_t id;
uint32_t id1;
FLEXCAN_IdType canTypeFrame;
diff --git a/Src/CanSerialPortFrame.c b/Src/CanSerialPortFrame.c
index 141a465..c996a75 100644
--- a/Src/CanSerialPortFrame.c
+++ b/Src/CanSerialPortFrame.c
@@ -118,6 +118,7 @@ bool vCanSerialPortFrameDMAInit(
env->DMA_ErrorCallback = DMA_ErrorCallback;
+ env->txDataQueueCan = osMessageQueueNew(1, 1, NULL);
env->access = osMutexNew(NULL);
//начало-----------------------------------DMA-RX-------------------------------------------------------------------
@@ -325,7 +326,7 @@ bool vCanSerialPortFrameMbInit(
// env->DMA_ErrorCallback = DMA_ErrorCallback;
env->access = osMutexNew(NULL);
-
+ env->txDataQueueCan = osMessageQueueNew(1, 1, NULL);
//начало------------------------------------CAN---------------------------------------------------------------------
//начало------------------------------------CAN---------------------------------------------------------------------
@@ -704,6 +705,32 @@ vCanSerialPortFrameReceive(tCanSerialPortFrameFlagchip *env, uint8_t idFilter, u
// : 0;
//}
+FLEXCAN_ErrorType TransmitCan(tCanSerialPortFrameFlagchip *env, FLEXCAN_TxMsgType *tTxMsg) {
+
+ FLEXCAN_ErrorType tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, tTxMsg);
+
+ if (tRetval != FLEXCAN_ERROR_OK) {
+ FLEXCAN_TransmitAbort(env->CAN_INDEX, tTxMsg->u8TxHandler);
+ } else {
+
+ if (tTxMsg->bWaitTxCompleted) {
+
+ uint8_t u8TxHandler;
+ if (osMessageQueueGet(env->txDataQueueCan, &u8TxHandler, NULL, tTxMsg->bWaitTxCompleted) == osOK) {
+ tRetval = FLEXCAN_ERROR_OK;
+ } else {
+ tRetval = FLEXCAN_ERROR_TIMEOUT;
+ }
+
+ }
+
+ FLEXCAN_TransmitProcess(env->CAN_INDEX, tTxMsg->u8TxHandler);
+ }
+
+ return tRetval;
+}
+
+
uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *data, uint16_t size, uint32_t adr,
uint8_t canType, uint32_t timeout) {
@@ -739,12 +766,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *
FCFUNC_FcOwnMemcpy(tTxMsg.aData, &data[len], 8, NULL);
len += 8;
- tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, &tTxMsg);
- if (tRetval != FLEXCAN_ERROR_OK) {
- FLEXCAN_TransmitAbort(env->CAN_INDEX, tTxMsg.u8TxHandler);
- } else {
- FLEXCAN_TransmitProcess(env->CAN_INDEX, tTxMsg.u8TxHandler);
- }
+ tRetval = TransmitCan(env, &tTxMsg);
sent += 8;
size -= 8;
@@ -755,12 +777,7 @@ uint16_t vCanSerialPortFrameTransmit(tCanSerialPortFrameFlagchip *env, uint8_t *
FCFUNC_FcOwnMemcpy(tTxMsg.aData, &data[len], tailSize, NULL);
- tRetval = FLEXCAN_TransmitData(env->CAN_INDEX, &tTxMsg);
- if (tRetval != FLEXCAN_ERROR_OK) {
- FLEXCAN_TransmitAbort(env->CAN_INDEX, tTxMsg.u8TxHandler);
- } else {
- FLEXCAN_TransmitProcess(env->CAN_INDEX, tTxMsg.u8TxHandler);
- }
+ tRetval = TransmitCan(env, &tTxMsg);
sent += tailSize;
size -= tailSize;