初级会员

- 积分
- 199
- 金钱
- 199
- 注册时间
- 2020-5-28
- 在线时间
- 57 小时
|
30金钱
原子哥的程序里 串口收到数据直接放进数组里 我就拿出来用,然后对比做选择之后确定一个功能位,然后在里面放标志位 ,最后处理标志位里面输出动作什么的。这种逻辑怎么样 ,我想知道大家都是怎么写这个的,各位有没有简单工程的 源码让小弟学学 ,自己学着 见识太少了。 int main(void)
{
u16 t;
u16 len;
u16 times=0;
u16 i=0;
u8 flag;
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
LED_Init();
KEY_Init();
while(1)
{
////////////////////////////////////////////////////////////////////////////////////////
if(USART_RX_STA&0x8000)
{
len=USART_RX_STA&0x3fff;
for(t=0;t<len;t++)
{
/*这里判断下传过来的数据 是不是想要的,格式正确就返回值*/
if( USART_RX_BUF[0]==0x55 && USART_RX_BUF[len-1]==0x68 && USART_RX_BUF[len-2]==USART_RX_BUF[1]+USART_RX_BUF[2]+USART_RX_BUF[3])
{
if(USART_RX_BUF[1]==1) //这里判断其中一个位置来判断功能位,
{
USART_SendData(USART1, USART_RX_BUF[t]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
LED0=1;
flag=1; //是标志位的话,就给个值,让下面程序继续处理
}
else if(USART_RX_BUF[1]==2) //
{
USART_SendData(USART1, USART_RX_BUF[t]);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
LED0=0;
}
}
}
USART_RX_STA=0;
}
////////处理标志位////////////////////////
if(flag==1)
{
flag=0;
LED1=!LED1;
delay_ms(100);
LED1=!LED1;
delay_ms(100);
LED1=!LED1;
USART_SendData(USART1,0x65);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
USART_SendData(USART1, 0xef);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
USART_SendData(USART1, 0xff);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
USART_SendData(USART1, 0x87);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
}
/////////////////////////////////////////////////////////////////
}
}
|
最佳答案
查看完整内容[请看2#楼]
基本流程:
串口中断->串口数据流->拷贝到FIFO->退出中断->应用(main)从FIFO取出数据解析、处理。
参考:
https://acuity.blog.csdn.net/article/details/108367512
|