下面是我的程序,用逻辑分析仪接单片机的RXD端是可以接收到数据的,如果单片机接收到5A A5 06 83 50 15 01 00 01的指令,应该会执行 这段代码,但是貌似没有,想问问大佬们有什么想法  ,麻烦各位大佬了
(这是逻辑分析仪接单片机RXD接收的数据)
//串口发送单个字节
void SendData(u8 dat)
{
TI = 0; //初始化后TI给置1了,需要软件置0,避免遗失第二帧数据
SBUF = dat; //发送数据
while (!TI); //等待上个数据发送完成
TI=0;
}
//串口发送字符串
void SendStr(u8 *p,u8 length) //length是字节个数,增加length是为了发送00
{
while(length)
{
SendData(*p++);
length--;
}
}
void UartInit(void) //115200bps@22.1184MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
REN = 1;
AUXR &= 0xBF; //定时器时钟12T模式
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFF; //设置定时初始值
TH1 = 0xFF; //设置定时重载值
ET1 = 0; //禁止定时器%d中断
ES = 1; //使能串口中断 //查询方式发数据需要关中断
TR1 = 1; //定时器1开始计时
EA = 1;
}
//-----------------------------------------------------------------------
// UART中断函数(与迪文屏通讯)
//指令格式:5A A5 06 83 0000 01 0000
// 或 5A A5 03 82 4F 4B
//若数据量多、有粘连指令,采用环形队列处理
//-----------------------------------------------------------------------
void UART_interrupt () interrupt 4
{
if(RI)
{
RI = 0; //清除接收完成标志
RX_Buf[RX_Count]=SBUF; //数据接收
RX_Count++; //接收数据计数
if(RX_Count>1 &&((RX_Buf[0]!=0x5A)||(RX_Buf[1]!=0xA5)))//帧头判定0x5AA5
RX_Count=0;
else if(RX_Count>=(RX_Buf[2]+3)) //一帧数据接收完整
{
// if((RX_Buf[4]==0x4F)&&(RX_Buf[5]==0x4B)) //OK指令直接忽略
if(Re_full==0)
{
Send_Step2=1;
Re_full=1;
// memcpy(Deal_Buf,&RX_Buf[3],RX_Buf[2]); //拷贝指令码起的数据
// led_time=20; //接收到正确指令
}
RX_Count=0;
}
}
if (SCON & TI)
{
SCON &= ~TI; //清除发送完成标志
// Busy = 0;
}
}
/*--------------------------------------------------------------------
功 能:串口接收处理(40ms) 串口解析
入口参数:void
出口参数:void
返 回:void
// 5A A5 06 83 60 10 01 00 01 //5A A5 03 82 4F 4B
0 1 2 3 4 5 6 7 8 0 1 2 3 4 5
--------------------------------------------------------------------*/
void Deal_RX_Data(void)
{
if(Re_full==1)
{
switch(RX_Buf[3])
{
case 0x82:
if((0X4f== RX_Buf[4])&(0X4B == RX_Buf[5]))
{
// printf("setparam success\r\n");
}
break;
case 0x83:
DGUS_VP = (RX_Buf[4]&0x00ff)<<8 | RX_Buf[5];
DGUS_DATA = (RX_Buf[7]&0x00ff)<<8 | RX_Buf[8];
if((DGUS_VP==0x6010)||(DGUS_VP==0x6020)||(DGUS_VP==0x6030)) //调档
{
Send_Step2=1;
if(0x0001== DGUS_DATA)
{
}
else if(0x0002== DGUS_DATA)
{
//level2 = 1;
}
else if(0x0003== DGUS_DATA)
{
//level3 = 1;
}
else if(0x0004== DGUS_DATA)
{
//level4 = 1;
}
else if(0x0005== DGUS_DATA)
{
//level5 = 1;
}
else if(0x0006== DGUS_DATA)
{
//level6 = 1;
}
}
else if((DGUS_VP==0x5015)||(DGUS_VP==0x5025)||(DGUS_VP==0x5035)) //开关
{
if(0x0000==DGUS_DATA)
{
JDQ = start_a;
}
else if(0x0001==DGUS_DATA)
{
JDQ = ~start_a;
printf("%x",0x11);
// show_buf[0]=0;
// show_buf[1]=4;
//// Send_Uart(2,0x82,0x6030,show_buf);
//// Send_Uart(2,0x82,0x6020,show_buf);
// Send_Uart(2,0x82,0x6010,show_buf);
}
}
break;
default:
break;
}
Re_full=0;
}//if(Re_full==1)
}
|