usart通讯

来源:互联网 发布:最新网络歌曲 编辑:程序博客网 时间:2024/05/23 19:13
/**************************************************************************************/
/* 函数名  : CommuXPack (u16 Ins,u16 subnum,u16 data)                         
/* 功能       :  与其他stm通讯数据打包函数
/* 返回值 :   无                                                      
/* 参数      :    Ins: 与其他stm通讯指令码,subnum: 与其他stm通讯地址,
/*                      data: 与其他stm通讯数据
/* 备注      :                                 
/**************************************************************************************/
void CommuXPack(u16 Ins,u16 addr,u16 num,u16 *data,u16 ID)
{
u16 i = 0,len = 0;
static u16 TimeXOutCnt = 0;

g_SendBufX[FRAMHEAD1] = HOST_DATA_HEAD1;
g_SendBufX[FRAMHEAD2] = HOST_DATA_HEAD2;


while(g_CommX_Flag != 0)
{
TimeXOutCnt++;
if(TimeXOutCnt >= 200)
{
TimeXOutCnt = 0;
break;
}
OSTimeDly(1);
}
if(g_CommX_Flag == 0)
{


switch(Ins)
{
// 读参数指令
case HOST_COMM_RD: 
g_SendBufX[FRAMID] = ID;
g_SendBufX[FRAMLEG] = 5;
g_SendBufX[FRAMINS] = Ins;
g_SendBufX[FRAMADDR] = addr & 0xff;
g_SendBufX[FRAMADDR+1] = (addr >> 8) & 0xff;
g_SendBufX[FRAMADDRLEG] = num;

break;
// 写参数指令
case HOST_COMM_WR:
g_SendBufX[FRAMID] = ID;
g_SendBufX[FRAMLEG] = 5 + (num << 1);
g_SendBufX[FRAMINS] = Ins;
g_SendBufX[FRAMADDR] = addr & 0xff;
g_SendBufX[FRAMADDR+1] = (addr >> 8) & 0xff;
g_SendBufX[FRAMADDRLEG] = num ;
for(i = 0;i < num;i++)
{
g_SendBufX[FRAMDATA + i * 2] = data[i] & 0xff;
g_SendBufX[FRAMDATA + i * 2 + 1] = (data[i] >> 8) & 0xff;
}
break;
case HOST_COMM_TEST:
g_SendBufX[FRAMID] = ID;
g_SendBufX[FRAMLEG] = 5;
g_SendBufX[FRAMINS] = Ins;
g_SendBufX[FRAMADDR] = addr & 0xff;
g_SendBufX[FRAMADDR + 1] = (addr >> 8) & 0xff;
g_SendBufX[FRAMADDRLEG] = num ;
break;
}
g_CommX_Flag = 1;
}

}


/**************************************************************************************/
/* 函数名  : CommuXSend ()                         
/* 功能       :  与其他stm通讯发送函数
/* 返回值 :   无                                                      
/* 参数      :    
/* 备注      :                                 
/**************************************************************************************/


void CommuXSend()
{
u16 lenx = 0;
u16 i = 0;
// 判断是否发送完成
if((g_XWaitFlag == 1) && (g_CommX_Flag != 8))
{
// 重发时间做累加,200ms重发一次
g_XResentTime++; 
// 判断到达200ms,进行重发,否则啥都不干
if((g_XResentTime % 10) == 0)
g_CommX_Flag = 1;
// 判断时间超过1s,报警
if(g_XResentTime >= 50)
{
g_XWaitFlag = 0;
g_XResentTime = 0;
g_CommX_Flag = 8;
}
}
// 判断是否有数据打包完成,如果有,则进行数据发送
if(g_CommX_Flag == 1)
{
lenx = g_SendBufX[FRAMLEG] + 3;
for(i = 0;i < lenx ;i++)
{
while(!USART_GetFlagStatus(USART3, USART_FLAG_TXE))
{
OSTimeDly(1);
}
USART_SendData(USART3,g_SendBufX[i]);
}
g_XWaitFlag = 1;
g_CommX_Flag = 2;

}


}

/**************************************************************************************/
/* 函数名  : USART3_IRQHandler ()                         
/* 功能       :  串口3 通讯接收中断服务函数
/* 返回值 :   无                                                      
/* 参数      :    
/* 备注      :                                 
/**************************************************************************************/

void USART3_IRQHandler( void )
{
static u16 s_CommOffset = 4;



if(USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
{
USART_ReceiveData(USART3);    
}


if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)
{
if(g_Cn195 == 200)
{
g_RxDown_Buff[g_RxDown_Offset++]= USART_ReceiveData(USART3);         
g_RxDown_Flag = 1;
g_time = 0;
}
else
{

switch(g_CommX_Flag)
{
case 2:
g_RxX_DataBuf[FRAMHEAD1] = USART_ReceiveData(USART3);
if(g_RxX_DataBuf[FRAMHEAD1] == SLAVE_DATA_HEAD1)
g_CommX_Flag = 3;

break;
case 3:
g_RxX_DataBuf[FRAMHEAD2] = USART_ReceiveData(USART3);
if(g_RxX_DataBuf[FRAMHEAD2] == SLAVE_DATA_HEAD2)
g_CommX_Flag = 4;
break;
case 4:
g_RxX_DataBuf[FRAMID] = USART_ReceiveData(USART3);
if(g_RxX_DataBuf[FRAMID] < 255)
g_CommX_Flag = 5;

break;
case 5:
g_RxX_DataBuf[FRAMLEG] = USART_ReceiveData(USART3);
if(g_RxX_DataBuf[FRAMLEG] < 250)
g_CommX_Flag = 6;

break;
case 6:
if(s_CommOffset < (g_RxX_DataBuf[FRAMLEG] + 3) )
g_RxX_DataBuf[s_CommOffset++] = USART_ReceiveData(USART3);
if(s_CommOffset == (g_RxX_DataBuf[FRAMLEG] + 3) )
{
s_CommOffset = 4;
g_CommX_Flag = 7;
}
break;
}
}
USART_ClearITPendingBit(USART3, USART_IT_RXNE);
}
}



/**************************************************************************************/
/* 函数名  : CommuXAna ()                         
/* 功能       :  与其他stm通讯解析函数
/* 返回值 :   无                                                      
/* 参数      :    无
/* 备注      :                                 
/**************************************************************************************/


void CommuXAna()
{
u16 ins = 0,addr = 0,data = 0;
u16 i = 0,Legth = 0;
if(g_CommX_Flag == 7)
{

ins = g_RxX_DataBuf[FRAMINS];
Legth = (g_RxX_DataBuf[FRAMLEG] - 4) >> 1;
switch(ins)
{
// 从站写数据指令处理
case SLAVE_COMM_WR:
for(i = 0;i<Legth;i++)
{
addr = i + g_RxX_DataBuf[FRAMADDR] + (g_RxX_DataBuf[FRAMADDR + 1] << 8);
Cn_L[100+addr] = g_RxX_DataBuf[FRAMDATA + i * 2]  + (g_RxX_DataBuf[FRAMDATA + i * 2 + 1] << 8);
}
break;
// 从站应答正确码
case SLAVE_COMM_ACK:
break;
// 从站应答错误码
case SLAVE_COMM_NACK:
break;
case SLAVE_COMM_TEST:
for(i=0;i<Legth;i++)
{
addr =  i + g_RxX_DataBuf[FRAMADDR]  + (g_RxX_DataBuf[FRAMADDR + 1] << 8);
g_XPIDTestBuf[addr] = g_RxX_DataBuf[FRAMDATA + i * 2]  + (g_RxX_DataBuf[FRAMDATA + i * 2 + 1] << 8);
}
g_XPIDTestFlag = 1;
break;

}
g_CommX_Flag = 0;
g_XWaitFlag = 0;
g_XResentTime = 0;
}
}

原创粉丝点击