【新手提问】用51串口接收陀螺仪数据包数据不完整

-xiao明 2016-03-22 07:25:00
我用的是STC15l2k60s2,最近在网上买了个mpu6050模块,它是通过串口分别发送加速度,角速度,角度三个数据包,包头都为0x55,第二个数据为标识分别是0x51,0x52,0x53,但是串口接收到的总是不完整的数据,想问问问题是出在哪?谢谢……
数据包示例如下

代码如下

接收到的数据是这样的,大部分都是0x52(角速度数据包接收不完整)
...全文
362 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
OliverkingLi 2016-06-07
  • 打赏
  • 举报
回复
我有个现成的串口程序,可以在串口助手上查看静止输出6轴数据的,你要吗
woaiwodejia999 2016-04-11
  • 打赏
  • 举报
回复
建议做个循环 void IntSerial1() interrupt 4 { uchar Point = 0; for(;;){ while( !RI ); RI = 0; cSerial1Buffer[ Point ] = SBUF; if( cSerial1Buffer[0] != 0x55 ) return; Point++; if( Point == 11 ){ Point = 0; return; } }
dceacho 2016-03-29
  • 打赏
  • 举报
回复

void SendString(uchar *s)
{
    while (*s)                  //¼ì²â×Ö·û´®½áÊø±êÖ¾
    {
        SendData(*s++);         //·¢Ë͵±Ç°×Ö·û
    }
}
数据有可能含有0
dceacho 2016-03-29
  • 打赏
  • 举报
回复
校验那是 == if(f->sum==(f 其他不知道是啥原因了
-xiao明 2016-03-29
  • 打赏
  • 举报
回复
引用 7 楼 wangfan027 的回复:
使用Ring buffer主程序里检查新数据的个数,超过一帧的话就开始检查起始字节和校验
uchar rxbuf[32];//如果资源够的话可以还弄大点
unsigned long received=0;
unsigned long checked=0;

typedef struct
{
uchar head;
.....
}FRAM;

uchar chkfram(FRAM * f)
{
if(f->sum==(f->head+......)return 1;
return 0;
}

void uart() interrupt 4
{
if(RI)
{
RI=0;
rxbuf[received%sizeof(rxbuf)]=SBUF;
received++;
}
}

void main()
{
FRAM fram;//一帧数据
uchar * u8;
uchar I,j;
......
while(1)
{
if(received-checked> sizeof(fram) )
{
//检查是否有效,
for(i=checked;i<received-sizeof(fram);i++)
{
if(rxbuf[I%sizeof(rxbuf)]==0x55)
{
u8=(uchar*)&fram;//复制到fram里以检查是否有效
for(j=0;j<sizeof(fram);j++)
{
*u8=rxbuf[(i+j)%sizeof(rxbuf)];
u8++;
}
if(chkfram(&fram)==1)
{
//有效
checked=I +sizeof(fram);
}
}
}
}
}
}


你好,非常感谢你贴出代码,这几天我尝试用你这代码,但是还是失败了,修改了好多次也找不到原因
#include "reg51.h"

typedef unsigned char uchar;

#define FOSC 11059200L //ϵͳƵÂÊ
#define BAUD 9600 //´®¿Ú²¨ÌØÂÊ

sfr AUXR = 0x8e; //¸¨Öú¼Ä´æÆ÷
sfr P_SW1 = 0xA2; //ÍâÉ蹦ÄÜÇл»¼Ä´æÆ÷1

uchar rxbuf[33]; //Ó¦¸ÃÊÇ33°É£332µÄ»°²¿·Ö¿´ËÆÍêÕûµÄÒ»Ö¡Êý¾ÝÓÐ12λÊý
unsigned long received=0;
unsigned long checked=0;

typedef struct
{
uchar head;
uchar reg;
uchar XL;
uchar XH;
uchar YL;
uchar YH;
uchar ZL;
uchar ZH;
uchar TL;
uchar TH;
uchar sum;
}FRAM;


void SendData(uchar dat);
void SendString(uchar *s);
void uart_init();
uchar chkreceive(FRAM *f);

void main()
{
FRAM fram;
uchar *u8;
uchar i,j;
uart_init();
SendString("´®¿ÚÉèÖÃÍê±Ï");
while(1)
{
if(received-checked > sizeof(fram)) //½ÓÊÕÍêÒ»Ö¡Êý¾Ý
{
for(i=checked;i<(received-sizeof(fram));i++)
{
if(rxbuf[i%sizeof(rxbuf)]==0x55)
{
u8=(uchar*)&fram;
for(j=0;j<sizeof(fram);j++)
{
*u8=rxbuf[(i+j)%sizeof(rxbuf)];
u8++;
}
if(chkreceive(&fram)==1)
{
checked=i + sizeof(fram);
SendString(&fram);
}
}
}
}
}
}

/*----------------------------
UART ÖжϷþÎñ³ÌÐò
-----------------------------*/
void Uart() interrupt 4
{
if (RI)
{
RI = 0; //Çå³ýRIλ
rxbuf[received%sizeof(rxbuf)] = SBUF;
received++;
}
}
/*----------------------------
·¢ËÍ´®¿ÚÊý¾Ý
----------------------------*/
void SendData(uchar dat)
{
SBUF = dat;
while (!TI);
TI=0;
}
/*----------------------------
·¢ËÍ×Ö·û´®
----------------------------*/
void SendString(uchar *s)
{
while (*s) //¼ì²â×Ö·û´®½áÊø±êÖ¾
{
SendData(*s++); //·¢Ë͵±Ç°×Ö·û
}
}

/*------------------------------
´®¿Ú³õʼ»¯
-------------------------------*/
void uart_init()
{
P_SW1 = 0x00; //(P3.0/RxD, P3.1/TxD)
SCON = 0x50; //8λ¿É±ä²¨ÌØÂÊ
AUXR = 0x40; //¶¨Ê±Æ÷1Ϊ1Tģʽ
TMOD = 0x20; //¶¨Ê±Æ÷1Ϊģʽ2(8λ×Ô¶¯ÖØÔØ)
TL1 = (256 - (FOSC/32/BAUD)); //ÉèÖò¨ÌØÂÊÖØ×°Öµ
TH1 = (256 - (FOSC/32/BAUD));
TR1 = 1; //¶¨Ê±Æ÷1¿ªÊ¼¹¤×÷
ES = 1; //ʹÄÜ´®¿ÚÖжÏ
EA = 1;
}

uchar chkreceive(FRAM *f)
{
if(f->sum=(f->head + f->reg + f->XL + f->XL + f->YL + f->YH + f->ZL + f->ZH + f->TL + f->TH))
return 1;
else
return 0;
}


然后串口收到的数据是这样的,而且每一帧数据前10个数相加都不等于最后一个校验和的数?

dceacho 2016-03-24
  • 打赏
  • 举报
回复
使用Ring buffer主程序里检查新数据的个数,超过一帧的话就开始检查起始字节和校验 uchar rxbuf[32];//如果资源够的话可以还弄大点
unsigned long received=0;
unsigned long checked=0;

typedef struct
{
  uchar head;
  .....
}FRAM;

uchar chkfram(FRAM * f)
{
  if(f->sum==(f->head+......)return 1;
  return 0;
}

void uart() interrupt 4
{
  if(RI)
  {
    RI=0;
    rxbuf[received%sizeof(rxbuf)]=SBUF;
    received++;
  }
}

void main()
{
  FRAM fram;//一帧数据
 uchar * u8;
 uchar I,j;
  ......
  while(1)
  {
    if(received-checked> sizeof(fram) )
    {
      //检查是否有效,
        for(i=checked;i<received-sizeof(fram);i++)
        {
          if(rxbuf[I%sizeof(rxbuf)]==0x55)
          {
            u8=(uchar*)&fram;//复制到fram里以检查是否有效
            for(j=0;j<sizeof(fram);j++)
            {
               *u8=rxbuf[(i+j)%sizeof(rxbuf)];
                u8++;
            }
            if(chkfram(&fram)==1)
            {
                //有效
               checked=I +sizeof(fram);
            }
          }
        }
    }
  }
}
图灵转世 2016-03-24
  • 打赏
  • 举报
回复
楼上给的代码是正解。
-xiao明 2016-03-24
  • 打赏
  • 举报
回复
引用 5 楼 dceacho的回复:
[quote=引用 4 楼 qq_27703353 的回复:] [quote=引用 3 楼 wangfan027 的回复:] 你发的这些数据是你仿真时截取的数据还是你程序里的SendString(receive)里的输出? 如果是你程序里的输出,有问题是正常的,因为你在SendSting(receive)过程中receive并不是独占的,它在接收中断里会被修改
你好。其实我也想过这个问题,所以尝试在SendSting(receive);的前后写REN=0;和REN=1;(不知道这种做法对不对),然而接收到的都是完整的0x51和0x53的数据包,唯独缺少0x52的数据包。而且还有个问题是通过 允许/禁止 串口接收的话也会丢失一部分数据吧? 这样的话我应该怎样才能正常接收到完整的数据呢?[/quote] 不对,在REN=0;REN=1;之间你数据会错位的,而你程序里没考虑错位情况 如果要可靠的话你这要改很多地方[/quote] 请问版主大大能否指点下改的大致思路或者要改的地方?谢谢
xiao哦草 2016-03-23
  • 打赏
  • 举报
回复
会不会是buff溢出了?
dceacho 2016-03-23
  • 打赏
  • 举报
回复
引用 4 楼 qq_27703353 的回复:
[quote=引用 3 楼 wangfan027 的回复:] 你发的这些数据是你仿真时截取的数据还是你程序里的SendString(receive)里的输出? 如果是你程序里的输出,有问题是正常的,因为你在SendSting(receive)过程中receive并不是独占的,它在接收中断里会被修改
你好。其实我也想过这个问题,所以尝试在SendSting(receive);的前后写REN=0;和REN=1;(不知道这种做法对不对),然而接收到的都是完整的0x51和0x53的数据包,唯独缺少0x52的数据包。而且还有个问题是通过 允许/禁止 串口接收的话也会丢失一部分数据吧? 这样的话我应该怎样才能正常接收到完整的数据呢?[/quote] 不对,在REN=0;REN=1;之间你数据会错位的,而你程序里没考虑错位情况 如果要可靠的话你这要改很多地方
-xiao明 2016-03-23
  • 打赏
  • 举报
回复
引用 3 楼 wangfan027 的回复:
你发的这些数据是你仿真时截取的数据还是你程序里的SendString(receive)里的输出? 如果是你程序里的输出,有问题是正常的,因为你在SendSting(receive)过程中receive并不是独占的,它在接收中断里会被修改
你好。其实我也想过这个问题,所以尝试在SendSting(receive);的前后写REN=0;和REN=1;(不知道这种做法对不对),然而接收到的都是完整的0x51和0x53的数据包,唯独缺少0x52的数据包。而且还有个问题是通过 允许/禁止 串口接收的话也会丢失一部分数据吧? 这样的话我应该怎样才能正常接收到完整的数据呢?
dceacho 2016-03-23
  • 打赏
  • 举报
回复
你发的这些数据是你仿真时截取的数据还是你程序里的SendString(receive)里的输出? 如果是你程序里的输出,有问题是正常的,因为你在SendSting(receive)过程中receive并不是独占的,它在接收中断里会被修改
-xiao明 2016-03-23
  • 打赏
  • 举报
回复
引用 1 楼 ouchao0727 的回复:
会不会是buff溢出了?
额,想问下具体什么意思,本人菜鸟,百度上搜索无果……

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧