下面是我的程序,用邏輯分析儀接單片機的RXD端是可以接收到數(shù)據(jù)的,如果單片機接收到5A A5 06 83 50 15 01 00 01的指令,應該會執(zhí)行 這段代碼,但是貌似沒有,想問問大佬們有什么想法  ,麻煩各位大佬了
(這是邏輯分析儀接單片機RXD接收的數(shù)據(jù))
//串口發(fā)送單個字節(jié)
void SendData(u8 dat)
{
TI = 0; //初始化后TI給置1了,需要軟件置0,避免遺失第二幀數(shù)據(jù)
SBUF = dat; //發(fā)送數(shù)據(jù)
while (!TI); //等待上個數(shù)據(jù)發(fā)送完成
TI=0;
}
//串口發(fā)送字符串
void SendStr(u8 *p,u8 length) //length是字節(jié)個數(shù),增加length是為了發(fā)送00
{
while(length)
{
SendData(*p++);
length--;
}
}
void UartInit(void) //115200bps@22.1184MHz
{
PCON |= 0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位數(shù)據(jù),可變波特率
REN = 1;
AUXR &= 0xBF; //定時器時鐘12T模式
AUXR &= 0xFE; //串口1選擇定時器1為波特率發(fā)生器
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x20; //設置定時器模式
TL1 = 0xFF; //設置定時初始值
TH1 = 0xFF; //設置定時重載值
ET1 = 0; //禁止定時器%d中斷
ES = 1; //使能串口中斷 //查詢方式發(fā)數(shù)據(jù)需要關中斷
TR1 = 1; //定時器1開始計時
EA = 1;
}
//-----------------------------------------------------------------------
// UART中斷函數(shù)(與迪文屏通訊)
//指令格式:5A A5 06 83 0000 01 0000
// 或 5A A5 03 82 4F 4B
//若數(shù)據(jù)量多、有粘連指令,采用環(huán)形隊列處理
//-----------------------------------------------------------------------
void UART_interrupt () interrupt 4
{
if(RI)
{
RI = 0; //清除接收完成標志
RX_Buf[RX_Count]=SBUF; //數(shù)據(jù)接收
RX_Count++; //接收數(shù)據(jù)計數(shù)
if(RX_Count>1 &&((RX_Buf[0]!=0x5A)||(RX_Buf[1]!=0xA5)))//幀頭判定0x5AA5
RX_Count=0;
else if(RX_Count>=(RX_Buf[2]+3)) //一幀數(shù)據(jù)接收完整
{
// 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]); //拷貝指令碼起的數(shù)據(jù)
// led_time=20; //接收到正確指令
}
RX_Count=0;
}
}
if (SCON & TI)
{
SCON &= ~TI; //清除發(fā)送完成標志
// Busy = 0;
}
}
/*--------------------------------------------------------------------
功 能:串口接收處理(40ms) 串口解析
入口參數(shù):void
出口參數(shù):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)
}
|