|
編寫(xiě)串口通信協(xié)議時(shí),發(fā)送已經(jīng)被成功接收,但是一直無(wú)法正確接收數(shù)據(jù),另一塊通信板協(xié)議已經(jīng)是確定OK的,所以肯定是自己編寫(xiě)的程序出現(xiàn)了問(wèn)題,請(qǐng)高手幫忙分析一下。接收函數(shù).C
void Uart2() interrupt 8 using 1
{
unsigned char dat; //串口二數(shù)據(jù)接收緩存
EA=0; //禁止中斷,防止數(shù)據(jù)接收出錯(cuò)。
if(S2CON&0x01) //發(fā)送和接收共用一個(gè)中斷向量,需在程序中判斷
{
if(Rece_1==1)
{
dat=S2BUF; //從串口緩沖區(qū)讀取數(shù)據(jù)
Rece_Buf_1[Rece_Cnt_1]=dat;
Rece_Cnt_1++;
In_Send_1=0;
if(Rece_Cnt_1>=Rece_Len1)
{
CheckSum();
if(HaveData_S2_RxD==1)
{
DataProcess_R2();
}
}
}
else if(S2BUF==DEVICENO1)
{
Rece_1=1;
Rece_Buf_1[0]=DEVICENO1;
Rece_Cnt_1=1;
}
else
Rece_Cnt_1=0;
// S2CON&=~S2RI; //串口接收中斷標(biāo)記需軟件清零
S2CON=S2CON & 0xfe; //串口接收中斷標(biāo)記需軟件清零
}
EA=1; //使能中斷
}
void CheckSum()
{
int i;
unsigned char CheckSum=0;
for (i=0;i<=Rece_Len1-2;i++)
{
CheckSum=CheckSum+Rece_Buf_1;
}
if(CheckSum==Rece_Buf_1[Rece_Len1-1])
{
HaveData_S2_RxD=1; //接收到數(shù)據(jù)標(biāo)記有效
Rece_Wait_1=0;
S2_COMERRT=0;
}
else
HaveData_S2_RxD=0;
}
發(fā)送函數(shù).C
void Uart2_Send(Udat)
{
In_Send_1=0;
In_Rece_1=0;
S2BUF=Udat; //將要發(fā)送的數(shù)據(jù)放入串口數(shù)據(jù)緩沖區(qū)
In_Send_1=1;
while(!(S2CON&0x02)); //等待發(fā)送完成
S2CON&=~S2TI; //清零S2TI
}
void Uart2_SendString()
{
int i,j;
unsigned char CheckSum=0;
Rece_1=0;
Send_Buf_1[0]=DEVICENO2;
Send_Buf_1[1]=(Request_rpm+1000)%256;
Send_Buf_1[2]=(Request_rpm+1000)/256;
Send_Buf_1[3]=85;
Send_Buf_1[4]=85;
for(j=0;j<=Send_Len1-2;j++)
{
CheckSum=CheckSum+Send_Buf_1[j];
}
Send_Buf_1[Send_Len1-1]=CheckSum;
for(i=0;i<Send_Len1;i++)
{
Uart2_Send(Send_Buf_1);
}
In_Rece_1=0;
}
|
|