27,382
社区成员
发帖
与我相关
我的任务
分享
void SendString(uchar *s)
{
while (*s) //¼ì²â×Ö·û´®½áÊø±êÖ¾
{
SendData(*s++); //·¢Ë͵±Ç°×Ö·û
}
}
数据有可能含有0
#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;
}
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);
}
}
}
}
}
}