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

📄 commpc.c

📁 单片机和PC机通讯的调试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
//********************** 使用 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 + -