单片机一次接受7个数据,然后马上发送出去7个数据。
串口中断中做了侦头校验,数据超过7个就不接受了,
78 87 是单片机接受数据的侦头固定值,
55 AA 是单片机回复数据的侦头固定值,
现在的问题是我一次发给单片机7个
1,正常数据: 78 87 3 4 4 BD 5F。单片机回复55 AA 03 00 87 B6 B9 没有问题
2,数据前加上干扰数据12 33
发送:12 33 78 87 3 4 4 BD 5F。 单片机回复55 AA 03 00 88 B2 F9 没有问题
3,数据后加上几个干扰数据12 33
发送: 78 87 3 4 4 BD 5F 12 33。单片机回复BB 1B 02 64 66 E1 FF出现问题。
此时单片机回复的数据无规律,但是每次都相同。
甚至我把单片机回复的数据写成固定值,都不能正常的发送回来。
相关程序如下:
#define R_LEN 7
#define T_LEN 7
unsigned char Usart1_rbuff[R_LEN];
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器2时钟为Fosc,即1T
T2L = 0xE0; //设定定时初值
T2H = 0xFE; //设定定时初值
AUXR |= 0x10; //启动定时器2
ES = 1;
MAX485_EN = 0;
}
//receive data frames 0x78 0x87 id TH TL CRCH CRCL
//transmit data frames 0x55 0xaa id TH TL CRCH CRCL
void UART1_Int(void) interrupt 4
{
if (RI == 1)
{
RI = 0;
rdata = SBUF;
if(Usart1_r_finish==0)
{
if(rdata !=0x78 || RxCounter1 != 0) //
{
if(startdata!= 1) //??????????
{
RxCounter1 = 0;
return;
}
if(RxCounter1 == 1 && rdata !=0x87) //如果侦头2不是0x87返回
{
RxCounter1 = 0;
return;
}
if(RxCounter1 < R_LEN)
{
Usart1_rbuff[RxCounter1] =rdata;
RxCounter1++;
}
}
else
{
//侦头是0x78开始接受
Usart1_rbuff[0] = rdata;
RxCounter1 = 1;
startdata = 1;
}
}
}
}
void usart1_send_onebyte(unsigned char dat)
{
// ES=0; //??????????
SBUF = dat;
while(!TI);
TI=0;
// ES=1; //?????????
}
void usart1_send_string(unsigned char *str,unsigned int num)
{
MAX485_EN = 1;
while(num--)
{
usart1_send_onebyte(*str);
str++;
}
MAX485_EN = 0;
}
void com_pro(void) //这是处理接受到的数据后发送出一组数据
{
unsigned int crc;
unsigned char i=2;
unsigned char Usart1_tbuff[T_LEN]={0x55,0xaa};
if(Usart1_rbuff[0] == 0x78 && Usart1_rbuff[1] == 0x87 ) //判断侦头1,2
{
crc = crc_cal(Usart1_rbuff, R_LEN-2);
if( Usart1_rbuff[5] == (crc >> 8) && Usart1_rbuff[6] == (crc & 0x00ff) && sensor_id == Usart1_rbuff[2])
{ //CRC判断
//Usart1_tbuff[i++] = 0x55;
//Usart1_tbuff[i++] = 0xaa;
Usart1_tbuff[i++] = sensor_id;
if(sensor_err)
{
Usart1_tbuff[i++] = 0xff;
Usart1_tbuff[i++] = 0xff;
}
else
{
Usart1_tbuff[i++] = Cur_temp >>8;
Usart1_tbuff[i++] = Cur_temp;
}
crc = crc_cal(Usart1_tbuff, T_LEN-2);
Usart1_tbuff[i++] = (crc >> 8);
Usart1_tbuff[i++] = crc;
usart1_send_string(Usart1_tbuff,T_LEN); //T_LEN==7,回复7个数据,但是不正常时有时候只能回复6个。有时候回复7个
// usart1_send_string("12314",T_LEN); //此处测试发送固定值,都不能正常发送。但是接受到的干扰数组通过了CRC和侦头判断。要不然也执行不到这一步
//
}
}
for(i=0;i<R_LEN;i++)
{
Usart1_rbuff[i] = 0;
}
}
void main(void)
{
unsigned int time=0;
unsigned int time1=0;
unsigned char z_flag=0;
unsigned char f_flag=0;
ini_io();
Timer0Init();
UartInit();
WDT_CONTR = 0X36;
id_pro();
while(1)
{
WDT_CONTR = 0X36;
id_pro();
if(RxCounter1 >= R_LEN)//??????
{
Usart1_r_finish = 1;
startdata = 0;
RxCounter1 = 0;
}
if(Usart1_r_finish) //一帧数据接受完毕标志
{
com_pro(); //处理数据
Usart1_r_finish = 0;
}
if(a >= 1500) //1.5s
{
a = 0;
ds18B20();
}
}
}
|