当发送指令放置在接收中断时,一切正常。如果把发送中断移值主程序,偶尔就会出现发送指令不执行或延迟执行的现象 。
//===================================
// 初始化Lpuart
//===================================
void lpuart_init(void)
{
uint16_t u16Scnt = 0;
stc_gpio_config_t stcGpioCfg;
stc_lpuart_sclk_sel_t stcSclk;
stc_lpuart_config_t stcConfig;
stc_lpuart_irq_cb_t stcLPUartIrqCb;
stc_lpuart_multimode_t stcMulti;
stc_lpuart_baud_t stcBaud;
DDL_ZERO_STRUCT(stcConfig);
DDL_ZERO_STRUCT(stcLPUartIrqCb);
DDL_ZERO_STRUCT(stcMulti);
DDL_ZERO_STRUCT(stcBaud);
DDL_ZERO_STRUCT(stcGpioCfg);
DDL_ZERO_STRUCT(stcSclk);
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
Sysctrl_SetPeripheralGate(SysctrlPeripheralLpUart1, TRUE);
stcGpioCfg.enDir = GpioDirOut;
Gpio_Init(GpioPortA, GpioPin0, &stcGpioCfg); //TX
stcGpioCfg.enDir = GpioDirIn;
stcGpioCfg.enPuPd = GpioPu;
Gpio_Init(GpioPortA, GpioPin1, &stcGpioCfg); //RX
Gpio_SetAfMode(GpioPortA, GpioPin0, GpioAf2);
Gpio_SetAfMode(GpioPortA, GpioPin1, GpioAf2);
stcLPUartIrqCb.pfnRxIrqCb = LPUartRxIntCallback;
stcLPUartIrqCb.pfnTxIrqCb = NULL;
stcLPUartIrqCb.pfnRxFEIrqCb = NULL;
stcLPUartIrqCb.pfnPEIrqCb = NULL;
stcLPUartIrqCb.pfnCtsIrqCb = NULL;
stcConfig.pstcIrqCb = &stcLPUartIrqCb;
stcConfig.bTouchNvic = TRUE;
stcConfig.enStopBit = LPUart1bit;
stcConfig.enRunMode = LPUartMode1;//
stcSclk.enSclk_Prs = LPUart4Or8Div;
stcSclk.enSclk_sel = LPUart_Rcl;
stcConfig.pstcLpuart_clk = &stcSclk;
stcMulti.enMulti_mode = LPUartNormal;
stcConfig.pstcMultiMode = &stcMulti;
LPUart_Init(LPUART1, &stcConfig);
LPUart_SetClkDiv(LPUART1, LPUart4Or8Div);
stcBaud.u32Sclk = LPUart_GetSclk(LPUART1);
stcBaud.enRunMode = LPUartMode1;
stcBaud.u32Baud = 9600;
u16Scnt = LPUart_CalScnt(LPUART1, &stcBaud);
LPUart_SetBaud(LPUART1, u16Scnt);
LPUart_EnableIrq(LPUART1, LPUartRxIrq);
LPUart_ClrStatus(LPUART1, LPUartRC);
LPUart_EnableFunc(LPUART1, LPUartRx);
}
//===================================
// LPUART 中断服务函数
//===================================
void LPUartRxIntCallback(void)
{
Uartbuff[UartRX_dp++] = LPUart_ReceiveData(LPUART1);;
if(UartRX_dp >= 8)
{
if( (Uartbuff[0] == PollAdd) || (Uartbuff[0] == 0) )
{
if((Uartbuff[1] == 3) || (Uartbuff[1] == 6) || (Uartbuff[1] == 8))
{
ISRcrc16 = ISRcal_crc16(Uartbuff, 6);
if( (Uartbuff[6] == ((uint8_t)ISRcrc16)) && ( Uartbuff[7] == ((uint8_t)(ISRcrc16 >> 8))) )
{
//准备发送
UartHartrecok = 0x55;
if((Uartbuff[1] == 3) || (Uartbuff[1] == 6))
**.ReportSum** = 0;
// Rxreal**=0;
UartRX_dp = 0;
}
code16 = 0;
}
else if(Uartbuff[1] == 0x10)
{
if(UartRX_dp >= (Uartbuff[6] + 9))
{
ISRcrc16 = ISRcal_crc16(Uartbuff, Uartbuff[6] + 7);
if( (Uartbuff[Uartbuff[6] + 7] == ((uint8_t)ISRcrc16)) && ( Uartbuff[Uartbuff[6] + 8] == ((uint8_t)(ISRcrc16 >> 8))) )
{
//准备发送
UartHartrecok = 0x55;
**.ReportSum** = 0;
// Rxreal**=0;
UartRX_dp = 0;
}
code16 = 0; //20220419
}
else code16 = 0x55; //未收完
}
else code16 = 0;
}
if( (UartHartrecok != 0x55) && (code16 != 0x55) ) //数据不对,移除最旧的一个字节
{
uint8_t i;
for(i = 0; i < UartRX_dp - 1; i++) Uartbuff = Uartbuff[i + 1];
UartRX_dp -= 1;
}
if(UartHartrecok == 0x55)
{
MODBUSManagement();
}
}
}
//===================================
// LPUART发送命令处理函数
//===================================
void MODBUSManagement(void)
{
if(UartHartrecok == 0x55)
{
uint8_t UartTX_cn;
UartHartrecok = 0;
UartTX_cn = Uart_rx_deal(Uartbuff);
/*数据发送*/
for(uint8_t i = 0; i < UartTX_cn; i++)
{
LPUart_SendData(LPUART1, Uartbuff);
}
}
} |