上位机发送指令给串口,通过mcu驱动fpga或者其他需要外设,包含包头包尾以及指令
void Commn_transive(void)
{
if(UART_REC.RECEIVE_FLAG == NONE_INDEX)
return;
if(UART_REC.none_flag == 0 && (UART_REC.connected_flag == true) )
{
switch(UART_REC.RECEIVE_FLAG)
{
case CONNECTION_INDEX:
/*命令*/
break;
case WORKING_INDEX:
/*命令*/
break;
case FINISHED_INDEX:
/*命令*/
break;
case RESULT_FAIL_INDEX:
/*命令*/
break;
case RESULT_SUCCESS_INDEX:
/*命令*/
break;
default:break;
}
}
UART_REC.none_flag = 0;
UART_REC.finished = false;
UART_REC.frameIndex = 0;
UART_REC.RECEIVE_FLAG = NONE_INDEX;
}
void Commn_Check(DATA_RX_T * g_structcommndata)
{
unsigned char i;
if(g_structcommndata->finished == true)
{
if(g_structcommndata->framebuffer[0]==PRO_DEVICEFRAME1&&g_structcommndata->framebuffer[1]==PRO_DEVICEFRAME2)
check_state = CONNECT_STATE;
else if(g_structcommndata->framebuffer[0]==PRO_DEVICEFRAME1_NEXT&&g_structcommndata->framebuffer[1]==PRO_DEVICEFRAME2_NEXT)
check_state = COMMON_STATE;
else
check_state = NONE_STATE;
switch(check_state)
{
case COMMON_STATE:
{
for(i=0;i<2;i++)
{
if(g_structcommndata->framebuffer[i+2] == working_tip[i])
g_structcommndata->RECEIVE_FLAG = WORKING_INDEX;
else if(g_structcommndata->framebuffer[i+2] == finished_tip[i])
g_structcommndata->RECEIVE_FLAG = FINISHED_INDEX;
else if(g_structcommndata->framebuffer[i+2] == failed_tip[i])
g_structcommndata->RECEIVE_FLAG = RESULT_FAIL_INDEX;
else if(g_structcommndata->framebuffer[i+2] == success_tip[i])
g_structcommndata->RECEIVE_FLAG = RESULT_SUCCESS_INDEX;
else
{
g_structcommndata->RECEIVE_FLAG = NONE_INDEX;
g_structcommndata->none_flag = 1;
}
}
}break;
case CONNECT_STATE:
{
for(i=0;i<2;i++)
{
if(g_structcommndata->framebuffer[i+2] == connect_tip[i])
{
g_structcommndata->RECEIVE_FLAG = CONNECTION_INDEX;
g_structcommndata->connected_flag = true;
}
else
{
g_structcommndata->RECEIVE_FLAG = NONE_INDEX;
g_structcommndata->none_flag = 1;
}
}
}break;
default:break;
}
}
else
return;
}
void Receive_COMMNData(DATA_RX_T* g_structcommndata,unsigned char rc_data)
{
static MESSAGE_RECEIVE_TYPEDEF g_messagestate = IDLE;
if(g_structcommndata->frameStart == 0)
{
if(rc_data != PRO_CMDFRAME_HEAD)
{
g_messagestate = IDLE;
g_structcommndata->finished = false;
g_structcommndata->frameIndex = 0;
g_structcommndata->RECEIVE_FLAG = NONE_INDEX;
return;
}
}
if(rc_data==PRO_CMDFRAME_HEAD && g_messagestate!=IDLE)
{
g_messagestate = IDLE;
buffer_clean(g_structcommndata);
g_structcommndata->frameStart = 0;
}
switch(g_messagestate)
{
case IDLE:
case RECEIVE_HEAD1:
{
if(rc_data == PRO_CMDFRAME_HEAD)
{
g_messagestate = RECEIVE_HEAD2;
g_structcommndata->frameStart = 1;
}
else
{
g_structcommndata->frameStart = 0;
g_messagestate = IDLE;
}
}break;
case RECEIVE_HEAD2:
{
if(rc_data == PRO_DATAFRAME_HEAD)
{
g_messagestate = RECEIVE_DATA;
g_structcommndata->frameStart = 1;
}
else
{
g_structcommndata->frameStart = 0;
g_messagestate = IDLE;
}
}break;
case RECEIVE_DEVICE1:
case RECEIVE_DEVICE2:
case RECEIVE_COMN1:
case RECEIVE_CMMN2:
case RECEIVE_DATA:
{
g_structcommndata->framebuffer[g_structcommndata->frameIndex] = rc_data;
g_structcommndata->frameIndex ++;
if(g_structcommndata->frameIndex == 4)
{
g_messagestate = RECEIVE_TAIL1;
g_structcommndata->frameIndex = 0;
}
}break;
case RECEIVE_TAIL1:
{
if(rc_data == PRO_FRAME_TAIL1)
{
g_messagestate = RECEIVE_TAIL2;
g_structcommndata->frameStart = 1;
}
else
{
g_structcommndata->frameStart = 0;
g_messagestate = IDLE;
buffer_clean(g_structcommndata);
}
}break;
case RECEIVE_TAIL2:
{
if(rc_data == PRO_FRAME_TAIL2)
{
g_structcommndata->finished = true;
g_messagestate = IDLE;
}
else
{
g_structcommndata->frameStart = 0;
g_messagestate = IDLE;
buffer_clean(g_structcommndata);
}
}break;
default:break;
}
}
void USART0_IRQHandler(void)
{
unsigned char redat;
if(usart_interrupt_flag_get(USART0,USART_INT_FLAG_RBNE))
{
redat = usart_data_receive(USART0);
Receive_COMMNData(&UART_REC,redat);
}
}