最近在调试上位机与单片机之间通信,现在要在串口中加上一条,设备保存上位机发过来的测量时间,并返回给上位机一个接收信号,表示收到了,但具体代码如何实现,却不知道怎么写,望各个技术大牛,指点一下小弟,谢谢。下面附出:串口程序
#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设备号: 0xff;PC设备号: 0x00*/
uchar Recive_Data[14]={0x43,0x55,0x49,0x00,0x0e,0x00,0xff,0x01,0x00,0xaa,0xbb,0xcc,0x0a,0x00};//通信协议
/********************************串口初始化***********************************/
void Init_UART(void)
{
P3SEL |= BIT4 + BIT5; // 选择引脚功能
P3DIR |= BIT4; // 选择引脚功能
P3DIR &= ~BIT5;
UCA0CTL1 = UCSWRST; // 状态机复位
UCA0CTL1 |= UCSSEL_3; // CLK = SMCLK
UCA0BR0 = 0x34; // 500kHz/9600=52.083
UCA0BR1 = 0x00;
UCA0MCTL = UCBRS_3 + UCBRF_0; // UCBRSx=3, UCBRFx=0
UCA0CTL1 &= ~UCSWRST; // 启动状态机
UCA0IE |= UCRXIE; // 允许接收中断
}
/******************************************************************************
* 函数名:void RS232_SENDstr(char *tx_buf)
* 功 能:UART发送一个字符串
* 参 数:tx_buf--发送字符串的首地址
* 返回值:无
*******************************************************************************/
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));
}
}
/*******************************************************************************
* 函数名:void RS232_SENDnum(int num)
* 功 能:UART发送数据
* 参 数:num--发送数据的
* 返回值:无
*******************************************************************************/
void RS232_SENDnum(int num)
{
UCA0TXBUF = num; //如果是16位数据,只发送低字节
while (!(UCA0IFG&UCTXIFG));
}
/*********************************应答,设备---上位机**************************/
void SendReplyOrder(uchar ord)
{
/*uchar Send_data[14]={0x43,0x55,0x49,0x00,0x16,0xff,0x00,0x12,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信协议
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);
}
/************************************发送界面编号****************************************/
void SendCurnViewNum(void)
{
//uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信协议
//帧头
RS_SENDnum(0x43);
RS_SENDnum(0x55);
RS_SENDnum(0x49);
//数据长度
RS_SENDnum(19/0xff);
RS_SENDnum(19%0xff);
//发送设备号,接受设备号,帧类型,操作类型
RS_SENDnum(0xff);
RS_SENDnum(0x00);
RS_SENDnum(0x11);
RS_SENDnum(0x00);
//帧参数
//第XX XX条记录数据
RS_SENDnum(0x00);
RS_SENDnum(0x00);
//总共XX XX条记录数据
RS_SENDnum(0x00);
RS_SENDnum(0x00);
//AB位类型
RS_SENDnum(Read_Curn_ViewNum);
//具体数据
RS_SENDnum((CurView.MenuSel)%0xff);
//帧尾
RS_SENDnum(0x0a);
RS_SENDnum(0x00);
}
/*********发送当前记录(包括PM;甲醛;温度;湿度;测量时间),设备---上位机**********/
void SendNewestPMHumiCH2OData(uchar A1,uchar A2)
{
long ABC;
//帧头
RS_SENDnum(0x43);
RS_SENDnum(0x55);
RS_SENDnum(0x49);
//数据长度
RS_SENDnum(46/0xff);
RS_SENDnum(46%0xff);
//发送设备号,接受设备号,帧类型,操作类型,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);
}
//帧参数
//PM 总共XX XX条记录数据,此处是设置历史记录的条数的
//RS_SENDnum((PMTotalNum-1)/0xff);
//RS_SENDnum((PMTotalNum-1)%0xff);
RS_SENDnum(PMTotalNum/0xff);
RS_SENDnum(PMTotalNum%0xff);
//甲醛 总共XX XX条记录数据
// 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]两个值不在0-9之间就将它们设为“-”
{
if (meatemp0[i] < '0' || meatemp0[i] > '9') //meatemp:测量温度
{
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);
}
/*******************************发送PM历史记录,设备--上位机*********************************/
void SendAllPMData(void)
{
uchar Str[3];
//uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信协议
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);
//发送总数据长度,没有用到
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);
}
//发送设备号,接受设备号,帧类型,操作类型
/*for (uchar j = 5; j < 9; j ++)
{
RS_SENDnum(Send_data[j]);
}*/
RS_SENDnum(0xff);
RS_SENDnum(0x00);
RS_SENDnum(0x11);
RS_SENDnum(0x00);
//帧参数
//第XX XX条记录数据
RS_SENDnum((PMTotalNum-1)/0xff);
RS_SENDnum((PMTotalNum-1)%0xff);
//总共XX XX条记录数据
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);//计算PM2.5净化效率
CoutMeasureEffic(PMViewData.pm10CleanBefor,PMViewData.pm10CleanAfter,Effic2);//计算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);
}
/*****************************发送当前PM记录,设备--上位机***********************************/
void SendNewestPMData(void)
{
uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信协议
ReadFlash((ulong)(NUM_ADDR_1), (ulong)sizeof(PMTotalNum), (uchar *)&PMTotalNum);
//帧头
for (uchar j = 0; j < 3; j ++)
{
RS_SENDnum(Send_data[j]);
}
//数据长度
RS_SENDnum(99/0xff);//
RS_SENDnum(99%0xff);
//发送设备号,接受设备号,帧类型,操作类型
for (uchar j = 5; j < 9; j ++)
{
RS_SENDnum(Send_data[j]);
}
//帧参数
//第XX XX条记录数据
RS_SENDnum((PMReviseNum-1)/0xff);
RS_SENDnum((PMReviseNum-1)%0xff);
//总共XX XX条记录数据
RS_SENDnum((PMTotalNum-1)/0xff);
RS_SENDnum((PMTotalNum-1)%0xff);
//AB位类型
RS_SENDnum(Read_PMData);
//具体数据
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记,设备--上位机*****************************/
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};//通信协议
ReadFlash((ulong)(NUM_ADDR_1), (ulong)sizeof(PMTotalNum), (uchar *)&PMTotalNum);
//帧头
for (uchar j = 0; j < 3; j ++)
{
RS_SENDnum(Send_data[j]);
}
//数据长度
if (num < PMTotalNum && num > 0)
{
RS_SENDnum(99/0xff);
RS_SENDnum(99%0xff);
}
else
{
RS_SENDnum(16/0xff);
RS_SENDnum(16%0xff);
}
//发送设备号,接受设备号,帧类型,操作类型
for (uchar j = 5; j < 9; j ++)
{
RS_SENDnum(Send_data[j]);
}
//帧参数
//第XX XX条记录数据
if (num < PMTotalNum && num > 0)
{
RS_SENDnum((num)/0xff);
RS_SENDnum((num)%0xff);
}
else
{
RS_SENDnum(0xee);
RS_SENDnum(0xee);
}
//总共XX XX条记录数据
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]);
}
}
/************************************发送甲醛历史记录,设备----上位机******************************************/
void SendAllCH2OData(void)
{
//uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信协议
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);
//数据长度
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);
}
//发送设备号,接受设备号,帧类型,操作类型
/*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);
//帧参数
//第XX XX条记录数据
RS_SENDnum((set.CH2O_TotalNum-1)/0xff);
RS_SENDnum((set.CH2O_TotalNum-1)%0xff);
//总共XX XX条记录数据
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);
}
/*******************************发送当前甲醛记录,设备--上位机************************************/
void SendNewestCH2OData(void)
{
uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信协议
ReadFlash((ulong)CH2OSET_ADDR, (ulong)sizeof(set), (uchar *)&set);
//帧头
for (uchar j = 0; j < 3; j ++)
{
RS_SENDnum(Send_data[j]);
}
//数据长度
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);
}
//发送设备号,接受设备号,帧类型,操作类型
for (uchar j = 5; j < 9; j ++)
{
RS_SENDnum(Send_data[j]);
}
//帧参数
//第XX XX条记录数据
RS_SENDnum((set.CH2O_CurrtNum-1)/0xff);
RS_SENDnum((set.CH2O_CurrtNum-1)%0xff);
//总共XX XX条记录数据
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]);
}
}
/***********************************发送指定的任意一条甲醛记录,设备--上位机*******************************************/
void SendSomeCH2OData(long num)
{
uchar Send_data[14]={0x43,0x55,0x49,0x00,0x0e,0xff,0x00,0x11,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信协议
ReadFlash((ulong)CH2OSET_ADDR, (ulong)sizeof(set), (uchar *)&set);
//帧头
for (uchar j = 0; j < 3; j ++)
{
RS_SENDnum(Send_data[j]);
}
//数据长度
if(num <= set.CH2O_TotalNum && num > 0)
{
RS_SENDnum(41/0xff);
RS_SENDnum(41%0xff);
}
else
{
RS_SENDnum(16/0xff);
RS_SENDnum(16%0xff);
}
//发送设备号,接受设备号,帧类型,操作类型
for (uchar j = 5; j < 9; j ++)
{
RS_SENDnum(Send_data[j]);
}
//帧参数
//第XX XX条记录数据
if(num <= set.CH2O_TotalNum && num > 0)
{
RS_SENDnum(num/0xff);
RS_SENDnum(num%0xff);
}
else
{
RS_SENDnum(0xee);
RS_SENDnum(0xee);
}
//总共XX XX条记录数据
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]);
}
}
/**********************************发送设置设置命令*********************************************/
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};//通信协议
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]);
}
}
/***************************************发送命令***************************************/
void SendOrder()
{
//
//
uchar Send_data[14]={0x43,0x55,0x49,0x00,0x15,0xff,0x00,0x12,0x00,0xaa,0x00,0x00,0x0a,0x00};//通信协议
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数据
}
break;
case Read_CH2OData:
{
long num = RX_buffer[10]*0xff+RX_buffer[11];
SendSomeCH2OData(num);//读取指定的某一组甲醛数据
}
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界面才响应
{
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 //设置测量时间
//43 55 49 00 0e 00 ff 03 00 02 00 00 0a 00 //读取测量时间
case Set_MeasureTime: //设置测量时间
{
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: //读取测量时间
{
SendSetOrder(Set_MeasureTime,true,MySysSet.SetTimer);
}
break;
case Set_DS1302Time: //设置DS1302时间
{
// 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时间
{
SendOrder();
}
break;
case Set_ServerIP: //设置服务器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: //读取服务器IP地址
{
}
break;
default:break;
}
}
/***********************************串口接收数据*******************************************/
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]) //区分帧类型
{
case Cmd_bit7_ReadData://0x01 命令帧—读取数据和删除数据
Recive_Command_0x01(RX_buffer[9]);
break;
case Cmd_bit7_Control://0x02 命令帧—控制操作
Recive_Command_0x02(RX_buffer[9]);
break;
case Cmd_bit7_Setting://0x03 命令帧—设置参数
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;
}
}
/******************************************************************************
* 函数名:__interrupt void USCI_A0_ISR(void)
* 功 能:UART中断函数
* 读出 PC 机传输过来的数据并向PC机发送数据
* 参 数:无
* 返回值:无
******************************************************************************/
#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
//*****************************伪代码表达原理*********************************//
void Recv(char* pData)
{
// 判断接收到的数据是否为我发给你的时间命令
if (pData == "43 55 49 00 16 00 FF 03 00 00 00 00 XX XX XX XX XX XX XX XX 0A 00")
{
// 将时间传递给保存历史记录的函数,对历史记录进行保存
SaveRecord(XX XX XX XX XX XX XX XX);
// 再将收到的内容改动一个字节发给我即可
pData[5] = 0xFF;
pData[6] = 0x00;
pData[7] = 0x13;
RS232Send(pData);
}
}
//****************************************************************************//
|