📄 rs232.c
字号:
#include "port.h"
#include "function.h"
#include "variable.h"
#include "ExHeadFileRs232.h"
void SerialInterruptServe(void) interrupt 4
{
PageTemp=SFRPAGE;
if (RI0)
{
RI0=0;
Rs232RxData=SBUF0;
if(RecFlagRs232)
{
Rs485RxBuffer[Rs232RxWritePointer++]=Rs232RxData;
}
else if(AnalysisFlag)
{
AnalyseUpMachineFlag = 0;
RecFlagRs232=0;
LenDataRs232=0;
Local_mvRs232=1;
Rs232RxWritePointer=0;
return;
}
else if(AnalysisFrameStartRs232())
{
return;
}
//获取帧指令
if(Rs232RxWritePointer == LocationCommandRs232 )
{
Commands=Rs232RxData;
return;
}
//分析数据长度
if (Rs232RxWritePointer == LocationFrLenRs232)
{
LenDataRs232 = Rs232RxData;
return;
}
//分析帧尾
if (Rs232RxWritePointer == (LenDataRs232 + LenFrExDataRs232))
{
if( Rs232RxData != FrameEndRs232)
{
AnalyseUpMachineFlag = 0;
RecFlagRs232=0;
LenDataRs232=0;
Rs232RxWritePointer=0;
AnalysisFlag=0;
SFRPAGE=CONFIG_PAGE;
LampRecUp=0x01;
}
else
{
RecFlagRs232=0;
Rs232RxWritePointer=0;
AnalyseUpMachineFlag = 1;
AnalysisFlag=0x01;
}
}
}
if(TI0 != 0)
{ //将485接口置于发送状态
TI0 = 0;
if ((--(Rs232SendLen)) == 0x00)
{
Rs232TxSendPointer = 0;
SFRPAGE=CONFIG_PAGE;
LampSendUp=0x01;
}
else
{
SFRPAGE=UART0_PAGE;
SBUF0 = Rs485RxBuffer[Rs232TxSendPointer++];
}
}
SFRPAGE=PageTemp;
}
char AnalysisFrameStartRs232(void)
{
// RI0 = 0;
// Rs232RxData = SBUF0;
//如果程序正在分析上位机指令;
//或正在向组合模块发送指令;
//或正在等待组合模块回馈上位机指令
//时,上位机又来了指令,这时可以抛弃以上三种情况不管,
//重新接收上位机指令,解析上位机指令,
//向组合模块发送指令,等待组合模块回馈信息
//if (Analyse_UpMachine_Flag)
// return;
if (Rs232RxWritePointer>Rs232BuffLen)
{
AnalyseUpMachineFlag = 0;
RecFlagRs232=0;
LenDataRs232=0;
Local_mvRs232=1;
Rs232RxWritePointer=0;
return 0;
}
if (!RecFlagRs232)//判断接收标志
{
if (Rs232RxData != FrameStartRs232)
{
return 0;
}
else
{
Rs232RxWritePointer = 0;
Rs485RxBuffer[Rs232RxWritePointer++]=Rs232RxData;
Local_mvRs232=0x01;//定义帧头出现的位置
RecFlagRs232=0x01;
SFRPAGE=CONFIG_PAGE;
LampRecUp=0x00;
return 1;
}
}
}
unsigned char Security(unsigned char *buff,unsigned char FrLen,unsigned char LenFrExData)
{
unsigned char CrcLen, CrcL, CrcH; //Temp, i;
unsigned char *Crcbuf;
Crcbuf = buff + 1; // 校正的命令单元的起始地址
CrcLen =( FrLen + LenFrExData-4); // 命令单元长度
Crc1021(Crcbuf, CrcLen, &CrcH, &CrcL);
if ((*(buff+CrcLen +1) == CrcL)&& (*(buff+CrcLen + 2) == CrcH))
return 1;
else
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -