分享一个串口和上位机通讯

上位机发送指令给串口,通过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);
	}	
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值