怎么连续接受多个帧?

2019-08-16 19:22发布

本帖最后由 背包客 于 2017-7-23 09:36 编辑

上位机一次发送多个帧给下位,请问应该怎么写?
下面程序只能接受一个帧,当接收两个帧时,程序就会卡死,请问大神应该怎么改写?

void USART3_IRQHandler(void)
{
        u8 inbyte;
        inbyte = USART_ReceiveData(USART3);
        
        if ( sio_rx_buf.len  >= (SIO_BYTE_BUF_MAX - 1) )
        {
                sio_rx_buf.len = 0;
                sio_byte_buf_flush(&sio_rx_buf);
        }
        
        if ( (sio_rx_buf.len == 0 ) && (inbyte != RCP_PKT_PRAMBL)  )
        {
                return;
        }

        sio_byte_buf_enqueue(&sio_rx_buf, inbyte);

        if(sio_rx_buf.len >= (sio_rx_buf.data[4] + RCP_HEADEND_CRC_LEN))
        {
                if(        sio_rx_buf.data[sio_rx_buf.data[4] + RCP_PRAMBL_LEN + RCP_HEADER_LEN] == RCP_PKT_ENDMRK)
                {                        
                        sio_post_received_data(&sio_rx_buf.data[0],sio_rx_buf.len);
                }

        }
}

void sio_post_received_data(u8* data, u8 len)
{

        while(len--)
        {
    while((USART1->SR&0x40)==0);        
        USART_SendData(USART1,*data++);                                                //将接收到的数据发送出去

        }        
        sio_byte_buf_flush(&sio_rx_buf);
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
操作系统
1楼-- · 2019-08-16 19:26
 精彩回答 2  元偷偷看……
cromarti
2楼-- · 2019-08-16 22:08
其他代码也贴一下吧,都不知道其他部分的作用
cromarti
3楼-- · 2019-08-17 02:38
虽然没有代码,但是接受和发送共用缓冲区会不会因为速度太慢导致缓冲区被重复写入?以及每次接受完一帧有没有清除所有状态迎接第二帧?
闪电之舞
4楼-- · 2019-08-17 03:10
环形缓冲区,我上个帖子写了个简易的缓冲区
但是没人看   
尴尬
背包客
5楼-- · 2019-08-17 06:46
cromarti 发表于 2017-7-23 10:07
其他代码也贴一下吧,都不知道其他部分的作用

谢谢,搞定了,把接收到的数据放到中断外面处理就可以了
背包客
6楼-- · 2019-08-17 10:41
 精彩回答 2  元偷偷看……

一周热门 更多>