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

📄 commpc.c

📁 单片机和PC机通讯的调试代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        i = 0;
        for(j = 4; j < 18; j++)
        {
            i = i + g_chSendPCBuf[j] - 48;//要减48
        }
        i %= 1000;//最大 4 位
        g_chSendPCBuf[18] = ((i / 100) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[19] = ((i / 10) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[20] = (i % 10) + 48;//在这里要把它转为String!
        //加 尾 *
        g_chSendPCBuf[21] = '*';
        //尾巴指针
        //肯定发送
        g_chSendPCTail = 1;
        g_chSendPCHead = 0;
        g_chSendPCBuf_Stat = 1;//马上去发吧
    }
    return(1);
}
unsigned char AutoEnvSevenInsertSendPCBufNighteen(unsigned char * pData,unsigned char chClass)//2002-10-11 17:04  自动加 局号、流水号、检查和
{//报告---可以等待,
    if((g_chSendPCBuf_Stat == 2) || (g_chSendPCBuf_Stat == 3))
    {//在 RS 232 方式下 等待 4 毫秒 , 在 DTMF 下 应该不可能发生该问题
        return(0);//只能 采用丢掉的办法
    }
    //if(4 < SendPcBufMAX - 20)
    {
        unsigned int i,j;
        //加 头 #
        g_chSendPCBuf[1] = '#';
         //加 头 CC
        g_chSendPCBuf[2] = 'C';
        g_chSendPCBuf[3] = 'C';
        //加 局号
        for(i = 0; i < 4; i++)
        {
            g_chSendPCBuf[4 + i] = *(unsigned char *)(StationID_Info + i);//是ASC码
        }
        //加 流水号
        g_chSendPCBuf[8] = g_chOderID;
        //加 事件类别  告警盘数据上传 07
        g_chSendPCBuf[9] = '0';
        g_chSendPCBuf[10] = '7';
        //加 监测通道  001---使用 g_chPushBit0to7
        g_chSendPCBuf[11] = '0';
        g_chSendPCBuf[12] = '0';
        g_chSendPCBuf[13] = '1';//
        //加 类型 chClass 10 工频数据
        g_chSendPCBuf[14] = (chClass / 10) % 10 + 48;
        g_chSendPCBuf[15] = (chClass % 10) + 48;
        
        //加 信息  消息的状态字(19位)
        for(i = 0; i < 19; i++)
        {
            g_chSendPCBuf[16 + i] = *(pData + i) + 48;
        }
        //加 检查和--不能按 ASCII 码 相加 4-----25
        i = 0;
        for(j = 4; j < 35; j++)
        {
            i = i + g_chSendPCBuf[j] - 48;//要减48
        }
        i %= 1000;//最大 4 位
        g_chSendPCBuf[35] = ((i / 100) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[36] = ((i / 10) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[37] = (i % 10) + 48;//在这里要把它转为String!
        //加 尾 *
        g_chSendPCBuf[38] = '*';
        //尾巴指针
        //肯定发送
        g_chSendPCTail = 38;
        g_chSendPCHead = 0;
        g_chSendPCBuf_Stat = 1;//马上去发吧
    }
    return(1);
}
unsigned char AutoEnvSevenInsertSendPCBufFourty(unsigned char * pData,unsigned char chGPID)//2002-10-11 17:04  自动加 局号、流水号、检查和
{//报告---可以等待,
    if((g_chSendPCBuf_Stat == 2) || (g_chSendPCBuf_Stat == 3))
    {//在 RS 232 方式下 等待 4 毫秒 , 在 DTMF 下 应该不可能发生该问题
        return(0);//只能 采用丢掉的办法
    }
    //if(4 < SendPcBufMAX - 20)
    {
        unsigned int i,j;
        //加 头 #
        g_chSendPCBuf[1] = '#';
         //加 头 CC
        g_chSendPCBuf[2] = 'C';
        g_chSendPCBuf[3] = 'C';
        //加 局号
        for(i = 0; i < 4; i++)
        {
            g_chSendPCBuf[4 + i] = *(unsigned char *)(StationID_Info + i);//是ASC码
        }
        //加 流水号
        g_chSendPCBuf[8] = g_chOderID;
        //加 事件类别  告警盘数据上传 07
        g_chSendPCBuf[9] = '0';
        g_chSendPCBuf[10] = '7';
        //加 监测通道  001---使用 g_chPushBit0to7
        g_chSendPCBuf[11] = '0';
        g_chSendPCBuf[12] = '0';
        g_chSendPCBuf[13] = (chGPID % 10) + 48;//
        //加 类型 chClass 09 工频参数数据
        g_chSendPCBuf[14] = '0';
        g_chSendPCBuf[15] = '9';
        
        //加 信息  消息的状态字(19位)
        for(i = 0; i < 44; i++)
        {
            g_chSendPCBuf[16 + i] = *(pData + i);
        }
        //加 检查和--不能按 ASCII 码 相加 4-----25
        i = 0;
        for(j = 4; j < 35; j++)
        {
            i = i + g_chSendPCBuf[j] - 48;//要减48
        }
        i %= 1000;//最大 4 位
        g_chSendPCBuf[60] = ((i / 100) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[61] = ((i / 10) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[62] = (i % 10) + 48;//在这里要把它转为String!
        //加 尾 *
        g_chSendPCBuf[63] = '*';
        //尾巴指针
        //肯定发送
        g_chSendPCTail = 63;
        g_chSendPCHead = 0;
        g_chSendPCBuf_Stat = 1;//马上去发吧
    }
    return(1);
}
unsigned char AutoEnvSevenInsertSendPCBufError(void)//2002-10-11 17:04  自动加 局号、流水号、检查和
{//报告---可以等待,
    if((g_chSendPCBuf_Stat == 2) || (g_chSendPCBuf_Stat == 3))
    {//在 RS 232 方式下 等待 4 毫秒 , 在 DTMF 下 应该不可能发生该问题
        return(0);//只能 采用丢掉的办法
    }
    //if(4 < SendPcBufMAX - 20)
    {
        unsigned int i,j;
        //加 头 #
        g_chSendPCBuf[1] = '#';
         //加 头 CC
        g_chSendPCBuf[2] = 'C';
        g_chSendPCBuf[3] = 'C';
        //加 局号
        for(i = 0; i < 4; i++)
        {
            g_chSendPCBuf[4 + i] = *(unsigned char *)(StationID_Info + i);//是ASC码
        }
        //加 流水号
        g_chSendPCBuf[8] = g_chOderID;
        //加 事件类别  告警盘数据上传 07
        g_chSendPCBuf[9] = '9';
        g_chSendPCBuf[10] = '9';
        for(j = 0; j < 7; j++)
        {
            g_chSendPCBuf[11 + j] = g_chReceivePCBuf[11 + j];
        }
        //加 检查和--不能按 ASCII 码 相加 4-----36
        i = 0;
        for(j = 4; j < 18; j++)
        {
            i = i + g_chSendPCBuf[j] - 48;//要减48
        }
        i %= 1000;//最大 4 位
        g_chSendPCBuf[18] = ((i / 100) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[19] = ((i / 10) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[20] = (i % 10) + 48;//在这里要把它转为String!
        //加 尾 *
        g_chSendPCBuf[21] = '*';
        //尾巴指针
        //肯定发送
        g_chSendPCTail = 21;
        g_chSendPCHead = 0;
        g_chSendPCBuf_Stat = 1;//马上去发吧
    }
    return(1);
}
unsigned char AutoEnvFiveInsertSendPCBuf(unsigned char *pData,unsigned char chClass)//2002-10-11 17:04  自动加 局号、流水号、检查和
{//报告---可以等待,
    if((g_chSendPCBuf_Stat == 2) || (g_chSendPCBuf_Stat == 3))
    {//在 RS 232 方式下 等待 4 毫秒 , 在 DTMF 下 应该不可能发生该问题
        return(0);//只能 采用丢掉的办法
    }
    //if(4 < SendPcBufMAX - 20)
    {
        unsigned int i,j;
        //加 头 #
        g_chSendPCBuf[1] = '#';
         //加 头 CC
        g_chSendPCBuf[2] = 'C';
        g_chSendPCBuf[3] = 'C';
        //加 局号
        for(i = 0; i < 4; i++)
        {
            g_chSendPCBuf[4 + i] = *(unsigned char *)(StationID_Info + i);//是ASC码
        }
        //加 流水号
        g_chSendPCBuf[8] = g_chOderID;
        //加 事件类别  告警盘主动上传 05
        g_chSendPCBuf[9] = '0';
        g_chSendPCBuf[10] = '5';
        //加 监测通道  001
        g_chSendPCBuf[11] = '0';
        g_chSendPCBuf[12] = '0';
        g_chSendPCBuf[13] = '1';
        //加 类型 chClass 01=门禁状态,03=直流,,05=温度  12 可燃性气体
        g_chSendPCBuf[14] = (chClass / 10) % 10 + 48;
        g_chSendPCBuf[15] = (chClass % 10) + 48;
        //加 时间  (格式:YYYYMMDDHHmmSS,14位)  g_chYear
        g_chSendPCBuf[16] = '2';
        g_chSendPCBuf[17] = '0';
        g_chSendPCBuf[18] = (g_chYear / 10) % 10 + 48;
        g_chSendPCBuf[19] = (g_chYear % 10) + 48;
        g_chSendPCBuf[20] = (g_chMonth / 10) % 10 + 48;
        g_chSendPCBuf[21] = (g_chMonth % 10) + 48;
        g_chSendPCBuf[22] = (g_chDay / 10) % 10 + 48;
        g_chSendPCBuf[23] = (g_chDay % 10) + 48;
        g_chSendPCBuf[24] = (g_chHour / 10) % 10 + 48;
        g_chSendPCBuf[25] = (g_chHour % 10) + 48;
        g_chSendPCBuf[26] = (g_chMinute / 10) % 10 + 48;
        g_chSendPCBuf[27] = (g_chMinute % 10) + 48;
        g_chSendPCBuf[28] = '4';
        g_chSendPCBuf[29] = '4';
        //加 信息  消息的状态字(7位)
        for(i = 0; i < 7; i++)
        {
            g_chSendPCBuf[30 + i] = *(pData + i) + 48;//表明信息不是ASC码
        }
        //加 检查和--不能按 ASCII 码 相加 4-----36
        i = 0;
        for(j = 4; j < 36; j++)
        {
            i = i + g_chSendPCBuf[j] - 48;//要减48
        }
        i %= 1000;//最大 4 位
        g_chSendPCBuf[37] = ((i / 100) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[38] = ((i / 10) % 10) + 48;//在这里要把它转为String!
        g_chSendPCBuf[39] = (i % 10) + 48;//在这里要把它转为String!
        //加 尾 *
        g_chSendPCBuf[40] = '*';
        //尾巴指针
        //肯定发送
        g_chSendPCTail = 40;
        g_chSendPCHead = 0;
        g_chSendPCBuf_Stat = 1;//马上去发吧
    }
    return(1);
}
/**************************************
*功能: 处理接收缓冲区里的信息 从 PC 机来   
*参数:  
*返回: 
*备注: 实时运行
**************************************/
void ReceivePCBuf(void)
{
    switch(g_chReceivePCBuf_Stat)
    {
        //0---用来清理 计数器,唯一例外的是 DEBUG_STAT
        case 0:
            g_chReceivePCBuf_Stat = 1;
            g_chReceivePCBuf_1s = 0;
            g_chReceivePCTail = 0;
            g_chReceivePCHead = 0;
        break;
        case 1://有信息
            if(g_chReceivePCTail > 0)
            {//收到了头!
                g_chReceivePCBuf_Stat = 2;
                g_chReceivePCBuf_1s = 0;
                if(g_intMark & RS232PhysicsReceiveWorkToPCBuf_Mark)
                {//RS232 在这里控制,DTMF要能够体现单个码的状态!
                    P2OUT &= ~Receive_LED;
                }
            }
            //没有东西!
            //控制 我要主动发!---另外在收到 测试 命令后 会  有切换----------------no----
            if(g_intMark & RS232DTMFSendPC_Mark)
            {//使用DTMF通信
                //已经确认,在 BuildDTMF() 中 已经有处理了!
                //会判断是否有东西要发,并且会主动去建立。。。清发送缓冲区及清主动发送
            }
            else
            {//使用RS232通信
                // 10 秒里没有 收到信息,必须转为主动发,与5秒超时重发没有冲突
                if(g_chReceivePCBuf_1s > ReceivePCBuf_1sIPushMax)
                {//10 秒还没有收到东西,(不可能在发送东西)---从被动发,到 10 秒没有收到东西,肯定可以转到主动发
                    g_chReceivePCBuf_1s = 0;
                    if(g_intMark & ICanPush_Mark)
                    {
                        //
                    }
                    else
                    {//无条件 要重新开始主动发
                        g_intMark |= ICanPush_Mark;
                        g_chMainPushReport_Stat = 0;//DEFAULT 中会有相关清理
                    }
                }
            }
        break;
        case 2://找尾巴,要超时处理,DTMF放置在BuildDtmf()的 case 4 中 5 秒后挂
            //这样后,不需要考虑 ##1#,###3434552346*吧
            if(g_chReceivePCTail > 2)//0 1 2 3 至少有三个,才算正常
            {//收到了尾巴!
                if(g_chReceivePCBuf[g_chReceivePCTail] == '#' || g_chReceivePCBuf[g_chReceivePCTail] == '*')
                {//------------------还要判断 ##xxx  但 #2##453535#----no---------- 
                    g_chReceivePCBuf_Stat = 3;
                }
            }
            //在这里 必须要有  超时处理!
            if(g_intMark & RS232DTMFSendPC_Mark)
            {//使用DTMF通信
                //已经确认,在 BuildDTMF() 中 已经有超时处理了!
                //这里也要加强处理,60 CHAR 不会 》 1 分钟!
                if(g_chReceivePCBuf_1s > 60)
                {//60 秒还没有收到 尾巴,

⌨️ 快捷键说明

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