中级会员
- 积分
- 467
- 金钱
- 467
- 注册时间
- 2017-12-20
- 在线时间
- 60 小时
|
10金钱
[mw_shl_code=c,true]//串口接收缓存区
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; //接收缓冲,最大USART2_MAX_RECV_LEN个字节.
u16 USART2_RX_STA=0;
void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据 接收到以0x0d,0x0a作为结尾的数据
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
res =USART_ReceiveData(USART2); //读取一字节的数据
if((USART2_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据 (1<<15)即0x8000
{
if(USART2_RX_STA<USART2_MAX_RECV_LEN) //还可以接收数据
{
TIM_SetCounter(TIM2,0);//计数器清空
if(USART2_RX_STA==0)
{
TIM_Cmd(TIM2, ENABLE); //使能定时器2
}
USART2_RX_BUF[USART2_RX_STA++]=res; //记录接收到的值 。转存数据
if(USART2_RX_BUF[0]==0x71)//UFM通讯协议指令
{
if(USART2_RX_BUF[USART2_RX_STA]==0x17||USART2_RX_BUF[USART2_RX_STA]==0x03)
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
}
else if(USART2_RX_BUF[0]==0x41)//蓝牙指令
{
if(USART2_RX_BUF[USART2_RX_STA-3]==0x30&&USART2_RX_BUF[USART2_RX_STA-2]==0x31&&USART2_RX_BUF[USART2_RX_STA-1]==0x0d&&USART2_RX_BUF[USART2_RX_STA]==0x0a)
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
else if(USART2_RX_BUF[USART2_RX_STA-3]==0x30&&USART2_RX_BUF[USART2_RX_STA-2]==0x30&&USART2_RX_BUF[USART2_RX_STA-1]==0x0d&&USART2_RX_BUF[USART2_RX_STA]==0x0a)
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
}
else
{
USART2_RX_STA=0;//丢弃之前的数据,重新开始接收
}
}
else
{
USART2_RX_STA|=1<<15; //强制标记接收完成
}
}
}
} [/mw_shl_code]
现在安卓通过蓝牙给我发数据,数据长度是50个字节,安卓是分包后发送给我的,每包20个字节,我如何把这50个字节接收完整啊?
现在的情况是,能收到50个字节,但是这50个字节的数据,前20个字节的正确,最后10个字节也正确,中间的20个字节数据是把正常数据的最后20个字节填进来了。
|
最佳答案
查看完整内容[请看2#楼]
我觉得最好不要再接收中断里面做数据处理,对于分包的数据.可以做一个类似循环队列的处理.采用DMA+空闲中断的方式更节省CPU资源,每次进入空闲中断后将接收到的数据全部丢到队列里面,主函数里面只需要不停的解析队列里面的数据就可以了!
|