打印
[STM32F1]

串口灵异事件。。。

[复制链接]
1259|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大沙发的|  楼主 | 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);                  //关闭串口接收中断
                                }
                        }

                }
         }
   }}

使用特权

评论回复
5
大沙发的|  楼主 | 2014-10-17 17:42 | 只看该作者
纠结了我好长时间,谢谢大家了

使用特权

评论回复
6
mmuuss586| | 2014-10-17 19:37 | 只看该作者

串口中断程序本身没啥问题啊;
你的数据都是啥数据啊?不是ASC码的话,可能会出差;
还要加超时判断;

使用特权

评论回复
7
bhsdlmj| | 2014-10-17 23:08 | 只看该作者
重写

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

判断在while(1)里面进行。

使用特权

评论回复
8
搞IT的| | 2014-10-19 10:36 | 只看该作者

使用特权

评论回复
9
tianli1980| | 2014-10-20 09:56 | 只看该作者
通讯协议对每个字节的意义都是有严格规定的啊 ,我也是来学习的

使用特权

评论回复
10
bobo5650| | 2014-10-20 11:44 | 只看该作者
不知道哪里灵异,怎么个灵异法?

使用特权

评论回复
11
大沙发的|  楼主 | 2014-10-20 17:27 | 只看该作者
问题解决了,我关掉串口中断以后,在另一个地方开中断(同一个串口发送完消息以后),需要在串口发送完信息以后延时一下再开中断才可以。
具体为什么要这样,不是很理解,去啃啃书本吧,谢谢大家。

使用特权

评论回复
12
snailled| | 2014-10-20 19:56 | 只看该作者
大沙发的 发表于 2014-10-20 17:27
问题解决了,我关掉串口中断以后,在另一个地方开中断(同一个串口发送完消息以后),需要在串口发送完信息 ...

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

使用特权

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

本版积分规则

11

主题

196

帖子

1

粉丝