下面是我的程序,用邏輯分析儀接單片機的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)
}
|