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