OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3018|回复: 8

怎么连续接受多个帧?

[复制链接]

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-7-18
在线时间
9 小时
发表于 2017-7-23 09:36:25 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 背包客 于 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);
}

RCP报文

RCP报文

报文解析

报文解析

最佳答案

查看完整内容[请看2#楼]

建议一个可以容纳多个贞的循环缓冲区.来接收数据试一下.
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2017-7-23 09:36:26 | 显示全部楼层
建议一个可以容纳多个贞的循环缓冲区.来接收数据试一下.
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-7-23 10:07:03 | 显示全部楼层
其他代码也贴一下吧,都不知道其他部分的作用
回复

使用道具 举报

1

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2017-5-10
在线时间
55 小时
发表于 2017-7-23 10:10:17 | 显示全部楼层
虽然没有代码,但是接受和发送共用缓冲区会不会因为速度太慢导致缓冲区被重复写入?以及每次接受完一帧有没有清除所有状态迎接第二帧?
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2017-7-24 09:18:13 | 显示全部楼层
环形缓冲区,我上个帖子写了个简易的缓冲区
但是没人看   
尴尬
回复

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-7-18
在线时间
9 小时
 楼主| 发表于 2017-7-26 10:04:10 | 显示全部楼层
cromarti 发表于 2017-7-23 10:07
其他代码也贴一下吧,都不知道其他部分的作用

谢谢,搞定了,把接收到的数据放到中断外面处理就可以了
回复

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-7-18
在线时间
9 小时
 楼主| 发表于 2017-7-26 10:06:17 | 显示全部楼层
cromarti 发表于 2017-7-23 10:10
虽然没有代码,但是接受和发送共用缓冲区会不会因为速度太慢导致缓冲区被重复写入?以及每次接受完一帧有没 ...

谢谢,就是接收到的数据较快,处理速度较慢,导致丢包的现象,建立一个多帧缓冲区,在中断外处理就OK了
回复

使用道具 举报

5

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-7-18
在线时间
9 小时
 楼主| 发表于 2017-7-26 10:10:03 | 显示全部楼层
由于在中断处理函数中加入了CRC检查,导致丢包的现象。只需将结束到的数据放到一个环形缓冲区里,在中断外进行处理就可以了
回复

使用道具 举报

5

主题

266

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1526
金钱
1526
注册时间
2016-7-20
在线时间
155 小时
发表于 2017-7-27 11:16:08 | 显示全部楼层
我做过一次,pingpang切换操作,两个缓存区,第一个缓存区存的时候,pingpang为0,第一个存满了把pingpang取反,换另外一个缓存区,就这样来回切换
我是可以什么都不说 ,但不可以什么都不做。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-18 12:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表