⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rs232process.c

📁 M200一个与单片机通信的C语言软件源代码
💻 C
字号:
/***********************************************************************************
/----------------------Copyright (c) 2005 ~ 2008 Miartech. All Rights Reserved.-----------------------/
/***********************************************************************************
**-----------------------------------------File Info--------------------------------------------
** Last modified Date:  2008-06-24
** Descriptions:  RS232 Serial Port Transmit & Receive Primary Functions
**--------------------------------------------------------------------------------------------
** Created By:  	Kelven
** Created Date:	2007-04-17
**--------------------------------------------------------------------------------------------
** Modified by: 	Kelven
** Modified date:	2007-09-04
** Version:		V4.0.0
** Descriptions:
**--------------------------------------------------------------------------------------------
** Modified by: 	Kelven
** Modified date:	2008-06-24
** Version:		V4.0.1
** Descriptions:	Updating Key Configrating Function, Added PLC Chip Register Value Setting Module
***********************************************************************************/

#include "..\inc\RS232Process.h"

extern bit g_bInteract_Bit;

extern FLAG_YES_NO Recv_Config_Correct;
extern FLAG_YES_NO ACK_Frame_Flag;
extern FLAG_YES_NO Stop_Loop_Flag;

extern BYTE xdata g_cNode_Address;
extern FRAME_RS232 xdata Recv_Frame_RS232;

/*------------------------------------Global Value Definition------------------------------------*/
BYTE xdata Send_Command_Record;
/*------------------------------------------------------------------------------------------*/

/***********************************************************************************
** Function Name:Check_XOR_Sum	
** Input Parameters:BYTE* Data_BUF,BYTE cBUF_Length
** Output Parameters:None
** Description:Calculate the XOR Result of SBUF Transmit & Receive Data
***********************************************************************************/
BYTE Check_XOR_Sum(PBYTE pData_BUF, BYTE cBUF_Length)
{
	BYTE ForCnt;
	BYTE XOR_Value;

	XOR_Value = 0;
	for(ForCnt = 0; ForCnt < cBUF_Length; ForCnt++)
	{
		XOR_Value ^= *(pData_BUF++);
	}
 	return XOR_Value;
}

/***********************************************************************************
** Function Name:	RS232_Send_Frame
** Input Parameters:BYTE*  pSBUF_Data, BYTE cCommand
** Output Parameters:None
** Description:Send Data Frame to RS232 Seerial Port
***********************************************************************************/
void RS232_Send_Frame(pFRAME_RS232 pFrame_RS232, BYTE cCommand)
{
	BYTE ForCnt;
	BYTE XOR_Result = 0;
	BYTE xdata SBUF_Tmp[6] = 0;
	PBYTE xdata pSBUF_Tmp;
	pSBUF_Tmp = SBUF_Tmp;
	
	Send_Command_Record = 0;
	Send_Command_Record = cCommand;
	
	pFrame_RS232->Frame_Header = FRAME_HEADER_BYTE;
	//pFrame_RS232->Local_Address = g_cNode_Address;
	pFrame_RS232->Direction_Flag = 0x01;
	pFrame_RS232->RetrySend_Flag = 0x00;
	pFrame_RS232->Reserved = 0x00;

	pFrame_RS232->Command = cCommand;	

	memcpy(SBUF_Tmp, pFrame_RS232, 6);
	for(ForCnt = 0;ForCnt < 6;ForCnt++)		//Receive Frame Header:0xEE,g_cNode_Address,Frame_Flag,0x00,cCommand(5 Bytes)
	{
		SBUF = SBUF_Tmp[ForCnt];
		while(!TI);
		TI = 0;
	}
	
	for(ForCnt = 0;ForCnt < pFrame_RS232->Data_Length; ForCnt++)	//Receive Frame Contents
	{
		SBUF = pFrame_RS232->Frame_Data_BUF[ForCnt];
		while(!TI);
		TI = 0;
	}
	
	pSBUF_Tmp = SBUF_Tmp;
	XOR_Result = 0;
	for(ForCnt = 0;ForCnt < 6; ForCnt++)
	{
		XOR_Result ^= *(pSBUF_Tmp++);
	}
	pSBUF_Tmp = pFrame_RS232->Frame_Data_BUF;		//Computer the Frame XOR CRC Value
	for(ForCnt = 0;ForCnt < pFrame_RS232->Data_Length; ForCnt++)
	{
		XOR_Result ^= *(pSBUF_Tmp++);
	}
	SBUF = XOR_Result;
	while(!TI);
	TI = 0;

	ACK_Frame_Flag = FLAG_YES;		
}

/***********************************************************************************
** Function Name:	Send_ACK_RS232
** Input Parameters:BYTE cReturn_Status
** Output Parameters:None
** Description:Send The Receive Status:Correct or Error to Serial Port
***********************************************************************************/
void Send_ACK_RS232(BYTE cReturn_Status)
{
	SBUF = cReturn_Status;
	while(!TI);
	TI = 0;
}

/***********************************************************************************
** Function Name:	Receive_ACK_RS232
** Input Parameters:cReturn_Status
** Output Parameters:None
** Description:Receive The Status PC Return to MCU After PC Receiving Data 
***********************************************************************************/
void Receive_ACK_RS232(BYTE cReturn_Status)
{
	if (cReturn_Status == ACK_Recv_Data_Error)
	{
		Recv_Frame_RS232.Command = Send_Command_Record;
		Recv_Config_Correct = FLAG_YES;
	}
}

/***********************************************************************************
** Function Name:	RS232_Receive_Frame
** Input Parameters:None
** Output Parameters:None
** Description:Receive Data Frame From RS232 Seerial Port
***********************************************************************************/
void RS232_Receive_Frame(void)
{
	BYTE Recv_Data_Length;
	BYTE Recv_Command;
	BYTE ForCnt;
	BYTE XOR_Result_Tran;
	BYTE xdata XOR_Result_Recv;
	BYTE xdata SBUF_RecvByte[6] = 0;

	PBYTE pRecv_Data;
	pRecv_Data = SBUF_RecvByte;

	for(ForCnt = 0;ForCnt < 4;ForCnt++)		//Receive Frame Header:0xEE,g_cNode_Address,Frame_Flag,0x00,cCommand(5 Bytes)
	{
		while(RI != 1);
		*(pRecv_Data++)  = SBUF;
		do
		{
			RI = 0;
		}
		while(RI);
	}
	
	while(RI != 1);										//Receive cCommand(1 Byte)
	Recv_Command = SBUF;
	*(pRecv_Data++) = Recv_Command;
	do
	{
		RI = 0;
	}
	while(RI);

	while(RI != 1);										//Receive Frame Length(1 Byte)
	Recv_Data_Length = SBUF;
	*(pRecv_Data++) = Recv_Data_Length;
	do
	{
		RI = 0;
	}
	while(RI);

	memcpy(&Recv_Frame_RS232, SBUF_RecvByte, 6);

	for(ForCnt = 0;ForCnt < Recv_Data_Length; ForCnt++)		//Receive Frame Contents
	{
		while(RI != 1);
		Recv_Frame_RS232.Frame_Data_BUF[ForCnt] = SBUF;
		do
		{
			RI = 0;
		}
		while(RI);
	}

	while(RI != 1);										//Receive Frame XOR CRC Result
	XOR_Result_Tran = SBUF;
	do
	{
		RI = 0;
	}
	while(RI);
		
	XOR_Result_Recv = 0;

	pRecv_Data = SBUF_RecvByte;							//Computer the Frame XOR CRC Value
	for(ForCnt = 0;ForCnt < 6; ForCnt++)
	{
		XOR_Result_Recv ^= *(pRecv_Data++);
	}
	pRecv_Data = Recv_Frame_RS232.Frame_Data_BUF;		//Computer the Frame XOR CRC Value
	for(ForCnt = 0;ForCnt < Recv_Data_Length; ForCnt++)
	{
		XOR_Result_Recv ^= *(pRecv_Data++);
	}

	if(XOR_Result_Tran != XOR_Result_Recv)
	{
		Send_ACK_RS232(ACK_Recv_Data_Error);
		Recv_Config_Correct = FLAG_NO;
	}
	else
	{	
		if(Recv_Command == 0x04)
		{ 
			Stop_Loop_Flag = FLAG_YES;
			ACK_Frame_Flag = FLAG_NO;
		}

		g_bInteract_Bit = 0;

		//Receive_Frame_Format(Recv_Command, SBUF_RecvByte);

		Recv_Config_Correct = FLAG_YES;

		SBUF = ACK_Recv_Data_Correct;
		while(!TI);
		TI = 0;
	}
}

/***********************************************************************************
**										    End Of File											**
***********************************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -