[STM32F1] 串口灵异事件。。。

[复制链接]
 楼主| 大沙发的 发表于 2014-10-17 17:37 | 显示全部楼层 |阅读模式
现在要解析串口数据
1、数据基本格式为:0XBB开头,0X7E结尾,第四位放的是他以后0X7E之前的数据长度
2、我的程序如下
3、大家先看一下这种处理方式有没有什么问题?
 楼主| 大沙发的 发表于 2014-10-17 17:37 | 显示全部楼层
void USART1_IRQHandler(void)
{
        static u8 Receive=0;
        static u8 IsMyCmd;
        static u8 num ;

   if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)
   {
             USART_ClearITPendingBit(USART1,USART_IT_RXNE);
          Receive= USART_ReceiveData(USART1);

//BB 02 22 00 10 34 00 E2 00 10 62 58 0C 00 65 11 80 9D E2 1D BB 7E  

         if(!IsMyCmd)
         {
                 if(Receive==0xbb)
                {
                        IsMyCmd=1;
                        num=0;
                        RxBuffer[0]=0xbb;
                }
         }
         else
         {
                 num++;
                RxBuffer[num]= Receive;

                if(num>4)
                {
                        if (num==(RxBuffer[4]+5))
                        {       
                                IsMyCmd=0;
                               

                                if(Receive==0x7e)
                                {
                                        RxFinishFlag=1;
                                        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);
                                }
                        }

                }
         }
   }}
 楼主| 大沙发的 发表于 2014-10-17 17:38 | 显示全部楼层
出现的问题,不好描述,但是我想先排除一下串口处理函数是不是有问题?注释的那条话是示例信息。
 楼主| 大沙发的 发表于 2014-10-17 17:41 | 显示全部楼层
void USART1_IRQHandler(void)
{
        static u8 Receive=0;
        static u8 IsMyCmd;
        static u8 num ;

   if(USART_GetITStatus(USART1, USART_IT_RXNE)!= RESET)
   {
             USART_ClearITPendingBit(USART1,USART_IT_RXNE);
          Receive= USART_ReceiveData(USART1);

//BB 02 22 00 10 34 00 E2 00 10 62 58 0C 00 65 11 80 9D E2 1D BB 7E  

         if(!IsMyCmd)
         {
                 if(Receive==0xbb)                         //判断开头是不是0XBB
                {
                        IsMyCmd=1;
                        num=0;
                        RxBuffer[0]=0xbb;
                }
         }
         else
         {
                 num++;
                RxBuffer[num]= Receive;                           //接收到的值保存起来

                if(num>4)
                {
                        if (num==(RxBuffer[4]+5))                   //根据位数判断有没有到结尾
                        {       
                                IsMyCmd=0;
                               

                                if(Receive==0x7e)                         //判断结尾是不是0X7E
                                {
                                        RxFinishFlag=1;
                                        USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);                  //关闭串口接收中断
                                }
                        }

                }
         }
   }}
 楼主| 大沙发的 发表于 2014-10-17 17:42 | 显示全部楼层
纠结了我好长时间,谢谢大家了
mmuuss586 发表于 2014-10-17 19:37 | 显示全部楼层

串口中断程序本身没啥问题啊;
你的数据都是啥数据啊?不是ASC码的话,可能会出差;
还要加超时判断;
bhsdlmj 发表于 2014-10-17 23:08 | 显示全部楼层
重写

把中断程序里面搞成与应用无关的。

判断在while(1)里面进行。
搞IT的 发表于 2014-10-19 10:36 | 显示全部楼层
tianli1980 发表于 2014-10-20 09:56 | 显示全部楼层
通讯协议对每个字节的意义都是有严格规定的啊 ,我也是来学习的
bobo5650 发表于 2014-10-20 11:44 | 显示全部楼层
不知道哪里灵异,怎么个灵异法?
 楼主| 大沙发的 发表于 2014-10-20 17:27 | 显示全部楼层
问题解决了,我关掉串口中断以后,在另一个地方开中断(同一个串口发送完消息以后),需要在串口发送完信息以后延时一下再开中断才可以。
具体为什么要这样,不是很理解,去啃啃书本吧,谢谢大家。
snailled 发表于 2014-10-20 19:56 | 显示全部楼层
大沙发的 发表于 2014-10-20 17:27
问题解决了,我关掉串口中断以后,在另一个地方开中断(同一个串口发送完消息以后),需要在串口发送完信息 ...

那肯定啊 ,你是查询发送数据,肯定要发送完等几个nop  然后再开中断,这样子比较保险,我平时也这样子做的,查询发送完毕数据 等10个以上的Nop  呵呵,我也是新手。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

196

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部