diff --git a/Inc/SerialPortLinArtery.h b/Inc/SerialPortLinArtery.h index db30db8..d7adb26 100644 --- a/Inc/SerialPortLinArtery.h +++ b/Inc/SerialPortLinArtery.h @@ -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 diff --git a/Src/SerialPortLinArtery.c b/Src/SerialPortLinArtery.c index 717a27b..f933a40 100644 --- a/Src/SerialPortLinArtery.c +++ b/Src/SerialPortLinArtery.c @@ -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)) { + + uint8_t data = usart_data_receive(env->uart); + if (env->linFrameStarted && (env->linByteCount < sizeof(env->linBuffer))) { - uint8_t data = usart_data_receive(env->uart); 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,18 +362,22 @@ 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 + 1; + linData->g_aRxBuffer[0] = rxFrame.id; + for (uint8_t i = 0; i < rxFrame.dataLen; ++i) { + linData->g_aRxBuffer[i + 1] = rxFrame.data[i]; + } + + return rxFrame.event; } - linData->g_aRxBufferLen = rxFrame.dataLen; - for (uint8_t i = 0; i < rxFrame.dataLen; ++i) { - linData->g_aRxBuffer[i] = rxFrame.data[i]; - } - - return rxFrame.event; + return LIN_NO_EVENT; } tSerialPortLinIO vSerialPorLinGetIo(tSerialPortLinArtery *env) {