OpenEdv-开源电子网

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

怎么感觉倒数第二行在数据传到最后一位时,也就是0x0d之前的那位,还让USART_RX_STA加一呢?有哪位大神可以帮我解决一下吗?...

[复制链接]

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-11-7
在线时间
39 小时
发表于 2016-11-8 10:32:33 | 显示全部楼层 |阅读模式
1金钱
void USART1_IRQHandler(void)                        //串口1中断服务程序
        {
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
                {
                Res =USART_ReceiveData(USART1);        //读取接收到的数据
               
                if((USART_RX_STA&0x8000)==0)//接收未完成
                        {
                        if(USART_RX_STA&0x4000)//接收到了0x0d
                                {
                                if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x8000;        //接收完成了
                                }
                        else //还没收到0X0D
                                {       
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                        {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收          
                                        }                 
                                }
                        }                    
     }              

最佳答案

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

u8 USART_RX_STA=0; //接收状态标记 第七位,我定义他是用来标记是否接收完成的标记,如果接收完成了就置1,如果没有,就是0. 第六位,我定义它用来标识是否接收到0X0D,如果收到,就置1,否则为0. 第5~0位,用来统计接收到的字符数,最大可以支持到64个字符. 这个是自己定义的.不是stm32自带的. USART_RX_STA的作用就是在全部函数之间实现一个消息传递. 看看这个 http://www.openedv.com/posts/list/2936.htm
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2016-10-19
在线时间
36 小时
发表于 2016-11-8 10:32:34 | 显示全部楼层
heqicheng 发表于 2016-11-8 16:54
能说的在详细点吗,本人比较笨,希望您不吝赐教啊,我刚刚的观点错在哪里了呢?

u8 USART_RX_STA=0;       //接收状态标记       
第七位,我定义他是用来标记是否接收完成的标记,如果接收完成了就置1,如果没有,就是0.
第六位,我定义它用来标识是否接收到0X0D,如果收到,就置1,否则为0.
第5~0位,用来统计接收到的字符数,最大可以支持到64个字符.
这个是自己定义的.不是stm32自带的.
USART_RX_STA的作用就是在全部函数之间实现一个消息传递.

看看这个
http://www.openedv.com/posts/list/2936.htm
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-11-8 10:55:24 | 显示全部楼层
为什么不呢
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-11-7
在线时间
39 小时
 楼主| 发表于 2016-11-8 15:27:54 | 显示全部楼层

因为USART_RX_STA再加1会在代码最后一行大于USART_REC_LEN-1,这样再传最后一位时,始终都会让USART_RX_STA=0;这样不就传不进代码了吗??
回复

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2016-11-8 16:17:18 | 显示全部楼层
heqicheng 发表于 2016-11-8 15:27
因为USART_RX_STA再加1会在代码最后一行大于USART_REC_LEN-1,这样再传最后一位时,始终都会让USART_RX_S ...

再多看几遍程序
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复

使用道具 举报

7

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2016-10-19
在线时间
36 小时
发表于 2016-11-8 16:27:54 | 显示全部楼层
这里把USART_RX_STA变量当着寄存器使用,
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-11-7
在线时间
39 小时
 楼主| 发表于 2016-11-8 16:54:03 | 显示全部楼层
dmfy 发表于 2016-11-8 16:27
这里把USART_RX_STA变量当着寄存器使用,

能说的在详细点吗,本人比较笨,希望您不吝赐教啊,我刚刚的观点错在哪里了呢?
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-8 17:27:47 | 显示全部楼层
本帖最后由 密耳 于 2016-11-8 17:29 编辑

我不理解为什么判断接收完不完成呢,串口本来就是异步通信,愿意的话就一直检测你有没有接收到数据不就完了?
//***************************′®¿ú1ÖD¶Ï·tÎñ3ìDò*******************************
void USART1_IRQHandler(void)                                                                        //′®¿ú1ÖD¶Ï·tÎñ3ìDò
{
        static u8 m=0,k=0,Res=0;                     
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)         //½óêÕμ½êy¾Y
        {                                          
                USART_ClearITPendingBit(USART1,USART_IT_RXNE);                                 //Çå3yÖD¶Ï±êÖ¾
               Res = USART_ReceiveData(USART1);
       }
}就往接收数组送数据不就得了,,然后再分析数组的数据。
shop60994719.taobao.com
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-8 17:33:23 | 显示全部楼层
实在不行,你用下我的这个  https://item.taobao.com/item.htm ... amp;id=537439006677
保证你用的爽........
shop60994719.taobao.com
回复

使用道具 举报

12

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2016-11-7
在线时间
39 小时
 楼主| 发表于 2016-11-8 21:03:13 | 显示全部楼层

不好意思,还没有怎么看懂,请给我指点一下吧!!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 22:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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