新手入门
- 积分
- 13
- 金钱
- 13
- 注册时间
- 2017-7-24
- 在线时间
- 3 小时
|
1金钱
本帖最后由 qweasdzxc 于 2021-8-5 01:36 编辑
芯片:STM32F030C8t6 Keil5 库函数版本
测试环境:串口助手 发送指令如5A 01 00 00 A5,第一次没有反应,读到的接收数据长度异常,第二次发送指令,才会有动作,接收指令数据长度正常为5;
修改指令如5A 01 00 00 00 A5,发送指令长度为5,下一次发送指令,长度才是正常6。
感觉总是在执行上一次的内存中的东西。
代码如下:
串口中断函数:
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_RXNE)!=RESET) //表示接收到数据
{
//USART2_SendNByte(TxBuffer,11);
//先判断是否超时
if(RXTimout==0) //没有超时,将数据存储到接收数组,并将RXNE清零中断清零
{
Rec_Len=i;
USART2_Printf(&i);
i=0;
Rec_Over_Flag=1;
}
else //如果超时,将数组的数据长度i进行赋值,在清空,接收完成中断标志位置1;
{
USART_RX_BUF[i++]=USART_ReceiveData(USART2);
}
RXTimout=10;//定时器重新赋值
}
}
定时器中断函数:
void TIM3_IRQHandler(void) //TIME3中断服务函数 需要设定中断优先级 即NVIC配置
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update))//判断是否发生了更新(溢出)中断 表示已经中断进入
{
if(RXTimout>0)//判断是否到指定的延时时间,1ms中断一次,需要进来3次
{
RXTimout--;
}
}
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//清除溢出中断标志位
}
主函数命令解析:
while(1)
{
if(Rec_Over_Flag==1)//表示接收完成一组数据
{
Len=Rec_Len;//将接收到的数据长度赋值给新的变量
if(Len<USART_REC_LEN)//判断接收的数据长度是否超过了指定的数组大小
{
if((USART_RX_BUF[0]==0XA5)&&(USART_RX_BUF[Len-1])==0X5A)
{
if(USART_RX_BUF[1]==0X01)
{
LED1_ONOFF(Bit_SET);
USART2_SendNByte(Tx3,10);
}
else if(USART_RX_BUF[1]==0X02)
{
LED1_ONOFF(Bit_SET);
USART2_SendNByte(Tx4,10);
}
}
}
else return 0;
Rec_Over_Flag=0;
}
}
麻烦帮忙找找问题,谢谢,附件可编译
|
|