论坛元老
 
- 积分
- 4464
- 金钱
- 4464
- 注册时间
- 2018-5-14
- 在线时间
- 957 小时
|
发表于 2020-8-27 11:08:13
|
显示全部楼层
环形队列可以不需要的。给你看看我的做法typedef struct{
uint8_t Buff[Buffsize];
bool GetOk;
bool GetStart;
uint8_t GetAcc;
uint8_t GetTimOut;
uint8_t GetLen;
}Usart_GetBuff_Typedef;
typedef struct{
uint8_t Buff[Buffsize];
bool SendStatus;
uint16_t SendLength;
uint16_t SendAcc;
}Usart_SendBuff_Typedef;
串口接收
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
uint8_t Res = USART_ReceiveData(USART1);
USART1_GetBuff.GetStart = 1; //and the data receive is start
USART1_GetBuff.Buff[USART1_GetBuff.GetAcc] = Res;//load data to get buff
USART1_GetBuff.GetTimOut = 0; //get data time out count clear
USART1_GetBuff.GetAcc++; //get data pointer plus 1
if(USART1_GetBuff.GetAcc >= Buffsize)//if the data is to big overflow the buff,set pointer to zero
USART1_GetBuff.GetAcc = 0;
}
定时器1ms中断
void
USART1GetTimeOutCheck(void)
{
if(USART1_GetBuff.GetStart == 1)
{
USART1_GetBuff.GetTimOut++;
if(USART1_GetBuff.GetTimOut > 3)
{
USART1_GetBuff.GetTimOut = 0;
USART1_GetBuff.GetLen = USART1_GetBuff.GetAcc;
USART1_GetBuff.GetOk = 1;
USART1_GetBuff.GetAcc = 0;
USART1_GetBuff.GetStart = 0;
}
}
}
主循环处理
if(USART1_GetBuff.GetOk)
{
USART1_GetBuff.GetOk=0;
USART2_Send(USART1_GetBuff.Buff,USART1_GetBuff.GetLen);
}
|
|