📄 commpc.c
字号:
//********************** 使用 RS232 与中心通信 ****************
#include "msp430x14x.h"
#include "main.h"
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//from Debug.c
extern unsigned char g_chDebugBuf[DebugMAX];//收发共一个缓冲区
extern unsigned char g_chDebugHead, g_chDebugTail;
extern unsigned char g_chReceiveDebugChar;//收单个信息
extern unsigned char g_chMainDebugProcessTimeout_1s;
extern void ExternInsertDebugSendBuf(unsigned char *pData, unsigned int intLen);
extern unsigned char ParamID(unsigned char chParamID, unsigned char *chParamBuf, unsigned char chLen);
//form main.c
//用作为 16 个位!BOOLEAN 变量来使用
extern unsigned int g_intMark;
extern unsigned int g_intMarkA;
extern unsigned char g_chSecond, g_chMinute, g_chHour, g_chDay, g_chMonth, g_chYear;
extern unsigned int intTBCount_50ms;
//from dtmf.c
extern unsigned char g_chSendDtmf;
extern unsigned char g_chBuildDTMF_Stat;
extern unsigned char g_chBuildDTMFTime_1s;
extern unsigned char g_chDtmfPhysicsReceive_50ms;
//from innercomm.c
extern unsigned char g_chFS_Status;
extern unsigned char g_chFS_SelfCheck_Status;
extern unsigned char g_chGP_SelfCheck_Status;
extern unsigned char g_chGP_Status;
extern unsigned char g_chCable_Status;
extern unsigned char g_chFS_Mark;//----按位表明1-8列的FS的要等待发送的告警或恢复状态
extern unsigned char g_chFS_SelfCheck_Mark;//----按位表明1-8列的FS的要等待发送的自检告警或恢复状态
extern unsigned char g_chGP_Mark;//----按位表明1-8列的工频传感器的要等待发送的告警或恢复状态
extern unsigned char g_chGP_SelfCheck_Mark;//----按位表明1-8列的工频传感器的要等待发送的自检告警或恢复状态
extern unsigned char g_chCable_Mark;//----按位表明1-8列的主干电缆的要等待发送的告警或恢复状态
extern unsigned char g_chFS_Alert;//----按位表明1-8列的FS的要等待发送的告警状态
extern unsigned char g_chFS_SelfCheck_Alert;//----按位表明1-8列的FS的要等待发送的自检告警状态
extern unsigned char g_chGP_Alert;//----按位表明1-8列的工频传感器的要等待发送的告警状态
extern unsigned char g_chGP_SelfCheck_Alert;//----按位表明1-8列的工频传感器的要等待发送的自检告警状态
extern unsigned char g_chCable_Alert;//----按位表明1-8列的主干电缆的要等待发送的告警状态
extern unsigned char g_chFS_Restore;//----按位表明1-8列的FS的要等待发送的恢复状态
extern unsigned char g_chFS_SelfCheck_Restore;//----按位表明1-8列的FS的要等待发送的自检恢复状态
extern unsigned char g_chGP_Restore;//----按位表明1-8列的工频传感器的要等待发送的恢复状态
extern unsigned char g_chGP_SelfCheck_Restore;//----按位表明1-8列的工频传感器的要等待发送的自检恢复状态
extern unsigned char g_chCable_Restore;//----按位表明1-8列的主干电缆的要等待发送的恢复状态
extern unsigned int g_intGP_Current[8];
extern unsigned int g_intGP_CurrentAlert[8];// [8] mA,告警时;
extern unsigned int g_intGP_CurrentRestore[8];// [8] mA,恢复时
extern unsigned int g_intGP_FixedCurrent[8];
extern unsigned char g_chInnerCommSendBuf[MacroInnerCommSendBufMax];
extern void AddCheckSum(unsigned char chLen);
extern unsigned char g_chInnerCommSingleChar;
extern unsigned char g_chInnerCommSubSingleChar;
//from env.c
extern unsigned char g_chEnv_Mark;// -------按位表明1-2通道的环境的要等待发送告警或恢复状态
//3--5位为三路环境模拟量:温度1,有害气体,48V,第6位为门系统
extern unsigned char g_chEnv_Alert;// -------按位表明1-2通道的环境的要等待发送告警状态
//3--5位为三路环境模拟量:温度1,有害气体,48V,第6位为门系统
extern unsigned char g_chEnv_Restore;// -------按位表明1-2通道的环境的要等待发送恢复状态
//3--5位为三路环境模拟量:温度1,有害气体,48V,第6位为门系统
extern unsigned char g_chEnv_LowHign;//对于 象 温度1 48V 要分高还是低告警!
//温度
extern unsigned char g_chTemperatureAlert,g_chTemperatureRestore;
//3 个 A/D 处理
extern unsigned char g_chDCAlert,g_chDCRestore;//P6。2
extern unsigned char g_chBadGasAlert,g_chBadGasRestore;//P6。0
extern unsigned char g_chEnv_Status;//-按位表明1-2通道的环境的告警/恢复状态
//3--5位为三路环境模拟量(温度1,48V,有害气体):
//6位为门禁,
//7位为温度2 剩下一个可以以后扩展
//门的缓冲区
extern unsigned char g_chDoorStat;//0-门关 1-密码开门 2-非法开门 3-中心开门 4-禁用门禁 5-启用 6-门开
extern unsigned char g_chDoorStatAlert[20];
extern unsigned char g_chDoorStatHead,g_chDoorStatTail;//,用20缓冲区来记录门状态改变
extern unsigned char g_chDC;//P6。2
extern unsigned char g_chBadGas;//P6。0
extern unsigned char g_chTemperature;
extern unsigned char g_chDoorStatTemp;
//from flash.c
extern void Write_DoorInfo_AccordingNo(unsigned int iTempSensorNo, unsigned char *pInfoData);
//********************** extern 区****************extern 区****************
//********************** extern 区****************extern 区****************
//处理发送缓冲区-----
#define SendPcBufMAX 70
unsigned char g_chSendPCBuf[SendPcBufMAX]; //发送到PC的缓冲区
//(发往PC,最大一信息长度)----------------
unsigned char g_chSendPCHead, g_chSendPCTail;//发送到PC的缓冲区的头尾指针
//处理接收缓冲区-----
unsigned char g_chReceivePCBuf[ReceivePcBufMAX]; //发往PC,最大一信息长度)----------------
unsigned char g_chReceivePCHead, g_chReceivePCTail;
void ReceivePCBuf(void);//处理接收缓冲区里的信息 从 PC 机来
unsigned char g_chReceivePCBuf_Stat;
unsigned char g_chReceivePCBuf_1s;
#define ReceivePCBuf_1sIPushMax 10
void SendPCBuf(void);//处理发送缓冲区里的信息 到 PC 机
unsigned char g_chSendPCBuf_Stat;
unsigned char g_chSendPCBuf_1s;
unsigned char g_chSendPCBufReSendCount = 0;
#define SendPCBufReSendCount_MAX 5
unsigned char g_chSendPCBufWrongReSendCount = 0;
#define SendPCBufWrongReSendCount_MAX 5
void MainPushReport(void);//报告状态改变
unsigned char g_chMainPushReport_Stat;//报告状态改变的处理机
unsigned char g_chMainPushReportTime_1s;
#define MainPushReportTime_1sMAX 120
unsigned char g_chPushReportDetail_SubStat;//记录报告状态改变的类型
#define PushPCBuf_1sMAX 5
unsigned char g_chPushBit0to7;
unsigned char g_chMDFCount;
void QueryReportPC(void);//查询是否要报告
unsigned char g_chOderID = '0';// 流水号
unsigned char AutoInsertSendPCBuf(unsigned char *pData,unsigned char chLen);
unsigned char InsertSendPCBuf(void);
const unsigned char conPowerOn[] = {6,0,0,6,0,0,0,0,0,0};
const unsigned char conNoActiveAlert[] = {7,0,0,6,0,0,0,0,0,0};//0013
unsigned char AutoInsertOneSwitchSendPCBuf(unsigned char chBit,unsigned int intOff);//2002-10-11 17:04 自动加 局号、流水号、检查和
unsigned char AutoInsertSendPCBufAnswer(unsigned char chP);
unsigned char AutoEnvFiveInsertSendPCBuf(unsigned char *pData,unsigned char chClass);//2002-10-11 17:04 自动加 局号、流水号、检查和
unsigned char AutoInsertManySwitchSendPCBuf(unsigned char chAlert,unsigned char chCheck,unsigned int intOff);
unsigned char AutoEnvSevenInsertSendPCBufTen(unsigned char chClass);//2002-10-11 17:04 自动加 局号、流水号、检查和
unsigned char ParamAutoInsertSendPCBuf(unsigned char chParamID,unsigned char *pData,unsigned char chLen);
unsigned char AutoEnvSevenInsertSendPCBufError(void);
unsigned char AutoEnvSevenInsertSendPCBufNighteen(unsigned char * pData,unsigned char chClass);
unsigned char AutoEnvSixInsertSendPCBufTwo(unsigned char chClass);
unsigned char AutoEnvSevenInsertSendPCBufFourty(unsigned char * pData,unsigned char chGPID);
/**************************************
*功能: 回答局号
*参数:
*返回:
*备注: 只加 # *
**************************************/
unsigned char InsertSendPCBuf(void)
{//回答---不可以等待
unsigned int i;
//解决回答比较慢的问题----------在 RS 232 通信中可能发生 尾巴的丢失!-- 不是很好
if((g_chSendPCBuf_Stat == 2) || (g_chSendPCBuf_Stat == 3))
{//在 RS 232 方式下 等待 4 毫秒 , 在 DTMF 下 应该不可能发生该问题
return(0);//只能 采用丢掉的办法
}
//加 头 #
g_chSendPCBuf[1] = '#';
//加 局号
for(i = 0; i < 4; i++)
{
g_chSendPCBuf[2 + i] = *(unsigned char *)(StationID_Info + i);//是ASC码
}
//加 尾 *
g_chSendPCBuf[6] = '*';
//肯定发送
g_chSendPCHead = 0;
g_chSendPCTail = 6;
g_chSendPCBuf_Stat = 1;//马上去发吧
return(1);
}
unsigned char AutoInsertSendPCBufAnswer(unsigned char chP)
{// #20* #30* #2* #3*
//加 头 #
if((g_chSendPCBuf_Stat == 2) || (g_chSendPCBuf_Stat == 3))
{//在 RS 232 方式下 等待 4 毫秒 , 在 DTMF 下 应该不可能发生该问题
return(0);//只能 采用丢掉的办法
}
g_chSendPCBuf[1] = '#';
if(chP < 4)
{// #2# #3#
g_chSendPCBuf[2] = chP + 48;
if(g_intMark & RS232DTMFSendPC_Mark)
{
g_chSendPCBuf[3] = '*';
g_chSendPCTail = 3;
}
else
{//要求使用DTMF通信
g_chSendPCBuf[3] = '0';
g_chSendPCBuf[4] = '*';
g_chSendPCTail = 4;
}
}
else
{// 回答参数错误
g_chSendPCBuf[2] = 'C';
g_chSendPCBuf[3] = '9';
g_chSendPCBuf[4] = ((chP / 10) % 10) + 48;
g_chSendPCBuf[5] = (chP % 10) + 48;
g_chSendPCBuf[6] = '*';
g_chSendPCTail = 6;
}
g_chSendPCHead = 0;
g_chSendPCBuf_Stat = 1;//马上去发吧
return(1);
}
unsigned char AutoInsertManySwitchSendPCBuf(unsigned char chAlert,unsigned char chCheck,unsigned int intOff)//2002-10-11 17:04 自动加 局号、流水号、检查和
{//报告---可以等待,
//if(chLen < SendPcBufMAX - 20)
if((g_chSendPCBuf_Stat == 2) || (g_chSendPCBuf_Stat == 3))
{//在 RS 232 方式下 等待 4 毫秒 , 在 DTMF 下 应该不可能发生该问题
return(0);//只能 采用丢掉的办法
}
{//长度肯定不会长
unsigned int i,j,intLen;
//加 头 #
g_chSendPCBuf[1] = '#';
//加 局号
for(i = 0; i < 4; i++)
{
g_chSendPCBuf[2 + i] = *(unsigned char *)(StationID_Info + i);//是ASC码
}
g_chSendPCBuf[6] = g_chOderID;
//加 信息 7009003001000 1009000003001
{
g_chSendPCBuf[7] = '7';//控制字 固定
}
//ALL Lenth
//g_chSendPCBuf[9] = '0';
//g_chSendPCBuf[10] = '9';//这里是 ALL Lenth
/////////////11111111111111////////////////////
//填告警 信息
j = 0;
for(i = 0; i < 8; i++)
{
if(chAlert & (1 << i))
{//要报告!
g_chSendPCBuf[14 + j] = ((intOff + i) / 100) % 10 + 48;
g_chSendPCBuf[15 + j] = ((intOff + i) / 10) % 10 + 48;
g_chSendPCBuf[16 + j] = ((intOff + i)) % 10 + 48;
j += 3;
}
}
//填告警 长度
g_chSendPCBuf[11] = '0';
g_chSendPCBuf[12] = ((j) / 10) % 10 + 48;
g_chSendPCBuf[13] = ((j)) % 10 + 48;
intLen = j;
///////////////////////////22222222222222222//////////////////
//填告警 信息
j = 0;
for(i = 0; i < 8; i++)
{
if(chCheck & (1 << i))
{//要报告!
g_chSendPCBuf[17 + j + intLen] = ((intOff + i) / 100) % 10 + 48;
g_chSendPCBuf[18 + j + intLen] = ((intOff + i) / 10) % 10 + 48;
g_chSendPCBuf[19 + j + intLen] = ((intOff + i)) % 10 + 48;
j += 3;
}
}
//填告警 长度
g_chSendPCBuf[14 + intLen] = '0';
g_chSendPCBuf[15 + intLen] = ((j) / 10) % 10 + 48;
g_chSendPCBuf[16 + intLen] = ((j)) % 10 + 48;
//总共长度
intLen = j + intLen + 6;
g_chSendPCBuf[8] = '0';
g_chSendPCBuf[9] = ((intLen) / 10) % 10 + 48;
g_chSendPCBuf[10] = ((intLen)) % 10 + 48;
//加 检查和--不能按 ASCII 码 相加
i = g_chOderID - 48;
i += intLen;//肯定是 009
for(j = 0; j < intLen; j++)
{
i = i + g_chSendPCBuf[11 + j] - 48;//已经是 ASCII 要减48
}
i %= 10000;//最大 4 位
g_chSendPCBuf[11 + intLen] = ((i / 1000) % 10) + 48;//在这里要把它转为String!
g_chSendPCBuf[12 + intLen] = ((i / 100) % 10) + 48;//在这里要把它转为String!
g_chSendPCBuf[13 + intLen] = ((i / 10) % 10) + 48;//在这里要把它转为String!
g_chSendPCBuf[14 + intLen] = (i % 10) + 48;//在这里要把它转为String!
//加 尾 *
g_chSendPCBuf[15 + intLen] = '*';
//尾巴指针
//肯定发送
g_chSendPCTail = 15 + intLen;
g_chSendPCHead = 0;
g_chSendPCBuf_Stat = 1;//马上去发吧
}
return(1);
}
unsigned char AutoInsertOneSwitchSendPCBuf(unsigned char chBit,unsigned int intOff)//2002-10-11 17:04 自动加 局号、流水号、检查和
{//报告---可以等待,
//if(chLen < SendPcBufMAX - 20)
if((g_chSendPCBuf_Stat == 2) || (g_chSendPCBuf_Stat == 3))
{//在 RS 232 方式下 等待 4 毫秒 , 在 DTMF 下 应该不可能发生该问题
return(0);//只能 采用丢掉的办法
}
{//长度肯定不会长
unsigned int i,j;
//加 头 #
g_chSendPCBuf[1] = '#';
//加 局号
for(i = 0; i < 4; i++)
{
g_chSendPCBuf[2 + i] = *(unsigned char *)(StationID_Info + i);//是ASC码
}
g_chSendPCBuf[6] = g_chOderID;
//加 信息 1009003001000 1009000003001
if(intOff > 10000)
{
intOff -= 10000;
g_chSendPCBuf[7] = '2';//控制字
}
else
{
g_chSendPCBuf[7] = '1';//控制字
}
g_chSendPCBuf[8] = '0';
g_chSendPCBuf[9] = '0';
g_chSendPCBuf[10] = '9';
if(intOff > 1000)
{//报告 恢复
intOff -= 1000;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -