最近在調(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);
}
}
//****************************************************************************//
|