需求
总共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;}}
}