This commit is contained in:
cfif 2026-06-02 12:30:21 +03:00
parent c1d9a582fc
commit 1ee101a5c9
2 changed files with 22 additions and 13 deletions

View File

@ -47,4 +47,6 @@ void vSerialPortLinInit(
void SerialPort_IrqProcessing_UartLin(tSerialPortLinArtery *env);
tSerialPortLinIO vSerialPorLinGetIo(tSerialPortLinArtery *env);
void LIN_CheckTimeout(tSerialPortLinArtery *env);
#endif //SERIALPORT_SERIALPORTLIN_ARTERY_H

View File

@ -19,8 +19,8 @@ void vSerialPortLinInit(
) {
env->uart = uart;
env->linLastByteTime = 20;
env->linFrameTimeoutMs = 20;
env->linLastByteTime = 10;
env->linFrameTimeoutMs = 10;
usart_reset(uart);
@ -126,6 +126,7 @@ static uint8_t LIN_CalcParity(uint8_t id) {
void SerialPort_IrqProcessing_UartLin(tSerialPortLinArtery *env) {
// 1. Break frame detection
if (usart_flag_get(env->uart, USART_BFF_FLAG)) {
usart_flag_clear(env->uart, USART_BFF_FLAG);
usart_data_receive(env->uart);
@ -137,15 +138,17 @@ void SerialPort_IrqProcessing_UartLin(tSerialPortLinArtery *env) {
return;
}
// 2. Receive data (без IDLE)
if (usart_flag_get(env->uart, USART_RDBF_FLAG)) {
if (env->linFrameStarted && (env->linByteCount < sizeof(env->linBuffer))) {
uint8_t data = usart_data_receive(env->uart);
if (env->linFrameStarted && (env->linByteCount < sizeof(env->linBuffer))) {
env->linBuffer[env->linByteCount] = data;
env->linByteCount++;
env->linLastByteTime = SystemGetMs(); // Обновляем время
} else {
usart_data_receive(env->uart);
if (env->linFrameStarted) {
env->rxFrame.event = LIN_RX_OVERRUN;
osMessageQueuePut(env->rxDataQueue, &env->rxFrame, 0, 0);
@ -359,20 +362,24 @@ static uint8_t vLinTransmitCommand(tSerialPortLinArtery *env, tLinData *linData,
static uint8_t vLinReceivedCommand(tSerialPortLinArtery *env, tLinData *linData, uint32_t timeout) {
lin_frame_t rxFrame;
uint16_t len = vSerialPortLinReceiveQueue(env, (void *) &rxFrame, sizeof(lin_frame_t), osWaitForever, env->rxDataQueue);
// uint16_t len = vSerialPortLinReceiveQueue(env, (void *) &rxFrame, sizeof(lin_frame_t), osWaitForever, env->rxDataQueue);
osStatus_t result = osMessageQueueGet(env->rxDataQueue, (void *) &rxFrame, NULL, osWaitForever);
if (result == osOK) {
if (len == 0) {
return LIN_NO_EVENT;
}
memset(linData->g_aRxBuffer, 0, sizeof(linData->g_aRxBuffer));
linData->g_aRxBufferLen = rxFrame.dataLen;
linData->g_aRxBufferLen = rxFrame.dataLen + 1;
linData->g_aRxBuffer[0] = rxFrame.id;
for (uint8_t i = 0; i < rxFrame.dataLen; ++i) {
linData->g_aRxBuffer[i] = rxFrame.data[i];
linData->g_aRxBuffer[i + 1] = rxFrame.data[i];
}
return rxFrame.event;
}
return LIN_NO_EVENT;
}
tSerialPortLinIO vSerialPorLinGetIo(tSerialPortLinArtery *env) {
tSerialPortLinIO io = {
.env = env,