📄 rs232process.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 + -