OpenEdv-开源电子网

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

串口IAP实验 串口接收出错

[复制链接]

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
发表于 2018-7-7 15:40:48 | 显示全部楼层 |阅读模式
3金钱
本帖最后由 午夜狼嚎 于 2018-7-7 15:42 编辑

单片机:STM32F103C8T6,在原子大哥例程上改的

问题:用串口调试助手将APP程序发送后,单片机只能重复接收到第一个字节,也就是在USART_RX_BUF数组里存的全是APP程序的第一个字节
当我把程序中的USART_RX_CNT=0;注释掉后,就没问题了。我能看懂这个程序,也觉得没问题,但就是出现了这样的现象,请问是我哪里设置有问题还是怎么回事?
程序如下:
void USART1_IRQHandler(void)
{
        u8 res;        
        res=USART_ReceiveData(USART1);
        if(USART_RX_CNT<USART_REC_LEN)
                {
                        USART_RX_BUF[USART_RX_CNT]=res;
                        USART_RX_CNT++;                                                                                                      
                }

}

u16 oldcount=0;                               
u16 applenth=0;
if(USART_RX_CNT)
                {
                        if(oldcount==USART_RX_CNT)
                        {
                                applenth=USART_RX_CNT;
                                oldcount=0;
                                USART_RX_CNT=0;
                                
                        }
                        else
                                oldcount=USART_RX_CNT;                        
                }

最佳答案

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

你每次去判断当前接收的量和前一次的量比较当然要加上一定的延时,或者说超时:即当前接收量等于前一次接收量且已经超时则认为接收完成
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2018-7-7 15:40:49 | 显示全部楼层
你每次去判断当前接收的量和前一次的量比较当然要加上一定的延时,或者说超时:即当前接收量等于前一次接收量且已经超时则认为接收完成
回复

使用道具 举报

6

主题

359

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1604
金钱
1604
注册时间
2017-12-18
在线时间
173 小时
发表于 2018-7-7 17:36:12 | 显示全部楼层
帮顶一下
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-7-8 01:45:05 | 显示全部楼层
我们代码不是按你这个方式写的吧。。。
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-7-9 09:42:50 | 显示全部楼层

谢谢!!
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-7-9 09:44:04 | 显示全部楼层
正点原子 发表于 2018-7-8 01:45
我们代码不是按你这个方式写的吧。。。

我反复核对过了,就是这样的啊。我只是把中断处理函数里的UcosII判断删掉了,这个不影响吧
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-7-10 02:04:50 | 显示全部楼层
午夜狼嚎 发表于 2018-7-9 09:44
我反复核对过了,就是这样的啊。我只是把中断处理函数里的UcosII判断删掉了,这个不影响吧

你改了例程代码!
试试别改代码先。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-7-10 09:15:12 | 显示全部楼层
正点原子 发表于 2018-7-10 02:04
你改了例程代码!
试试别改代码先。

我不注释USART_RX_CNT=0;然后在后面加上延时10ms;程序运行也是正常的,没问题。但这是什么原因呢?是不是和串口接收速度和晶振频率什么的有关系啊?
if(USART_RX_CNT)
                {
                        if(oldcount==USART_RX_CNT)
                        {
                                applenth=USART_RX_CNT;
                                oldcount=0;
                                USART_RX_CNT=0;
                               
                        }
                        else
                                oldcount=USART_RX_CNT;                       
                }
                delay_ms(10);
回复

使用道具 举报

17

主题

194

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2016-9-3
在线时间
158 小时
 楼主| 发表于 2018-7-10 22:20:26 | 显示全部楼层
哆啦A萌 发表于 2018-7-10 19:08
你每次去判断当前接收的量和前一次的量比较当然要加上一定的延时,或者说超时:即当前接收量等于前一次接收 ...

大概懂了,谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-16 05:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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