如何规定串口轮询中所接收数据的固定长度,如规定PC端只有5个字符,发送到开发板,开发板收到后将5个字符发回PC端。
这个视频也许对你有帮助,https://www.bilibili.com/video/BV1zg411V7Mc/?vd_source=8e8896925add7370413fb1acc94864c2
举个例子:u8 m_Recvbuf[20],m_Sendbuf[20];//接收与发送缓存
u16 TimeOut=0;//超时判断 可以放到中断定时器(一般1ms)定时计数++,超时时间可以设置成1000即1S
void Data_ReceviedandSendbuf(u8 Len)
{//Len 为接收数据长度,调用时直接填数
u8 i = 0;
for(i=0;i<Len;)
{//超过Len个跳出循环
while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET)
{
TimeOut=0;//超时时间重新计数
x = USART_ReceiveData(USART1);
// USART_SendData(USART1, x); //可以接收一个发一个
m_Recvbuf[i] = x;//接收缓存
m_Sendbuf[i] = x;//发送缓存
i++;
}
if(TimeOut>1000)
{//接收超时1S 跳出循环
break;
}
}
}
轮询模式使用时,进入到接收等待阶段,函数的中需要加一个超时时间TimeOut,不然会一直在等待状态。
在接收函数中,如果TimeOut内还未接收完5个字节的数据,则会向后执行,如果接收完则立即向后执行。发送数据的函数也一样。
轮询模式使用起来最简单,但是会占用大量的cpu时间,在等待接收和等待发送完毕时,cpu不能去做别的运算,只能在这里空等,运行的效率很低。
下位机采用DMA方式接收数据即可