3235|8

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MSP 430f5438A 接收数据包的问题 [复制链接]

1芯积分
本人初学430.接收数据包,老是接收到最后一个,前面的被覆盖掉了吗???收到的数据用串口助手显示是EF 01 FF FF FF FF 07 00 03 00 00 0A,但是从缓存器里取出来的只有一位0A,难道是我程序错了,还是缓存器里的值不能用循环来取,在线急等
do /////////////////////////////do的内容////////////////////////////////

最新回复

中断只接收字符,缓存到数组中。在主函数while中处理接收的字符,可以if直接嵌套判断,判断完后,不对直接丢掉,缓存数组清零,不然数据会出现错误,正确就一步步往下走,最后清除缓存数组,相关参数恢复原始值  详情 回复 发表于 2016-9-26 23:48
 
点赞 关注

回复
举报

4

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
是串口异步通讯
 
 

回复

4177

帖子

9

TA的资源

五彩晶圆(高级)

板凳
 
你可以这样,把接收的数据存在一个buff数组中,debug模式下,单步调结合你的程序看看具体其他数据在执行什么语句之后不见了。
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

4
 
贴程序出来,不然没法知道你什么问题
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

5
 
lcccx12 发表于 2016-9-15 23:54
贴程序出来,不然没法知道你什么问题

                do /////////////////////////////do的内容////////////////////////////////
                 {       
                          restart0:                               
                         if (UCA0IFG==1)//如果接收到数据
                              {                                
                           tmpdat=UCA0RXBUF;//先把接收到的数据放到tmpdat中
                               UCA0IFG=0;
                               if ((tmpdat==0xef)&&(start==FALSE))//这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节
                                    {
                                          count=0;
                                          FIFO[0]=tmpdat;//读入第一个应答字节(0XEF),存在第“0”个元素中   
                                          flag=1;       
                                             goto
                                                restart0;//可以用中断方式进行                       
                                          
                                      }
                          if(flag==1)//第一个字节已经回来,所以flag==1成立
                                 {  
                                          if(tmpdat!=0x01)  //接收数据错误,将重新从缓冲区接收数据
                                          {         
                                              flag=0;//接收应答失败
                                              result=FALSE;
                                              start =FALSE;
                                              stop=FALSE;
                                              count=0;
                                                  goto
                                                      restart0;                                       
                                           }
                                              //如果成功接收到0xef01,可以开始接收数据
                                              flag=2;//flag=2;表示应答成功,可以开始接收数据了
                                              count++;//现在count=1;
                                              FIFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第“1”个元素中   
                                              start=TURE;        //应答成功可以开始接收数据
                                                  goto
                                                      restart0;       
                                 }                  
                             if((flag==2)&&(start==TURE))//flag=2;表示应答成功,可以开始接收数据了
                                     {                                                              
                                           count++; //数据元素下标++
                                           FIFO[count]=tmpdat;//存入数据
                                                if(count>=6)
                                                  {
                                                      checksum=FIFO[count]+checksum; //计算校验和
                                                   }
                                                if(count==8)
                                                  {
                                                      package=FIFO[7]*0X100+FIFO[8];        //计算包长度                                                       
                                                      stop= TURE;
                                                   }
                                                if(stop)
                                                    {                                               
                                                      if(count==package+8)
                                                         {
                                                            checksum=checksum-FIFO[count-1];
                                                            if(checksum!=FIFO[count]&0xff)
                                                                    result=FALSE; //校验失败,置结果标志为0                                                       
                                                            else
                                                                    result=TURE;
                                                            flag=0;
                                                            break;
                                                         }
                                                    }
                                     }
                                }
          }/////////////////////////////do的内容----------------结束////////////////////////////////          
        while ((clk0<=MaxTime)&&(count<=MAX_NUMBER)&&(changeflag==0)); //由定时器以及最大接收数据来控制,保证不会在此一直循环                  
        FifoNumber=count;        //保存接收到的数据个数
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

6
 
huaiqiao 发表于 2016-9-13 23:31
你可以这样,把接收的数据存在一个buff数组中,debug模式下,单步调结合你的程序看看具体其他数据在执行什 ...

                do /////////////////////////////do的内容////////////////////////////////
                 {       
                          restart0:                               
                         if (UCA0IFG==1)//如果接收到数据
                              {                                
                           tmpdat=UCA0RXBUF;//先把接收到的数据放到tmpdat中
                               UCA0IFG=0;
                               if ((tmpdat==0xef)&&(start==FALSE))//这个数据为第一个传回来的数据,也就是“指令应答”的第一个字节
                                    {
                                          count=0;
                                          FIFO[0]=tmpdat;//读入第一个应答字节(0XEF),存在第“0”个元素中   
                                          flag=1;       
                                             goto
                                                restart0;//可以用中断方式进行                       
                                          
                                      }
                          if(flag==1)//第一个字节已经回来,所以flag==1成立
                                 {  
                                          if(tmpdat!=0x01)  //接收数据错误,将重新从缓冲区接收数据
                                          {         
                                              flag=0;//接收应答失败
                                              result=FALSE;
                                              start =FALSE;
                                              stop=FALSE;
                                              count=0;
                                                  goto
                                                      restart0;                                       
                                           }
                                              //如果成功接收到0xef01,可以开始接收数据
                                              flag=2;//flag=2;表示应答成功,可以开始接收数据了
                                              count++;//现在count=1;
                                              FIFO[count]=tmpdat;//读入第二个应答字节(0X01),存在第“1”个元素中   
                                              start=TURE;        //应答成功可以开始接收数据
                                                  goto
                                                      restart0;       
                                 }                  
                             if((flag==2)&&(start==TURE))//flag=2;表示应答成功,可以开始接收数据了
                                     {                                                              
                                           count++; //数据元素下标++
                                           FIFO[count]=tmpdat;//存入数据
                                                if(count>=6)
                                                  {
                                                      checksum=FIFO[count]+checksum; //计算校验和
                                                   }
                                                if(count==8)
                                                  {
                                                      package=FIFO[7]*0X100+FIFO[8];        //计算包长度                                                       
                                                      stop= TURE;
                                                   }
                                                if(stop)
                                                    {                                               
                                                      if(count==package+8)
                                                         {
                                                            checksum=checksum-FIFO[count-1];
                                                            if(checksum!=FIFO[count]&0xff)
                                                                    result=FALSE; //校验失败,置结果标志为0                                                       
                                                            else
                                                                    result=TURE;
                                                            flag=0;
                                                            break;
                                                         }
                                                    }
                                     }
                                }
          }/////////////////////////////do的内容----------------结束////////////////////////////////          
        while ((clk0<=MaxTime)&&(count<=MAX_NUMBER)&&(changeflag==0)); //由定时器以及最大接收数据来控制,保证不会在此一直循环                  
        FifoNumber=count;        //保存接收到的数据个数
 
 
 

回复

25

帖子

0

TA的资源

一粒金砂(中级)

7
 
程序是官方列程吗?其实可以直接采用,串口中断去读取数据,可以边读取,边校验;或者全部读取完成之后再进行校验,最好自己定一个通信协议,便于通信!
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

8
 
MLL123 发表于 2016-9-25 20:38
do /////////////////////////////do的内容////////////////////////////////
                 {       
         ...

我给你说一下思路吧。中断中只用数组缓存接收到数据;然后调到主函数中判断,主函数中判断时:一定要在while大循环中判断,不然容易出现你这种情况。然后开始进行你自己的判断,直接判断包头、包尾等即可
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

9
 
MLL123 发表于 2016-9-25 20:38
do /////////////////////////////do的内容////////////////////////////////
                 {       
         ...

中断只接收字符,缓存到数组中。在主函数while中处理接收的字符,可以if直接嵌套判断,判断完后,不对直接丢掉,缓存数组清零,不然数据会出现错误,正确就一步步往下走,最后清除缓存数组,相关参数恢复原始值
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表