打印

串口接收数据,神奇的错误???

[复制链接]
1554|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cnyg|  楼主 | 2013-5-16 18:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 cnyg 于 2013-5-17 11:08 编辑

        

程序出错源码:
问题用PC发送N段数据(中间延时不定),第一次接收正确,以后每次只能接收到0xFD其余为0X00,
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {                          
                temp = USART_ReceiveData(USART2);
                Usart2_Receive_Counter++;
           if( Usart2_Receive_mode == FLAG_DATA )
                           {                                                         
                                if ( Usart2_Work_mode == STAT_IDLE )
                                {
                                        if (temp == 0xfd)
                                        {
                                                Usart2_numlength = 0;        
                                                Usart2_RX_DATA[Usart2_Amount][Usart2_numlength++] = temp;
                                                Usart2_Work_mode = STAT_RECEIVE;                 //正确接收到返回的起始字 0xFD
                                        }
                                } else if (Usart2_Work_mode == STAT_RECEIVE)                        
                            {
                                        if( Usart2_numlength == DATA_SIZE )
                                        {
                                                memset(&Usart2_RX_DATA[Usart2_Amount],0,DATA_SIZE);                        
                                                Usart2_Work_mode = STAT_IDLE;
                                        }else
                                        {
                                                Usart2_RX_DATA[Usart2_Amount][Usart2_numlength++] = temp;                                 
                                                if (Usart2_numlength == Usart2_RX_DATA[Usart2_Amount][1] + 7)  
                                                {                                                                                                                                                         
                                                                Usart2_Work_mode = STAT_IDLE;
                                                                Usart2_Receive_OK = STAT_OK;                                                               
                                                                Usart2_RX_DATA[Usart2_Amount][39]=STAT_OK;
                                                                Usart2_Amount++;
                                                                if(Usart2_Amount == DATA_AMOUNT)
                                                                   Usart2_Amount=0;
                                                }
                                        }               
                                }
                        }else Usart2_RX_CMD[Usart2_numlength++] = temp;


但是如果代码改为这个接收就正常了????????
难道程序能够影响串口接收?????????
        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
        {                          
                temp = USART_ReceiveData(USART2);
                Usart2_Receive_Counter++;
                Usart2_RX_CMD[Usart2_numlength++] = temp;
//           if( Usart2_Receive_mode == FLAG_DATA )
//                           {                                                         
//                                if ( Usart2_Work_mode == STAT_IDLE )
//                                {
//                                        if (temp == 0xfd)
//                                        {
//                                                Usart2_numlength = 0;
//                                                //memset(Usart1_RX_DATA[Usart1_Amount][],0,40);        
//                                                Usart2_RX_DATA[Usart2_Amount][Usart2_numlength++] = temp;
//                                                Usart2_Work_mode = STAT_RECEIVE;                 //正确接收到返回的起始字 0xFD
//                                        }
//                                } else if (Usart2_Work_mode == STAT_RECEIVE)                        
//                            {
//                                        if( Usart2_numlength == DATA_SIZE )
//                                        {
//                                                memset(&Usart2_RX_DATA[Usart2_Amount],0,DATA_SIZE);                        
//                                                Usart2_Work_mode = STAT_IDLE;
//                                        }else
//                                        {
//                                                Usart2_RX_DATA[Usart2_Amount][Usart2_numlength++] = temp;                                 
//                                                if (Usart2_numlength == Usart2_RX_DATA[Usart2_Amount][1] + 7)  
//                                                {                                                                                                                                                         
//                                                                Usart2_Work_mode = STAT_IDLE;
//                                                                Usart2_Receive_OK = STAT_OK;                                                               
//                                                                Usart2_RX_DATA[Usart2_Amount][39]=STAT_OK;
//                                                                Usart2_Amount++;
//                                                                if(Usart2_Amount == DATA_AMOUNT)
//                                                                   Usart2_Amount=0;
//                                                }
//                                        }               
//                                }
//                        }else Usart2_RX_CMD[Usart2_numlength++] = temp;















沙发
grasswolfs| | 2013-5-16 19:06 | 只看该作者
程序是肯定不会影响的,再看一下代码逻辑吧,另外注意一下有没有全局变量在其他地方被更改的

使用特权

评论回复
板凳
cnyg|  楼主 | 2013-5-16 19:57 | 只看该作者
grasswolfs 发表于 2013-5-16 19:06
程序是肯定不会影响的,再看一下代码逻辑吧,另外注意一下有没有全局变量在其他地方被更改的 ...

嗯 !主函数while(1);没有其他中断我都屏了;
关键是temp这个数据temp = USART_ReceiveData(USART2);只有这个地方有写,其他地方都读;是这个数据读出来不正确.

使用特权

评论回复
地板
cnyg|  楼主 | 2013-5-16 19:58 | 只看该作者
cnyg 发表于 2013-5-16 19:57
嗯 !主函数while(1);没有其他中断我都屏了;
关键是temp这个数据temp = USART_ReceiveData(USART2); ...

补充一下  是它USART_ReceiveData(USART2);不对!!!

使用特权

评论回复
5
grasswolfs| | 2013-5-16 22:18 | 只看该作者
cnyg 发表于 2013-5-16 19:57
嗯 !主函数while(1);没有其他中断我都屏了;
关键是temp这个数据temp = USART_ReceiveData(USART2); ...

你这个读是指读temp么?调试方式是怎么样的?在线调试还是直接刷固件看结果?

使用特权

评论回复
6
grasswolfs| | 2013-5-16 22:19 | 只看该作者
cnyg 发表于 2013-5-16 19:58
补充一下  是它USART_ReceiveData(USART2);不对!!!

串口硬件问题应该不大,把注释部分的代码一部分取消注释,看看问题出在哪里吧

使用特权

评论回复
7
huangxz| | 2013-5-16 22:29 | 只看该作者
确实有点神奇,呵呵

使用特权

评论回复
8
jeckboy| | 2013-5-25 00:11 | 只看该作者
根据这段程序判断你用的应该是查询接收方式,这样你要注意查询处理频率,你的处理时间超过接收2字节时间就会导致字节丢失!最好用中断接收方式,只管收,收到先放到缓冲区里,收完一个帧再处理。一般靠字符间超时判断帧结束!

使用特权

评论回复
9
wforest68| | 2013-5-26 15:21 | 只看该作者
我以前遇到过一次这样的问题,好象是过冲了(记不太清怎么处理的了)

使用特权

评论回复
10
liuzhongkai123| | 2013-5-26 23:06 | 只看该作者
串口2复用开没 头几天遇到类似问题 不是我的工作所以没有细究,最后开了复用 还有一处逻辑错误

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:用代码,玩下流。

2

主题

60

帖子

1

粉丝