一种多串口冗余设计解决思路

发布时间:2024年01月04日

需求

总共11个串口,现在每个串口接收BUFF分配1024个字节的收发缓冲区。原始方法将11个串口全部进行初始化,分配大串口,由于单片机RAM不足,现在将串口1和串口2固定分配为大串口,串口3-11随机选择2个作为大串口,其他串口BUFF缓冲区配置为256字节的小串口,总体可以节约5k左右ram空间。

思路

单独定义一个大串口接收和发送的结构体,并且确立缓冲区大小为1024,在原始的串口结构体中定义大串口标识符 Seril_index。根据串口不同的工作模式(连接液晶屏幕或者其他),当判断串口是大串口时, Seril_index保存大串口的串口号。

重新定义一个新的大串口结构体,Seril_index;

typedef struct
{
  int Seril_index;
  u8 RxBuffer[MAXCOMBUFSIZE_PLUS];
  u8 TxBuffer[MAXCOMBUFSIZE_PLUS];
}UART_PLUS_BUF;
extern UART_PLUS_BUF  stUartPlusBuf[PLUS_SERIAL_NUM];

判断是否为大串口并更新选中的大串口状态


bool IsPlusBufSerial(u8 serial_index) 
{
    bool isPlusBuf = false;

    if(serial_index > USART_NUM)
      return false;
      
    //大串口判断条件
    if (UartParam[serial_index].WorkMode == UART_FUN_LCD ) 
    {
        isPlusBuf = true;
    }
    return isPlusBuf;
}

部分代码实现

void Init_PlusUart()
{
    // //初始化大串口
    for (u8 i = 0; i < PLUS_SERIAL_NUM; i++)
    {
        if (i<=1)
            stUartPlusBuf[i].Seril_index = i; 
        if (i>1)
            stUartPlusBuf[i].Seril_index = -1; 
    }
    // 更新选中的大串口状态
    u8 count = 2;
    for (u8 i = 2; i < USART_NUM && count < PLUS_SERIAL_NUM; i++)
    {
        if (IsPlusBufSerial(i))  
        {
            if (stUartPlusBuf[count].Seril_index  == -1)
            {
                stUartPlusBuf[count].Seril_index = i;
                count++;
            }
        }
    }

    //保护大串口参数
    u8 ucPlusUsartNum = 2;
    for(u8 i=2;i<MAXUARTNUM;i++)
    {
        if (UartParam[i].WorkMode ==3 || UartParam[i].PlusBufFlg == 1)
        {
            ucPlusUsartNum++;
        }
        if (ucPlusUsartNum>4)
        {
            UartParam[i].WorkMode = 0;
            UartParam[i].PlusBufFlg = 65535;
        }
    }
}
文章来源:https://blog.csdn.net/m0_46152793/article/details/135363414
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。