📄 protocol.c~
字号:
#include <mega128.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "18B20.h"
#include "typedef.h"
#include "app.h"
#include "attention.h"
#include "g20modem.h"
#include "g20serialdrv.h"
#include "rtc.h"
#include "serialdrv.h"
#include "timer.h"
#include "UDP.h"
#include "protocol.h"
#include "data.h"
#include "ADC.h"
#pragma warn-
eeprom unsigned int MY_ID;
eeprom unsigned char MobilePhone1[12];
eeprom unsigned char MobilePhone2[12];
eeprom unsigned char MobilePhone3[12];
#pragma warn+
#define move_zrzo 11059 //12464 7372.8*1.5=11059.2
unsigned char my_id_arr[2];
BYTE PROTOCOL_TEMP[64];
BYTE PROTOCOL_POINTER;
BYTE nPacketLength;
unsigned int nSync;
bit bMobilePhone = FALSE;
bit bAlarmValue = FALSE;
bit bAlarmData = FALSE;
void SerialPortWrite(BYTE *pBuf, int nLength)
{
while(nLength -- > 0)
{
wdr();
sp_rcv_proc(*pBuf++);
timer_set_sp();
}
}
void initial_protocol(void)
{
PROTOCOL_POINTER = 0;
myid_no(NAME_NO);
}
void ProtocolProc()
{
unsigned int nLoop;
unsigned int nTempLoop;
BYTE CheckSum;
nLoop = 0;
while(udp_sp_not_empty())
{
PROTOCOL_TEMP[PROTOCOL_POINTER] = udp_sp_getchar();
if(PROTOCOL_POINTER >= nSync + 2)
{
nPacketLength = ((unsigned int )PROTOCOL_TEMP[nSync + 2]) + 4;
if((PROTOCOL_POINTER - nSync) == nPacketLength -1)
{
CheckSum = 0x00;
for(nTempLoop = 1; nTempLoop < nPacketLength; nTempLoop ++)
{
CheckSum += (unsigned char)PROTOCOL_TEMP[nTempLoop + nSync];
}
if(CheckSum == 0xFF)
{
switch((unsigned char) PROTOCOL_TEMP[nSync + 3])
{
case 0x22:
SetThreshold();
break;
case 0x24:
ReadThreshold();
break;
case 0x26:
SetMobile();
break;
case 0x28:
SetClock();
break;
case 0x2A:
break;
case 0x2C:
//waiting for reply
ConfirmMobilePhone();
break;
case 0x2E:
//waiting for reply
ConfirmAlarmValue();
break;
case 0x44:
//waiting for reply
ConfirmAlarmData();
break;
}
PROTOCOL_POINTER = 0;
nSync = 0;
continue;
}
}
}
if(PROTOCOL_POINTER > 40)
{
PROTOCOL_POINTER = 0;
nSync = 0;
}
if(PROTOCOL_TEMP[PROTOCOL_POINTER] == (BYTE)0x16)
{
if((PROTOCOL_POINTER - nSync) >= nPacketLength)
nSync = nLoop + PROTOCOL_POINTER;
}
PROTOCOL_POINTER ++;
}
}
unsigned char validateID()
{
unsigned int nID;
unsigned char *pTemp;
unsigned int ntemp;
pTemp = (unsigned char*)&ntemp;
*(pTemp + 0) = PROTOCOL_TEMP[nSync + 4];
*(pTemp + 1) = PROTOCOL_TEMP[nSync + 5];
nID = MY_ID;
if(nID == ntemp)
{
my_id_arr[0] = *(pTemp + 0);
my_id_arr[1] = *(pTemp + 1);
return 1;
}
else
{
return 0;
}
}
void SetThreshold()
{
unsigned char szreply[30];
unsigned int nloop = 0;
unsigned char szSum = 0;
// unsigned char *pTemp = NULL;
// unsigned int nTemp = 0;
if(!validateID())
return;
rtc_set_flag = TRUE;
memset(szreply, 0x00, 30);
//send reply
szreply[0] = 0x16;
szreply[1] = 0x00;
szreply[2] = 0x03;
szreply[3] = 0xA2;
szreply[4] = my_id_arr[0];
szreply[5] = my_id_arr[1];
szSum = 0x00;
for(nloop = 1; nloop < 6; nloop ++)
{
szSum += szreply[nloop];
}
szreply[6] = 0xFF - szSum;
SerialPortWrite(szreply, 7);
rtc_set_flag = FALSE;
}
void ReadThreshold()
{
unsigned char szreply[40];
unsigned char szsum = 0x00;
unsigned int nloop;
// unsigned char *pTemp;
// unsigned int ntemp;
if(!validateID())
return;
memset(szreply, 0x00, 40);
szreply[0] = 0x16;
szreply[1] = 0x00;
szreply[2] = 0x15;
szreply[3] = 0xA4;
szreply[4] = my_id_arr[0];
szreply[5] = my_id_arr[1];
szsum = 0x00;
for(nloop = 1; nloop < 22; nloop++)
{
szsum += szreply[nloop];
}
szreply[22] = 0xFF - szsum;
SerialPortWrite(szreply, 23);
}
void SetMobile()
{
unsigned char szreply[20];
unsigned int nloop = 0;
unsigned char szSum = 0;
if(!validateID())
return;
rtc_set_flag = TRUE;
MobilePhone1[0] = PROTOCOL_TEMP[nSync + 6];
MobilePhone1[1] = PROTOCOL_TEMP[nSync + 7];
MobilePhone1[2] = PROTOCOL_TEMP[nSync + 8];
MobilePhone1[3] = PROTOCOL_TEMP[nSync + 9];
MobilePhone1[4] = PROTOCOL_TEMP[nSync + 10];
MobilePhone1[5] = PROTOCOL_TEMP[nSync + 11];
MobilePhone1[6] = PROTOCOL_TEMP[nSync + 12];
MobilePhone1[7] = PROTOCOL_TEMP[nSync + 13];
MobilePhone1[8] = PROTOCOL_TEMP[nSync + 14];
MobilePhone1[9] = PROTOCOL_TEMP[nSync + 15];
MobilePhone1[10] = PROTOCOL_TEMP[nSync + 16];
MobilePhone1[11] = 0x00;
MobilePhone2[0] = PROTOCOL_TEMP[nSync + 17];
MobilePhone2[1] = PROTOCOL_TEMP[nSync + 18];
MobilePhone2[2] = PROTOCOL_TEMP[nSync + 19];
MobilePhone2[3] = PROTOCOL_TEMP[nSync + 20];
MobilePhone2[4] = PROTOCOL_TEMP[nSync + 21];
MobilePhone2[5] = PROTOCOL_TEMP[nSync + 22];
MobilePhone2[6] = PROTOCOL_TEMP[nSync + 23];
MobilePhone2[7] = PROTOCOL_TEMP[nSync + 24];
MobilePhone2[8] = PROTOCOL_TEMP[nSync + 25];
MobilePhone2[9] = PROTOCOL_TEMP[nSync + 26];
MobilePhone2[10] = PROTOCOL_TEMP[nSync + 27];
MobilePhone2[11] = 0x00;
MobilePhone3[0] = PROTOCOL_TEMP[nSync + 28];
MobilePhone3[1] = PROTOCOL_TEMP[nSync + 29];
MobilePhone3[2] = PROTOCOL_TEMP[nSync + 30];
MobilePhone3[3] = PROTOCOL_TEMP[nSync + 31];
MobilePhone3[4] = PROTOCOL_TEMP[nSync + 32];
MobilePhone3[5] = PROTOCOL_TEMP[nSync + 33];
MobilePhone3[6] = PROTOCOL_TEMP[nSync + 34];
MobilePhone3[7] = PROTOCOL_TEMP[nSync + 35];
MobilePhone3[8] = PROTOCOL_TEMP[nSync + 36];
MobilePhone3[9] = PROTOCOL_TEMP[nSync + 37];
MobilePhone3[10] = PROTOCOL_TEMP[nSync + 38];
MobilePhone3[11] = 0x00;
//send reply
memset(szreply, 0x00, 20);
szreply[0] = 0x16;
szreply[1] = 0x00;
szreply[2] = 0x03;
szreply[3] = 0xA6;
szreply[4] = my_id_arr[0];
szreply[5] = my_id_arr[1];
szSum = 0x00;
for(nloop = 1; nloop < 6; nloop ++)
{
szSum += szreply[nloop];
}
szreply[6] = 0xFF - szSum;
SerialPortWrite(szreply, 7);
rtc_set_flag = FALSE;
}
void SetClock()
{
unsigned char nyear, nmonth, nday, nhour, nmin, nsec;
unsigned char szreply[20];
unsigned int nloop = 0;
unsigned char szSum = 0;
unsigned char szBuffer[8];
if(!validateID())
return;
memset(szreply, 0x00, 20);
nyear = PROTOCOL_TEMP[nSync + 6];
nmonth = PROTOCOL_TEMP[nSync + 7];
nday = PROTOCOL_TEMP[nSync + 8];
nhour = PROTOCOL_TEMP[nSync + 9];
nmin = PROTOCOL_TEMP[nSync + 10];
nsec = PROTOCOL_TEMP[nSync + 11];
szBuffer[0] = hex2bcd(nsec);
szBuffer[1] = hex2bcd(nmin);
szBuffer[2] = hex2bcd(nhour);
szBuffer[3] = hex2bcd(nday);
szBuffer[4] = hex2bcd(nmonth);
szBuffer[5] = 0x00;
szBuffer[6] = hex2bcd(nyear);
szBuffer[7] = 0x00;
rtc_set_flag = TRUE;
v_Set1302(szBuffer);
rtc_set_flag = FALSE;
//send reply
szreply[0] = 0x16;
szreply[1] = 0x00;
szreply[2] = 0x03;
szreply[3] = 0xA8;
szreply[4] = my_id_arr[0];
szreply[5] = my_id_arr[1];
szSum = 0x00;
for(nloop = 1; nloop < 6; nloop ++)
{
szSum += szreply[nloop];
}
szreply[6] = 0xFF - szSum;
SerialPortWrite(szreply, 7);
}
void ConfirmMobilePhone()
{
if(!validateID())
return;
bMobilePhone = FALSE;
//#error " 清除手机设置上传标识"
}
void ConfirmAlarmValue()
{
if(!validateID())
return;
bAlarmValue = FALSE;
//#error "清除告警值上传标识"
}
void ConfirmAlarmData()
{
if(!validateID())
return;
bAlarmData = FALSE;
//#error "清除告警信息上传标识"
}
void uploadRealtimeData()
{
unsigned char szreply[60];
unsigned char szsum;
unsigned char nloop;
unsigned char *pTemp;
unsigned int nTemp;
unsigned int nmy_id;
memset(szreply, 0x00, 60);
nmy_id = MY_ID;
pTemp = (unsigned char*)&nmy_id;
szreply[0] = 0x16;
szreply[1] = 0x00;
szreply[2] = 0x1A;
szreply[3] = 0xC2;
szreply[4] = *(pTemp + 0);
szreply[5] = *(pTemp + 1);
szreply[6] = 0x00;
szreply[7] = CLK_YEAR;
szreply[8] = CLK_MONTH;
szreply[9] = CLK_DAY;
szreply[10] = CLK_HOUR;
szreply[11] = CLK_MIN;
szreply[12] = CLK_SEC;
szreply[13] = movex;
szreply[14] = movey;
szreply[15] = movez;
nTemp = adcx;
pTemp = (unsigned char*)&nTemp;
szreply[16] = *(pTemp + 0);
szreply[17] = *(pTemp + 1);
nTemp = adcy;
pTemp = (unsigned char*)&nTemp;
szreply[18] = *(pTemp + 0);
szreply[19] = *(pTemp + 1);
nTemp = adcz;
pTemp = (unsigned char*)&nTemp;
szreply[20] = *(pTemp + 0);
szreply[21] = *(pTemp + 1);
szreply[22] = (unsigned char)g_itemp_c[0];
szreply[23] = (unsigned char)g_itemp_c[1];
szreply[24] = (unsigned char)g_itemp_c[2];
szreply[25] = (unsigned char)g_itemp_c[3];
szreply[26] = (unsigned char)g_itemp_c[4];
szreply[27] = (unsigned char)g_itemp_c[5];
szreply[28] = (unsigned char)g_itemp_c[6];
szreply[29] = (unsigned char)g_itemp_c[7];
szreply[30] = g_itemp_c[8]; //g_itemp_c
szreply[31] = my_usart1_data[0];
szreply[32] = my_usart1_data[1];
szreply[33] = my_usart1_data[2];
szreply[34] = my_usart1_data[3];
szreply[35] = my_usart1_data[4];
szreply[36] = my_usart1_data[5];
szreply[37] = my_usart1_data[6];
szreply[38] = my_usart1_data[7];
szreply[39] = my_usart1_data[8];
szreply[40] = my_usart1_data[9];
szreply[41] = my_usart1_data[10];
szreply[42] = my_usart1_data[11];
szreply[43] = my_usart1_data[12];
szreply[44] = my_usart1_data[13];
szreply[45] = my_usart1_data[14];
szreply[46] = my_usart1_data[15];
szreply[47] = my_usart1_data[16];
szreply[48] = my_usart1_data[17];
szreply[49] = my_usart1_data[18];
szreply[50] = my_usart1_data[19];
szreply[51] = my_usart1_data[20];
szreply[52] = my_usart1_data[21];
szreply[53] = my_usart1_data[22];
szreply[54] = my_usart1_data[23];
szsum = 0x00;
for (nloop = 1; nloop < 55; nloop ++)
{
szsum += szreply[nloop];
}
szreply[55] = 0xFF - szsum;
SerialPortWrite(szreply, 56);
}
void uploadAlarmData(unsigned char value)
{
unsigned char szreply[40];
unsigned char szsum;
unsigned char nloop;
unsigned char *pTemp;
// unsigned int nTemp;
unsigned int nmy_id;
memset(szreply, 0x00, 40);
nmy_id = MY_ID;
pTemp = (unsigned char*)&nmy_id;
szreply[0] = 0x16;
szreply[1] = 0x00;
szreply[2] = 0x18;
szreply[3] = 0xC4;
szreply[4] = *(pTemp + 0);
szreply[5] = *(pTemp + 1);
szreply[6] = CLK_YEAR;
szreply[7] = CLK_MONTH;
szreply[8] = CLK_DAY;
szreply[9] = CLK_HOUR;
szreply[10] = CLK_MIN;
szreply[11] = CLK_SEC;
szreply[15] = value;
szsum = 0x00;
for (nloop = 1; nloop < 16; nloop ++)
{
szsum += szreply[nloop];
}
szreply[16] = 0xFF - szsum;
SerialPortWrite(szreply, 17);
}
void uploadAlarmValue()
{
unsigned char szreply[40];
unsigned char szsum;
unsigned char nloop;
unsigned char *pTemp;
// unsigned int nTemp;
unsigned int nmy_id;
memset(szreply, 0x00, 40);
nmy_id = MY_ID;
pTemp = (unsigned char*)&nmy_id;
szreply[0] = 0x16;
szreply[1] = 0x00;
szreply[2] = 0x15;
szreply[3] = 0xAE;
szreply[4] = *(pTemp + 0);
szreply[5] = *(pTemp + 1);
szsum = 0x00;
for (nloop = 1; nloop < 10; nloop ++)
{
szsum += szreply[nloop];
}
szreply[10] = 0xFF - szsum;
SerialPortWrite(szreply, 11);
//#error "设置等待告警值返回标识"
}
void uploadMobile()
{
unsigned char szreply[30];
unsigned char szsum;
unsigned char nloop;
unsigned char *pTemp;
unsigned int nmy_id;
memset(szreply, 0x00, 30);
nmy_id = MY_ID;
pTemp = (unsigned char*)&nmy_id;
szreply[0] = 0x16;
szreply[1] = 0x00;
szreply[2] = 0x0E;
szreply[3] = 0xAC;
szreply[4] = *(pTemp + 0);
szreply[5] = *(pTemp + 1);
szsum = 0x00;
for (nloop = 1; nloop < 17; nloop ++)
{
szsum += szreply[nloop];
}
szreply[17] = 0xFF - szsum;
SerialPortWrite(szreply, 18);
}
/* bcd to hex */
unsigned int bcd2hex(BYTE bdata)
{
unsigned int tmp;
tmp = (((unsigned int)(bdata >> 4) * 10) + (unsigned int)(bdata & 0x0f));
return tmp;
}
/* hex to bcd */
unsigned char hex2bcd(unsigned char hdata)
{
unsigned char bdata;
unsigned char tmp;
tmp = hdata % 100;
bdata=(unsigned char)((unsigned int)hdata) / 100 << 8;
bdata=(unsigned char)(bdata | tmp / 10 << 4);
bdata=(unsigned char)(bdata | tmp % 10);
return bdata;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -