久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2401|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

MSP4305438與上位機(jī)串口通信問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:112946 發(fā)表于 2016-4-14 09:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
最近在調(diào)試上位機(jī)與單片機(jī)之間通信,現(xiàn)在要在串口中加上一條,設(shè)備保存上位機(jī)發(fā)過(guò)來(lái)的測(cè)量時(shí)間,并返回給上位機(jī)一個(gè)接收信號(hào),表示收到了,但具體代碼如何實(shí)現(xiàn),卻不知道怎么寫,望各個(gè)技術(shù)大牛,指點(diǎn)一下小弟,謝謝。下面附出:串口程序
#include "includes.h"
#include "setCH2O.h"
#include "position_x_y.h"
unsigned char RX_len = 0;
unsigned char RX_buffer[26];
void (* RS_SENDstr)(char *tx_buf);
void (* RS_SENDnum)(int num);
/*MCU設(shè)備號(hào): 0xff;PC設(shè)備號(hào):  0x00*/
uchar  Recive_Data[14]={0x43,0x55,0x49,0x00,0x0e,0x00,0xff,0x01,0x00,0xaa,0xbb,0xcc,0x0a,0x00};//通信協(xié)議

/********************************串口初始化***********************************/
void Init_UART(void)
{
  P3SEL          |= BIT4 + BIT5;                            // 選擇引腳功能
  P3DIR          |= BIT4;                                   // 選擇引腳功能
  P3DIR          &= ~BIT5;
  UCA0CTL1        = UCSWRST;                                // 狀態(tài)機(jī)復(fù)位
  UCA0CTL1       |= UCSSEL_3;                               // CLK = SMCLK
  UCA0BR0         = 0x34;                                   // 500kHz/9600=52.083
  UCA0BR1         = 0x00;
  UCA0MCTL        = UCBRS_3 + UCBRF_0;                      // UCBRSx=3, UCBRFx=0
  UCA0CTL1       &= ~UCSWRST;                               // 啟動(dòng)狀態(tài)機(jī)
  UCA0IE         |= UCRXIE;                                 // 允許接收中斷
}

/******************************************************************************
* 函數(shù)名:void RS232_SENDstr(char *tx_buf)
* 功  能:UART發(fā)送一個(gè)字符串
* 參  數(shù):tx_buf--發(fā)送字符串的首地址
* 返回值:無(wú)
*******************************************************************************/
void RS232_SENDstr(char *tx_buf)
{
  unsigned char i,length;
  length = strlen(tx_buf);
  for(i=0;i<length;i++)
  {
    UCA0TXBUF = *tx_buf++;
    while (!(UCA0IFG&UCTXIFG));
  }
}
/*******************************************************************************
* 函數(shù)名:void RS232_SENDnum(int num)
* 功  能:UART發(fā)送數(shù)據(jù)
* 參  數(shù):num--發(fā)送數(shù)據(jù)的
* 返回值:無(wú)
*******************************************************************************/
void RS232_SENDnum(int num)
{
    UCA0TXBUF = num;  //如果是16位數(shù)據(jù),只發(fā)送低字節(jié)
    while (!(UCA0IFG&UCTXIFG));
}

/*********************************應(yīng)答,設(shè)備---上位機(jī)**************************/
void SendReplyOrder(uchar ord)
{
    /*uchar Send_data[14]={0x43,0x55,0x49,0x00,0x16,0xff,0x00,0x12,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    for (uchar j  = 0; j < 7; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }*/
    RS_SENDnum(0x43);
    RS_SENDnum(0x55);
    RS_SENDnum(0x49);
    RS_SENDnum(0x00);
    RS_SENDnum(0x0e);
    RS_SENDnum(0xff);
    RS_SENDnum(0x00);
    RS_SENDnum(0x12);
    RS_SENDnum(0x00);
    RS_SENDnum(ord);
    /*for (uchar j  = 10; j < 14; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }*/
    RS_SENDnum(0x00);
    RS_SENDnum(0x00);
    RS_SENDnum(0x0a);
    RS_SENDnum(0x00);
}
/************************************發(fā)送界面編號(hào)****************************************/
void SendCurnViewNum(void)
{
    //uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    //幀頭
    RS_SENDnum(0x43);
    RS_SENDnum(0x55);
    RS_SENDnum(0x49);
    //數(shù)據(jù)長(zhǎng)度
    RS_SENDnum(19/0xff);
    RS_SENDnum(19%0xff);
    //發(fā)送設(shè)備號(hào),接受設(shè)備號(hào),幀類型,操作類型
    RS_SENDnum(0xff);
    RS_SENDnum(0x00);
    RS_SENDnum(0x11);
    RS_SENDnum(0x00);
    //幀參數(shù)
    //第XX XX條記錄數(shù)據(jù)
    RS_SENDnum(0x00);
    RS_SENDnum(0x00);
    //總共XX XX條記錄數(shù)據(jù)
    RS_SENDnum(0x00);
    RS_SENDnum(0x00);
    //AB位類型
    RS_SENDnum(Read_Curn_ViewNum);
    //具體數(shù)據(jù)
    RS_SENDnum((CurView.MenuSel)%0xff);
    //幀尾
    RS_SENDnum(0x0a);
    RS_SENDnum(0x00);
}

/*********發(fā)送當(dāng)前記錄(包括PM;甲醛;溫度;濕度;測(cè)量時(shí)間),設(shè)備---上位機(jī)**********/
void SendNewestPMHumiCH2OData(uchar A1,uchar A2)
{
    long ABC;
    //幀頭
    RS_SENDnum(0x43);
    RS_SENDnum(0x55);
    RS_SENDnum(0x49);
    //數(shù)據(jù)長(zhǎng)度
    RS_SENDnum(46/0xff);
    RS_SENDnum(46%0xff);
    //發(fā)送設(shè)備號(hào),接受設(shè)備號(hào),幀類型,操作類型,AB位類型
    RS_SENDnum(0xff);
    RS_SENDnum(0x00);
    RS_SENDnum(0x11);
    RS_SENDnum(0x00);
    RS_SENDnum(0xaa);
    ABC=A1*256+A2;     //組合A1,A2為ABC
    if(ABC<=PMTotalNum)
      {
        RS_SENDnum(A1);
        RS_SENDnum(A2);
      }
    else
      {
        RS_SENDnum(0);
        RS_SENDnum(0);
      }
    //幀參數(shù)
    //PM 總共XX XX條記錄數(shù)據(jù),此處是設(shè)置歷史記錄的條數(shù)的
    //RS_SENDnum((PMTotalNum-1)/0xff);
    //RS_SENDnum((PMTotalNum-1)%0xff);
    RS_SENDnum(PMTotalNum/0xff);
    RS_SENDnum(PMTotalNum%0xff);

    //甲醛 總共XX XX條記錄數(shù)據(jù)
    // RS_SENDnum(set.CH2O_TotalNum/0xff);
    // RS_SENDnum(set.CH2O_TotalNum%0xff);
    if(ABC)
    {
        ReadFlash((ulong)(DATA_LENGTH*(DATA_ADDR + ABC)), (ulong)sizeof(struct MeasureData), (uchar *)&PMViewData);
        RS232_SENDstr((char *)LongToStr(PMViewData.pm25CleanAfter, PStr, 4));//4
        //RS232_SENDstr((char*)"1111");
        RS232_SENDstr(",");//1
        RS232_SENDstr((char *)LongToStr(PMViewData.pm10CleanAfter, PStr, 4));//4
        //RS232_SENDstr((char*)"2222");
        RS232_SENDstr(",");//1
        RS_SENDstr(" 0.00");//5
        //RS_SENDstr((char*)"33333");//5
        RS232_SENDstr(",");//1
        RS232_SENDstr(PMViewData.CleanAfterTemp);//2
        //RS232_SENDstr((char*)"44");
        RS232_SENDstr(",");//1
        RS232_SENDstr(PMViewData.CleanAfterHumi);//2
        //RS232_SENDstr((char*)"55");
        RS232_SENDstr(",");//1
        PMViewData.Date[8] = 0;
        RS232_SENDstr(PMViewData.Date);
        //RS232_SENDstr((char*)"66666666");
    }
    else
    {
        //PM2.5
        RS_SENDstr((char *)LongToStr(PL1C, PStr, 4));
        RS_SENDstr(",");//1
        //PM10
        RS_SENDstr((char *)LongToStr(PL2C, PStr, 4));
        RS_SENDstr(",");//1
        //甲醛
        RS_SENDstr((char *)FloatToStr(AdcValue0jj,PStr,2));//5
        RS_SENDstr(",");//1
        //溫度
        for(char i = 0;i < 2;i ++)    //meatemp[0]和meatemp[1]兩個(gè)值不在0-9之間就將它們?cè)O(shè)為“-”
        {
            if (meatemp0[i] < '0' || meatemp0[i] > '9')     //meatemp:測(cè)量溫度
            {
                meatemp0[0] = '-';
                meatemp0[1] = '-';
                break;
            }
        }
        RS_SENDstr((char *)meatemp0);//2
        RS_SENDstr(",");             //1
        //濕度
        for(char i = 0;i < 2;i ++)
        {
            if (meatemp[i] < '0' || meatemp[i] > '9')
            {
                meatemp[0] = '-';
                meatemp[1] = '-';
                break;
            }
        }
        RS_SENDstr((char *)meatemp);//2
        RS_SENDstr(",");         //1
        RS_SENDstr(Date);        //1
    }
    //幀尾
    RS_SENDnum(0x0a);
    RS_SENDnum(0x00);
}

/*******************************發(fā)送PM歷史記錄,設(shè)備--上位機(jī)*********************************/
void SendAllPMData(void)
{
    uchar Str[3];
    //uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    ReadFlash((ulong)(NUM_ADDR_1), (ulong)sizeof(PMTotalNum), (uchar *)&PMTotalNum);
    //幀頭
    /*for (uchar j  = 0; j < 3; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }*/
    //幀頭
    RS_SENDnum(0x43);
    RS_SENDnum(0x55);
    RS_SENDnum(0x49);
    //發(fā)送總數(shù)據(jù)長(zhǎng)度,沒有用到
    if (PMTotalNum == 1)
    {
        RS_SENDnum((14)/0xff);
        RS_SENDnum((14)%0xff);
    }
    else
    {
        RS_SENDnum((14+(PMTotalNum-1)*(1*15+2*5+4*4+2*19))/0xff);
        RS_SENDnum((14+(PMTotalNum-1)*(1*15+2*5+4*4+2*19))%0xff);
    }

    //發(fā)送設(shè)備號(hào),接受設(shè)備號(hào),幀類型,操作類型
    /*for (uchar j  = 5; j < 9; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }*/
    RS_SENDnum(0xff);
    RS_SENDnum(0x00);
    RS_SENDnum(0x11);
    RS_SENDnum(0x00);
    //幀參數(shù)
    //第XX XX條記錄數(shù)據(jù)
    RS_SENDnum((PMTotalNum-1)/0xff);
    RS_SENDnum((PMTotalNum-1)%0xff);
    //總共XX XX條記錄數(shù)據(jù)
    RS_SENDnum((PMTotalNum-1)/0xff);
    RS_SENDnum((PMTotalNum-1)%0xff);
    //AB位類型
    RS_SENDnum(Read_PMData);
    RS_SENDnum(0xff);
    RS_SENDnum(0xff);

    if (PMTotalNum > 1)
    {
        for (long i = 1; i < PMTotalNum; i++)
        {
            ReadFlash((ulong)(DATA_LENGTH*(DATA_ADDR + i)), (ulong)sizeof(struct MeasureData), (uchar *)&PMViewData);
            CoutMeasureEffic(PMViewData.pm25CleanBefor,PMViewData.pm25CleanAfter,Effic1);//計(jì)算PM2.5凈化效率
            CoutMeasureEffic(PMViewData.pm10CleanBefor,PMViewData.pm10CleanAfter,Effic2);//計(jì)算PM10凈化效率
            RS_SENDstr("P");//1  1*15+2*5+4*4+2*19
            RS_SENDstr(",");//1
            RS_SENDstr((char *)LongToStr(i, Str, 2));//2
            RS_SENDstr(",");//1
            RS_SENDstr((char *)LongToStr(PMViewData.pm25CleanBefor, PStr, 4));//4
            RS_SENDstr(",");//1
            RS_SENDstr((char *)LongToStr(PMViewData.pm25CleanAfter, PStr, 4));//4
            RS_SENDstr(",");//1
            RS_SENDstr((char *)Effic1);//5
            RS_SENDstr(",");//1
            RS_SENDstr((char *)LongToStr(PMViewData.pm10CleanBefor, PStr, 4));//4
            RS_SENDstr(",");//1
            RS_SENDstr((char *)LongToStr(PMViewData.pm10CleanAfter, PStr, 4));//4
            RS_SENDstr(",");//1
            RS_SENDstr((char *)Effic2);//5
            RS_SENDstr(",");//1
            RS_SENDstr((char *)PMViewData.CleanBeforTemp);//2
            RS_SENDstr(",");//1
            RS_SENDstr((char *)PMViewData.CleanBeforHumi);//2
            RS_SENDstr(",");//1
            RS_SENDstr((char *)PMViewData.CleanAfterTemp);//2
            RS_SENDstr(",");//1
            RS_SENDstr((char *)PMViewData.CleanAfterHumi);//2
            RS_SENDstr(",");//1
            RS_SENDstr((char *)PMViewData.CleanBeforTime);//19
            RS_SENDstr(",");//1
            RS_SENDstr((char *)PMViewData.CleanAfterTime);//19
            RS_SENDstr(",");//1
            RS_SENDstr("E");
        }
    }
    //幀尾
    /*for (uchar j  = 12; j < 14; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }*/
    RS_SENDnum(0x0a);
    RS_SENDnum(0x00);
}

/*****************************發(fā)送當(dāng)前PM記錄,設(shè)備--上位機(jī)***********************************/
void SendNewestPMData(void)
{
    uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    ReadFlash((ulong)(NUM_ADDR_1), (ulong)sizeof(PMTotalNum), (uchar *)&PMTotalNum);

    //幀頭
    for (uchar j  = 0; j < 3; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }

    //數(shù)據(jù)長(zhǎng)度
    RS_SENDnum(99/0xff);//
    RS_SENDnum(99%0xff);

    //發(fā)送設(shè)備號(hào),接受設(shè)備號(hào),幀類型,操作類型
    for (uchar j  = 5; j < 9; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }

    //幀參數(shù)
    //第XX XX條記錄數(shù)據(jù)
    RS_SENDnum((PMReviseNum-1)/0xff);
    RS_SENDnum((PMReviseNum-1)%0xff);
    //總共XX XX條記錄數(shù)據(jù)
    RS_SENDnum((PMTotalNum-1)/0xff);
    RS_SENDnum((PMTotalNum-1)%0xff);
    //AB位類型
    RS_SENDnum(Read_PMData);
    //具體數(shù)據(jù)
    ReadFlash((ulong)(DATA_LENGTH*(DATA_ADDR + PMReviseNum-1)), (ulong)sizeof(struct MeasureData), (uchar *)&PMViewData);
    CoutMeasureEffic(PMViewData.pm25CleanBefor,PMViewData.pm25CleanAfter,Effic1);
    CoutMeasureEffic(PMViewData.pm10CleanBefor,PMViewData.pm10CleanAfter,Effic2);
    RS_SENDstr((char *)LongToStr(PMViewData.pm25CleanBefor, PStr, 4));//4
    RS_SENDstr(",");//1
    RS_SENDstr((char *)LongToStr(PMViewData.pm25CleanAfter, PStr, 4));//4
    RS_SENDstr(",");//1
    RS_SENDstr((char *)Effic1);//5
    RS_SENDstr(",");//1
    RS_SENDstr((char *)LongToStr(PMViewData.pm10CleanBefor, PStr, 4));//4
    RS_SENDstr(",");//1
    RS_SENDstr((char *)LongToStr(PMViewData.pm10CleanAfter, PStr, 4));//4
    RS_SENDstr(",");//1
    RS_SENDstr((char *)Effic2);//5
    RS_SENDstr(",");//1
    RS_SENDstr((char *)PMViewData.CleanBeforTemp);//2
    RS_SENDstr(",");//1
    RS_SENDstr((char *)PMViewData.CleanBeforHumi);//2
    RS_SENDstr(",");//1
    RS_SENDstr((char *)PMViewData.CleanAfterTemp);//2
    RS_SENDstr(",");//1
    RS_SENDstr((char *)PMViewData.CleanAfterHumi);//2
    RS_SENDstr(",");//1
    RS_SENDstr((char *)PMViewData.CleanBeforTime);//19
    RS_SENDstr(",");//1
    RS_SENDstr((char *)PMViewData.CleanAfterTime);//19
    //幀尾
    for (uchar j  = 12; j < 14; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }
}

/*****************************讀取指定的任意一組PM記,設(shè)備--上位機(jī)*****************************/
void SendSomePMData(long num)     
{
    //uchar Str[3];
    uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    ReadFlash((ulong)(NUM_ADDR_1), (ulong)sizeof(PMTotalNum), (uchar *)&PMTotalNum);
    //幀頭
    for (uchar j  = 0; j < 3; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }

    //數(shù)據(jù)長(zhǎng)度
    if (num < PMTotalNum && num > 0)
    {
        RS_SENDnum(99/0xff);
        RS_SENDnum(99%0xff);
    }
    else
    {
        RS_SENDnum(16/0xff);
        RS_SENDnum(16%0xff);
    }

    //發(fā)送設(shè)備號(hào),接受設(shè)備號(hào),幀類型,操作類型
    for (uchar j  = 5; j < 9; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }

    //幀參數(shù)
    //第XX XX條記錄數(shù)據(jù)
    if (num < PMTotalNum && num > 0)
    {
        RS_SENDnum((num)/0xff);
        RS_SENDnum((num)%0xff);
    }
    else
    {
        RS_SENDnum(0xee);
        RS_SENDnum(0xee);
    }

    //總共XX XX條記錄數(shù)據(jù)
    RS_SENDnum((PMTotalNum-1)/0xff);
    RS_SENDnum((PMTotalNum-1)%0xff);

    //AB位類型
    RS_SENDnum(Read_PMData);

    if (num < PMTotalNum && num > 0)
    {
        //uchar ch = 0;
        //ReadFlash((ulong)ClnBeforFlag_ADDR, (ulong)sizeof(uchar), (uchar *)&ch);
        ReadFlash((ulong)(DATA_LENGTH*(DATA_ADDR + num)), (ulong)sizeof(struct MeasureData), (uchar *)&PMViewData);
        CoutMeasureEffic(PMViewData.pm25CleanBefor,PMViewData.pm25CleanAfter,Effic1);
        CoutMeasureEffic(PMViewData.pm10CleanBefor,PMViewData.pm10CleanAfter,Effic2);
        if (PMViewData.CleanBeforTime[0] == '\0')
        {
            RS_SENDstr("----");//4
        }
        else
        {
            RS_SENDstr((char *)LongToStr(PMViewData.pm25CleanBefor, PStr, 4));//4
        }
        RS_SENDstr(",");//1
        RS_SENDstr((char *)LongToStr(PMViewData.pm25CleanAfter, PStr, 4));    //4
        RS_SENDstr(",");//1
        RS_SENDstr((char *)Effic1);//5
        RS_SENDstr(",");//1
        if (PMViewData.CleanBeforTime[0] == '\0')
        {
            RS_SENDstr("----");//4
        }
        else
        {
            RS_SENDstr((char *)LongToStr(PMViewData.pm10CleanBefor, PStr, 4));//4
        }
        RS_SENDstr(",");//1
        RS_SENDstr((char *)LongToStr(PMViewData.pm10CleanAfter, PStr, 4));//4
        RS_SENDstr(",");//1
        RS_SENDstr((char *)Effic2);//5
        RS_SENDstr(",");//1
        if (PMViewData.CleanBeforTime[0] == '\0')
        {
            RS_SENDstr("--");//2
        }
        else
        {
            RS_SENDstr((char *)PMViewData.CleanBeforTemp);//2
        }

        RS_SENDstr(",");//1
        if (PMViewData.CleanBeforTime[0] == '\0')
        {
            RS_SENDstr("--");//2
        }
        else
        {
            RS_SENDstr((char *)PMViewData.CleanBeforHumi);//2
        }
        RS_SENDstr(",");//1
        RS_SENDstr((char *)PMViewData.CleanAfterTemp);//2
        RS_SENDstr(",");//1
        RS_SENDstr((char *)PMViewData.CleanAfterHumi);//2
        RS_SENDstr(",");//1
        if (PMViewData.CleanBeforTime[0] == '\0')
        {
            RS_SENDstr("-------------------");
        }
        else
        {
            RS_SENDstr((char *)PMViewData.CleanBeforTime);//19
        }
        RS_SENDstr(",");//1
        RS_SENDstr((char *)PMViewData.CleanAfterTime);//19
    }
    //幀尾
    for (uchar j  = 12; j < 14; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }
}

/************************************發(fā)送甲醛歷史記錄,設(shè)備----上位機(jī)******************************************/
void SendAllCH2OData(void)
{
    //uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    ReadFlash((ulong)CH2OSET_ADDR, (ulong)sizeof(set), (uchar *)&set);
    //幀頭
    /*for (uchar j  = 0; j < 3; j = j+1)
    {
        RS_SENDnum(Send_data[j]);
    }*/
    RS_SENDnum(0x43);
    RS_SENDnum(0x55);
    RS_SENDnum(0x49);

    //數(shù)據(jù)長(zhǎng)度
    if(set.CH2O_TotalNum == 0)
    {
        RS_SENDnum((14+1)/0xff);
        RS_SENDnum((14+1)%0xff);
    }
    else
    {
        RS_SENDnum((14+set.CH2O_TotalNum*(1*6+2*2+1*19))/0xff);
        RS_SENDnum((14+set.CH2O_TotalNum*(1*6+2*2+1*19))%0xff);
    }

    //發(fā)送設(shè)備號(hào),接受設(shè)備號(hào),幀類型,操作類型
    /*for (uchar j  = 5; j < 9; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }*/
    RS_SENDnum(0xff);
    RS_SENDnum(0x00);
    RS_SENDnum(0x11);
    RS_SENDnum(0x00);
    RS_SENDnum(0xaa);

    //幀參數(shù)
    //第XX XX條記錄數(shù)據(jù)
    RS_SENDnum((set.CH2O_TotalNum-1)/0xff);
    RS_SENDnum((set.CH2O_TotalNum-1)%0xff);
    //總共XX XX條記錄數(shù)據(jù)
    RS_SENDnum((set.CH2O_TotalNum-1)/0xff);
    RS_SENDnum((set.CH2O_TotalNum-1)%0xff);
    //AB位類型
    RS_SENDnum(Read_CH2OData);
    RS_SENDnum(0xff);
    RS_SENDnum(0xff);

    if(set.CH2O_TotalNum > 0)
    {
        for (long i = 0; i < set.CH2O_TotalNum; i ++)
        {
            ReadFlash((ulong)(DATA_LENGTH*(CH2ODATA_ADDR+i+1)), (ulong)sizeof(CurCH2OData), (uchar *)&CurCH2OData);
            RS_SENDstr("C");//1
            RS_SENDstr(",");//1
            RS_SENDstr((char *)LongToStr(i+1, PStr, 2));//2
            RS_SENDstr(",");//1
            RS_SENDstr((char *)FloatToStr(CurCH2OData.CH2OValue,PStr,2));//2
            RS_SENDstr(",");//1
            RS_SENDstr((char *)CurCH2OData.MeasureTime);//19
            RS_SENDstr(",");//1
            RS_SENDstr("E");//1
        }
    }

    //幀尾
    /*for (uchar j  = 12; j < 14; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }*/
    RS_SENDnum(0x0a);
    RS_SENDnum(0x00);
}

/*******************************發(fā)送當(dāng)前甲醛記錄,設(shè)備--上位機(jī)************************************/
void SendNewestCH2OData(void)
{
    uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    ReadFlash((ulong)CH2OSET_ADDR, (ulong)sizeof(set), (uchar *)&set);
    //幀頭
    for (uchar j  = 0; j < 3; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }

    //數(shù)據(jù)長(zhǎng)度
    if(set.CH2O_TotalNum == 0)
    {
        RS_SENDnum((14+1)/0xff);
        RS_SENDnum((14+1)%0xff);
    }
    else
    {
        RS_SENDnum((14+1*(1*6+2*2+1*19))/0xff);
        RS_SENDnum((14+1*(1*6+2*2+1*19))%0xff);
    }

    //發(fā)送設(shè)備號(hào),接受設(shè)備號(hào),幀類型,操作類型
    for (uchar j  = 5; j < 9; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }

    //幀參數(shù)
    //第XX XX條記錄數(shù)據(jù)
    RS_SENDnum((set.CH2O_CurrtNum-1)/0xff);
    RS_SENDnum((set.CH2O_CurrtNum-1)%0xff);
    //總共XX XX條記錄數(shù)據(jù)
    RS_SENDnum((set.CH2O_TotalNum-1)/0xff);
    RS_SENDnum((set.CH2O_TotalNum-1)%0xff);
    //AB位類型
    RS_SENDnum(Read_CH2OData);
    RS_SENDnum(0x0f);

    if(set.CH2O_TotalNum > 0)
    {
        ReadFlash((ulong)(DATA_LENGTH*(CH2ODATA_ADDR+set.CH2O_TotalNum-1+1)), (ulong)sizeof(CurCH2OData), (uchar *)&CurCH2OData);
        RS_SENDstr((char *)LongToStr(set.CH2O_TotalNum, PStr, 2));//2
        RS_SENDstr(",");//1
        RS_SENDstr((char *)FloatToStr(CurCH2OData.CH2OValue,PStr,2));//2
        RS_SENDstr(",");//1
        RS_SENDstr((char *)CurCH2OData.MeasureTime);//19
    }

    //幀尾
    for (uchar j  = 12; j < 14; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }
}

/***********************************發(fā)送指定的任意一條甲醛記錄,設(shè)備--上位機(jī)*******************************************/
void SendSomeCH2OData(long num)
{
    uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    ReadFlash((ulong)CH2OSET_ADDR, (ulong)sizeof(set), (uchar *)&set);
    //幀頭
    for (uchar j  = 0; j < 3; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }
    //數(shù)據(jù)長(zhǎng)度
    if(num <= set.CH2O_TotalNum && num > 0)
    {
        RS_SENDnum(41/0xff);
        RS_SENDnum(41%0xff);
    }
    else
    {
        RS_SENDnum(16/0xff);
        RS_SENDnum(16%0xff);
    }
    //發(fā)送設(shè)備號(hào),接受設(shè)備號(hào),幀類型,操作類型
    for (uchar j  = 5; j < 9; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }

    //幀參數(shù)
    //第XX XX條記錄數(shù)據(jù)
    if(num <= set.CH2O_TotalNum && num > 0)
    {
        RS_SENDnum(num/0xff);
        RS_SENDnum(num%0xff);
    }
    else
    {
        RS_SENDnum(0xee);
        RS_SENDnum(0xee);
    }
    //總共XX XX條記錄數(shù)據(jù)
    RS_SENDnum(set.CH2O_TotalNum/0xff);
    RS_SENDnum(set.CH2O_TotalNum%0xff);
    //AB位類型
    RS_SENDnum(Read_CH2OData);

    if(num <= set.CH2O_TotalNum && num > 0)
    {
        ReadFlash((ulong)(DATA_LENGTH*(CH2ODATA_ADDR+num)), (ulong)sizeof(CurCH2OData), (uchar *)&CurCH2OData);
        RS_SENDstr((char *)FloatToStr(CurCH2OData.CH2OValue,PStr,2));//2
        RS_SENDstr(",");//1
        RS_SENDstr((char *)CurCH2OData.MeasureTime);//19
    }
    //幀尾
    for (uchar j  = 12; j < 14; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }
}



/**********************************發(fā)送設(shè)置設(shè)置命令*********************************************/
void SendSetOrder(uchar ord, uchar bRight, uchar m_data)
{
    //
    //
    uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x12,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    for (uchar j  = 0; j < 7; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }
    RS_SENDnum(0x13);
    RS_SENDnum(0x00);

    RS_SENDnum(ord);
    RS_SENDnum(bRight);
    RS_SENDnum(m_data);

    for (uchar j  = 12; j < 14; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }
}

/***************************************發(fā)送命令***************************************/
void SendOrder()
{
    //
    //
    uchar Send_data[14]={0x43,0x55,0x49,0x00,0x15,0xff,0x00,0x12,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信協(xié)議
    for (uchar j  = 0; j < 7; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }
    RS_SENDnum(0x13);
    RS_SENDnum(0x00);
    RS_SENDnum(0x04);
    RS_SENDstr((char *)CurTime);
    for (uchar j  = 12; j < 14; j ++)
    {
        RS_SENDnum(Send_data[j]);
    }
}

/******************************************************************************/
void Recive_Command_0x01(uchar cmd)
{
    uint rdN = 0;
    switch (cmd)
    {
        case Read_PMData:

          rdN = RX_buffer[10]*0xff+RX_buffer[11];
          if (rdN > PMTotalNum-1 || rdN < 1)
          {
              return;
          }
          else
          {
              SendSomePMData(rdN); //讀取指定的某一組PM數(shù)據(jù)
          }
          break;

        case Read_CH2OData:
          {
              long num = RX_buffer[10]*0xff+RX_buffer[11];
              SendSomeCH2OData(num);//讀取指定的某一組甲醛數(shù)據(jù)
          }
          break;

        case Read_Newest_PM_HUMI_CH2OData:
          SendNewestPMHumiCH2OData(RX_buffer[10],RX_buffer[11]);
          break;

        case Read_Curn_ViewNum:
          SendCurnViewNum();
          break;

        case Delet_All_PMData:
          Delet_All_Data();
          SendSetOrder(Delet_All_PMData,true,Delet_All_PMData);
          break;

        case Delet_Some_PMData:
          if ( Delet_Some_Data( RX_buffer[10]*0xff+RX_buffer[11] ) )
          {
              SendSetOrder(Delet_Some_PMData,true,Delet_Some_PMData);
          }
          else
          {
              SendSetOrder(Delet_Some_PMData,false,Delet_Some_PMData);
          }
          break;

        default:
          break;
    }
}

/******************************************************************************/
void Recive_Command_0x02(uchar cmd)
{
    switch (cmd)
    {
        case Enter_PMView:
        case Exit_CurnView:
        case Start_Measure:
          if (bMeasure == STOP) //在PM界面才響應(yīng)
          {
              TPpos[0] = 86+1;
              TPpos[1] = 420+1;
          }
          //SendReplyOrder(RUNNING);
          break;

        case Stop_Measure:
          if (bMeasure == RUNNING)
          {
              TPpos[0] = 86+1;
              TPpos[1] = 420+1;
          }
          //SendReplyOrder(STOP);
          break;
       case  0x07:
          if(bMeasure)
          {
            SendReplyOrder(0x02);
          }
          else
          {
            SendReplyOrder(0x03);
          }
          break;
       default:
          break;

    }
}

/******************************************************************************/
void Recive_Command_0x03(uchar cmd)
{
    switch (cmd)
    {
      //0x14 - 20
      //0x28 - 40
      //0x3C - 60
      //43 55 49 00 0e 00 ff 03 00 01 00 28 0a 00  //設(shè)置測(cè)量時(shí)間
      //43 55 49 00 0e 00 ff 03 00 02 00 00 0a 00  //讀取測(cè)量時(shí)間
        case Set_MeasureTime:  //設(shè)置測(cè)量時(shí)間
        {
            switch (RX_buffer[11])
            {
                case MEASURETIME_20S:
                case MEASURETIME_40S:
                case MEASURETIME_60S:
                {
                    MySysSet.SetTimer = RX_buffer[11];
                    SAMPTIMER = RX_buffer[11];
                }
                break;
                default:
                {
                    SendSetOrder(Set_MeasureTime,false,RX_buffer[11]);
                    return;
                }
            }
            FlashEraseSector((ulong)(SYSSET_ADDR));
            FlashWriteBuffer((ulong)(SYSSET_ADDR), (uchar *)&MySysSet, (ulong)sizeof(struct SysSetConfig));
            SendSetOrder(Set_MeasureTime,true,SAMPTIMER);
        }
        break;

        case Read_MeasureTime:  //讀取測(cè)量時(shí)間
        {
            SendSetOrder(Set_MeasureTime,true,MySysSet.SetTimer);
        }
        break;

        case Set_DS1302Time:   //設(shè)置DS1302時(shí)間
        {
           // Ds1302Date *pdsDate = (Ds1302Date *)&RX_buffer[10];
           // BurstWrite1302( (uchar *)pdsDate );
          //  SendSetOrder(Set_DS1302Time,true,Set_DS1302Time);
          for(uchar i=0;i<9;i++)
          {
             Date[i]= RX_buffer[10+i];
          }
                  RX_buffer[5]=0xff;
                  RX_buffer[6]=0x00;
                  RX_buffer[7]=0x13;
            for(uchar i=0;i<22;i++)
            {
                  RS_SENDnum(RX_buffer[i]);
            }
        }
        break;

        case Read_DS1302Time:  //讀取DS1302時(shí)間
        {
            SendOrder();

        }
        break;

        case Set_ServerIP:   //設(shè)置服務(wù)器IP地址
        {
            sprintf ( SerIP.IPadr, "%d.%d.%d.%d", RX_buffer[10], RX_buffer[11], RX_buffer[12],RX_buffer[13] );
            SerIP.bIP = SaveFlag;
            Flash_EseSct_WrtBfer((unsigned long)(SERVER_IP_ADDR), (uchar *)&SerIP, (ulong)sizeof( SerIP ));

            SendSetOrder(Set_ServerIP,true,Set_ServerIP);
        }
        break;

        case Read_ServerIP:  //讀取服務(wù)器IP地址
        {
        }
        break;
        default:break;
    }
}

/***********************************串口接收數(shù)據(jù)*******************************************/
void Uart_Recive_Data( uchar Rxbuf , fSendStr fstr , fSendNum fNum )
{
    RS_SENDstr = fstr;
    RS_SENDnum = fNum;
    RX_buffer[RX_len] = Rxbuf;
    if (RX_len < 3)
    {
        if (RX_buffer[RX_len] != Recive_Data[RX_len])
        {
            RX_len = 0;
            return;
        }
    }
    RX_buffer[ ++ RX_len] = '\0';
    if ( RX_len == (RX_buffer[3]*10 + RX_buffer[4]) )
    {
        if ( (RX_buffer[RX_len-2] == 0x0a) && (RX_buffer[RX_len-1] == 0x00) )
        {   //43 55 49 00 0e 00 ff 01 00 aa bb cc 0a 00
            switch (RX_buffer[7]) //區(qū)分幀類型
            {
              case Cmd_bit7_ReadData://0x01 命令幀—讀取數(shù)據(jù)和刪除數(shù)據(jù)
                Recive_Command_0x01(RX_buffer[9]);
                break;
              case Cmd_bit7_Control://0x02 命令幀—控制操作
                Recive_Command_0x02(RX_buffer[9]);
                break;
              case Cmd_bit7_Setting://0x03 命令幀—設(shè)置參數(shù)
                Recive_Command_0x03(RX_buffer[9]);
                break;
              default:
                break;
            }
            RX_len = 0;
        }
    }
    else if ( RX_len > 25 )
    {
        RX_buffer[RX_len = 0] = '\0';
        //RX_len = 0;
    }
}

/******************************************************************************
* 函數(shù)名:__interrupt void USCI_A0_ISR(void)
* 功  能:UART中斷函數(shù)
*         讀出 PC 機(jī)傳輸過(guò)來(lái)的數(shù)據(jù)并向PC機(jī)發(fā)送數(shù)據(jù)
* 參  數(shù):無(wú)
* 返回值:無(wú)
******************************************************************************/
#ifdef UPPER_MONITOR
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
    _DINT();
    switch(__even_in_range(UCA0IV,4))
    {
        case 2:   // Vector 2 - RXIFG
            Uart_Recive_Data( UCA0RXBUF , RS232_SENDstr , RS232_SENDnum );
        break;

       default:
          break;
    }
    _EINT();
}
#endif







//*****************************偽代碼表達(dá)原理*********************************//
void Recv(char* pData)
{
    // 判斷接收到的數(shù)據(jù)是否為我發(fā)給你的時(shí)間命令
    if (pData == "43 55 49 00 16 00 FF 03 00 00 00 00 XX XX XX XX XX XX XX XX 0A 00")
    {
        // 將時(shí)間傳遞給保存歷史記錄的函數(shù),對(duì)歷史記錄進(jìn)行保存
        SaveRecord(XX XX XX XX XX XX XX XX);  
        // 再將收到的內(nèi)容改動(dòng)一個(gè)字節(jié)發(fā)給我即可
        pData[5] = 0xFF;
        pData[6] = 0x00;
        pData[7] = 0x13;
        RS232Send(pData);
    }
}
//****************************************************************************//

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91.com在线观看 | 伊人爽 | 国产精品色综合 | 色.com| 在线观看视频亚洲 | 日韩成年人视频在线 | 手机在线观看 | 亚洲一区二区日韩 | 久久精品综合网 | av在线天堂网| av中文字幕在线 | 欧美一区二区三区在线免费观看 | 成人影视网址 | 91最新在线视频 | av网站免费看 | 波霸ol一区二区 | 日韩精品一区二区三区中文在线 | av片免费 | 色综合久久久久 | 日韩中文字幕在线视频 | 欧美视频网| 成人亚洲精品久久久久软件 | 成人看片在线观看 | 国产精品观看 | .国产精品成人自产拍在线观看6 | 日韩精品专区在线影院重磅 | 欧美日韩在线一区二区三区 | 国产精品久久9 | 日日想夜夜操 | 国产精品片| 亚洲黄色在线免费观看 | 国产一级视频在线播放 | 欧美亚洲国产一区 | 蜜桃免费av | 欧美a√| 韩国久久精品 | 一区观看 | 日韩欧美精品一区 | 欧美9999 | 日本国产精品视频 | 日本a视频 |