462 lines
9.1 KiB
C
462 lines
9.1 KiB
C
|
|
|
|||
|
|
#define _IN_COMM_C
|
|||
|
|
#include "comm.h"
|
|||
|
|
#include "crc16.h"
|
|||
|
|
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
int ReadBuffEmpty(DataExFuns * funs)
|
|||
|
|
{
|
|||
|
|
int rslt, len;
|
|||
|
|
int rdlen;
|
|||
|
|
#define ONCE_READ 16
|
|||
|
|
u8 tempbuf[ONCE_READ];
|
|||
|
|
|
|||
|
|
len = funs->GetRsvLen();
|
|||
|
|
|
|||
|
|
while (len > 0)
|
|||
|
|
{
|
|||
|
|
if (len < ONCE_READ)
|
|||
|
|
{
|
|||
|
|
rdlen = len;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
rdlen = ONCE_READ;
|
|||
|
|
}
|
|||
|
|
rslt = funs->GetCommData(tempbuf, rdlen);
|
|||
|
|
|
|||
|
|
if (rslt <= 0)
|
|||
|
|
{
|
|||
|
|
rslt = 0;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
len -= rslt;
|
|||
|
|
}
|
|||
|
|
return len;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------------------------------
|
|||
|
|
// <20><><EFBFBD><EFBFBD>: <20><>ͨѶ<CDA8>ڽ<EFBFBD><DABD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еõ<D0B5>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>,
|
|||
|
|
// ֻ<><D6BB>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ݰ<EFBFBD><DDB0>ṹ. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>ô<EFBFBD><C3B4>Ҫ<EFBFBD><D2AA> GetExCommData <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>: pPacket, <20><><EFBFBD>ݰ<EFBFBD>ָ<EFBFBD><D6B8>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>: >=0, <20>ɹ<EFBFBD>ȡ<EFBFBD><C8A1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0>Ϳɱ䳤<C9B1><E4B3A4><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵΪ<D6B5><CEAA><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -2, CRC<52><43><EFBFBD><EFBFBD>
|
|||
|
|
// -3, <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
|
|||
|
|
// -4, û<><C3BB><EFBFBD>ҵ<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -5<><35><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD>ʱ
|
|||
|
|
// -6, <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -7, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CRC<52><43><EFBFBD><EFBFBD>
|
|||
|
|
// -8, <20><><EFBFBD><EFBFBD>δ֪<CEB4><D6AA><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷȡ<C8B7><C8A1><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>ͨѶ<CDA8><D1B6>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD>
|
|||
|
|
|
|||
|
|
#define MAX_TCP_PACKET 1500
|
|||
|
|
|
|||
|
|
|
|||
|
|
typedef struct
|
|||
|
|
{
|
|||
|
|
int len; // <20>Ѷ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
u8 buff[LEN_NORMAL_PACKET+MAX_TCP_PACKET]; // <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
}GetPacketCtrl;
|
|||
|
|
|
|||
|
|
GetPacketCtrl g_gtpCtrl = {0};
|
|||
|
|
|
|||
|
|
#define MAX_ONCE_SCAN (LEN_NORMAL_PACKET) // һ<><D2BB>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* return: -1,<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* -2,CRCУ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
* -3,û<EFBFBD><EFBFBD><EFBFBD>㹻<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
*/
|
|||
|
|
int GetANormalPacket(DataExFuns * funs, DataPacket * pPacket)
|
|||
|
|
{
|
|||
|
|
int rslt, len;
|
|||
|
|
int i;
|
|||
|
|
int phase;
|
|||
|
|
int status; // ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1,FLDP 2,VLDP
|
|||
|
|
int exlen;
|
|||
|
|
int begidx;
|
|||
|
|
|
|||
|
|
u8 temp;
|
|||
|
|
u8 rdBuf[LEN_NORMAL_PACKET];
|
|||
|
|
DataPacket * pDat = (DataPacket *)(rdBuf);
|
|||
|
|
|
|||
|
|
if (funs == NULL || pPacket == NULL)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (g_gtpCtrl.len < LEN_NORMAL_PACKET + MAX_EXDP_LEN)
|
|||
|
|
{
|
|||
|
|
len = funs->GetRsvLen(); // <20><>ȡ<EFBFBD>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
|
|||
|
|
|
|||
|
|
if (len <= 0)
|
|||
|
|
{
|
|||
|
|
rslt = -3; // û<><C3BB><EFBFBD>㹻<EFBFBD><E3B9BB><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (len + g_gtpCtrl.len <= MAX_TCP_PACKET)
|
|||
|
|
{
|
|||
|
|
rslt = funs->GetCommData(&(g_gtpCtrl.buff[g_gtpCtrl.len]), len); // <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// printf("Get a big packet, len=%d\r\n", len);
|
|||
|
|
rslt = funs->GetCommData(&(g_gtpCtrl.buff[g_gtpCtrl.len]), MAX_TCP_PACKET-g_gtpCtrl.len); // <20><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
g_gtpCtrl.len += rslt; // ʵ<><CAB5><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// printf("load a packet to buff, len=%d, buflen=%d\r\n", len, g_gtpCtrl.len);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
len = g_gtpCtrl.len;
|
|||
|
|
if (len < LEN_NORMAL_PACKET)
|
|||
|
|
{
|
|||
|
|
rslt = -3;
|
|||
|
|
return rslt; // û<><C3BB><EFBFBD>㹻<EFBFBD><E3B9BB><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
i = 0; // ɨ<><C9A8><EFBFBD>ֽڼ<D6BD><DABC><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
begidx = 0; // <20><>ȷ<EFBFBD><C8B7><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
phase = 0;
|
|||
|
|
status = 0;
|
|||
|
|
rslt = 0;
|
|||
|
|
|
|||
|
|
while(phase < LEN_NORMAL_PACKET)
|
|||
|
|
{
|
|||
|
|
if (phase == 0 && i > MAX_ONCE_SCAN)
|
|||
|
|
{
|
|||
|
|
rslt = -4;
|
|||
|
|
break; // <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (i < g_gtpCtrl.len)
|
|||
|
|
{
|
|||
|
|
temp = g_gtpCtrl.buff[i];
|
|||
|
|
i++; // ɨ<><C9A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// printf("data not enough\r\n");
|
|||
|
|
rslt = -3; // <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pDat->buff.normal[phase] = temp; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (phase < DP_SYNC_LEN) // ʶ<><CAB6>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (phase == 0)
|
|||
|
|
{
|
|||
|
|
if (temp == FLDP_SYNC[0])
|
|||
|
|
{
|
|||
|
|
begidx = i-1;
|
|||
|
|
status = 1;
|
|||
|
|
}
|
|||
|
|
else if (temp == VLDP_SYNC[0])
|
|||
|
|
{
|
|||
|
|
begidx = i-1;
|
|||
|
|
status = 2;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
begidx = i;
|
|||
|
|
status = 0;
|
|||
|
|
phase = 0;
|
|||
|
|
rslt = 0; // <20><>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
if (status == 1)
|
|||
|
|
{
|
|||
|
|
if (temp != FLDP_SYNC[phase]) // ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
{
|
|||
|
|
begidx = 0;
|
|||
|
|
status = 0;
|
|||
|
|
phase = 0;
|
|||
|
|
rslt = 0;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else if (status == 2)
|
|||
|
|
{
|
|||
|
|
if (temp != VLDP_SYNC[phase]) // ͬ<><CDAC><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
|
|||
|
|
{
|
|||
|
|
begidx = 0;
|
|||
|
|
status = 0;
|
|||
|
|
phase = 0;
|
|||
|
|
rslt = 0;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
begidx = 0;
|
|||
|
|
status = 0;
|
|||
|
|
phase = 0;
|
|||
|
|
rslt = -8;
|
|||
|
|
printf("1. error status in GetANormalPacket\r\n");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
phase++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (phase >= LEN_NORMAL_PACKET) // <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
{
|
|||
|
|
u16 crc;
|
|||
|
|
crc = CalcCrc16(pDat->normal.content, DP_CONT_LEN);
|
|||
|
|
if (crc == pDat->normal.crc)
|
|||
|
|
{
|
|||
|
|
// <20>õ<EFBFBD><C3B5><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
memcpy(pPacket, pDat, LEN_NORMAL_PACKET);
|
|||
|
|
// printf("GetANormalPacket ok\r\n");
|
|||
|
|
rslt = LEN_NORMAL_PACKET;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// CRC <20><><EFBFBD><EFBFBD>ȷ
|
|||
|
|
begidx = i;
|
|||
|
|
printf("2. crc error in GetANormalPacket\r\n");
|
|||
|
|
rslt = -2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (rslt == LEN_NORMAL_PACKET) // <20><>ȷ<EFBFBD>õ<EFBFBD>
|
|||
|
|
{
|
|||
|
|
if (memcmp(pPacket->normal.sync, VLDP_SYNC, DP_SYNC_LEN) == 0) // <20>ǿɱ䳤<C9B1><E4B3A4><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD> vldp
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
exlen = pPacket->vldp.exlen;
|
|||
|
|
if (exlen > MAX_EXDP_LEN)
|
|||
|
|
{
|
|||
|
|
begidx += LEN_NORMAL_PACKET+exlen;
|
|||
|
|
printf("data exlen error, len=%d\r\n", exlen);
|
|||
|
|
rslt = -6; // <20><><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else if (exlen == 0)
|
|||
|
|
{
|
|||
|
|
begidx += LEN_NORMAL_PACKET;
|
|||
|
|
rslt = LEN_NORMAL_PACKET;
|
|||
|
|
}
|
|||
|
|
else if (exlen + LEN_NORMAL_PACKET > g_gtpCtrl.len)
|
|||
|
|
{
|
|||
|
|
// <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>, <20><>ʱ<EFBFBD>˳<EFBFBD>
|
|||
|
|
// printf("exdata not enough, exlen=%d, g_gtpCtrl.len=%d\r\n", exlen, g_gtpCtrl.len);
|
|||
|
|
rslt = -3; // <20><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
// 20240606 ljs <20><EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ĵ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>
|
|||
|
|
#if (1)
|
|||
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD><D5B9><EFBFBD><EFBFBD>CRCУ<43><D0A3>(1k<31>ֽ<EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ʱԼ1ms)
|
|||
|
|
u16 crc;
|
|||
|
|
crc = CalcCrc16(&g_gtpCtrl.buff[i], exlen);
|
|||
|
|
if (crc == pDat->vldp.excrc)
|
|||
|
|
{
|
|||
|
|
memcpy(pPacket->buff.exData, &(g_gtpCtrl.buff[i]), exlen); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (exlen < MAX_EXDP_LEN)
|
|||
|
|
{
|
|||
|
|
pPacket->buff.exData[exlen] = 0;
|
|||
|
|
}
|
|||
|
|
rslt = LEN_NORMAL_PACKET+exlen;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("3. excrc error in GetANormalPacket\r\n");
|
|||
|
|
rslt = -2;
|
|||
|
|
}
|
|||
|
|
begidx += LEN_NORMAL_PACKET+exlen;
|
|||
|
|
#else
|
|||
|
|
begidx += LEN_NORMAL_PACKET+exlen;
|
|||
|
|
memcpy(pPacket->buff.exData, &(g_gtpCtrl.buff[i]), exlen); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (exlen < MAX_EXDP_LEN)
|
|||
|
|
{
|
|||
|
|
pPacket->buff.exData[exlen] = 0;
|
|||
|
|
}
|
|||
|
|
rslt = LEN_NORMAL_PACKET+exlen;
|
|||
|
|
#endif
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
begidx += LEN_NORMAL_PACKET; // <20>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>ǰ<EFBFBD><C7B0>
|
|||
|
|
if (begidx > 0 && begidx <= g_gtpCtrl.len)
|
|||
|
|
{
|
|||
|
|
if (begidx < g_gtpCtrl.len)
|
|||
|
|
{
|
|||
|
|
// printf("copy data, begidx=%d, len=%d\r\n", begidx, (g_gtpCtrl.len - begidx));
|
|||
|
|
memcpy(&(g_gtpCtrl.buff[0]), &g_gtpCtrl.buff[begidx], (g_gtpCtrl.len - begidx));
|
|||
|
|
}
|
|||
|
|
g_gtpCtrl.len -= begidx;
|
|||
|
|
begidx = 0;
|
|||
|
|
}
|
|||
|
|
else if (begidx < 0)
|
|||
|
|
{
|
|||
|
|
printf("beginidx < 0\r\n");
|
|||
|
|
}
|
|||
|
|
else if (begidx > g_gtpCtrl.len)
|
|||
|
|
{
|
|||
|
|
g_gtpCtrl.len = 0;
|
|||
|
|
printf("begidx=%d > g_gtpCtrl.len=%d, set g_gtpCtrl.len = 0\r\n", begidx, g_gtpCtrl.len);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return rslt;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD><EFBFBD><EFBFBD>, ͨ<><CDA8>ͨѶ<CDA8>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>: pPacket, <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3>Ѿ<EFBFBD><D1BE><EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ֶΡ<D6B6>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:
|
|||
|
|
// 0, <20><><EFBFBD>Է<EFBFBD><D4B7><EFBFBD>, <20><><EFBFBD>ӵ<EFBFBD><D3B5>˷<EFBFBD><CBB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -2<><32><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD>
|
|||
|
|
// 1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>ܷ<EFBFBD><DCB7><EFBFBD>
|
|||
|
|
int SendAPacket(DataExFuns * funs, DataPacket * pPacket, int waittime)
|
|||
|
|
{
|
|||
|
|
int rslt;
|
|||
|
|
int freelen, sendlen;
|
|||
|
|
|
|||
|
|
if (pPacket == NULL)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (memcmp(pPacket->normal.sync, FLDP_SYNC, DP_SYNC_LEN) == 0)
|
|||
|
|
{
|
|||
|
|
sendlen = LEN_NORMAL_PACKET;
|
|||
|
|
}
|
|||
|
|
else if (memcmp(pPacket->normal.sync, VLDP_SYNC, DP_SYNC_LEN) == 0)
|
|||
|
|
{
|
|||
|
|
sendlen = LEN_NORMAL_PACKET + pPacket->vldp.exlen;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
printf("para err, not a corrected packet\r\n");
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
rslt = 0;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
freelen = funs->GetTrsFreeLen();
|
|||
|
|
if (freelen <= 0) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD>
|
|||
|
|
{
|
|||
|
|
// printf("error at call GetTrsFreeLen, freelen=%d\r\n", freelen);
|
|||
|
|
rslt = -2;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (freelen >= sendlen)
|
|||
|
|
{
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
waittime--;
|
|||
|
|
if (waittime <= 0)
|
|||
|
|
{
|
|||
|
|
rslt = 1;
|
|||
|
|
// printf("buff is full in SendAPacket, timout\r\n");
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
if (funs->Delay != NULL)
|
|||
|
|
{
|
|||
|
|
funs->Delay(1);
|
|||
|
|
}
|
|||
|
|
}while(1);
|
|||
|
|
|
|||
|
|
if (rslt == 0)
|
|||
|
|
{
|
|||
|
|
rslt = funs->SendCommData(pPacket->datbuff, sendlen);
|
|||
|
|
if (rslt != sendlen)
|
|||
|
|
{
|
|||
|
|
printf("error at call SendCommData, rslt=%d\r\n", rslt);
|
|||
|
|
return -2;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//printf("error:Not SendCommData\r\n");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:
|
|||
|
|
// pPacket, <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>г<EFBFBD><D0B3><EFBFBD>sync<6E><63>crc<72>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:
|
|||
|
|
// 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
int PacketAFLDP(DataPacket * pPacket)
|
|||
|
|
{
|
|||
|
|
if (pPacket == NULL)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
memcpy(pPacket->normal.sync, FLDP_SYNC, DP_SYNC_LEN);
|
|||
|
|
pPacket->normal.crc = CalcCrc16(pPacket->normal.content, DP_CONT_LEN);
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
// <20><><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ɱ䳤<C9B1><E4B3A4><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>
|
|||
|
|
// <20><><EFBFBD><EFBFBD>: pPacket, <20><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD><DDB0><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD> SYNC EXLEN EXCRC <20><> EXDAT <20>Ȳ<EFBFBD><C8B2><EFBFBD>
|
|||
|
|
// pExdat, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
|
|||
|
|
// exlen<65><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>Ϊ0
|
|||
|
|
// <20><><EFBFBD><EFBFBD>:
|
|||
|
|
// 0, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -1, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
// -2<><32>
|
|||
|
|
|
|||
|
|
int PacketAVLDP(DataPacket * pPacket, const u8 * pExdat, u16 exlen)
|
|||
|
|
{
|
|||
|
|
if (pPacket == NULL)
|
|||
|
|
{
|
|||
|
|
return -1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pExdat == NULL)
|
|||
|
|
{
|
|||
|
|
exlen = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
memcpy(pPacket->vldp.sync, VLDP_SYNC, DP_SYNC_LEN);
|
|||
|
|
pPacket->vldp.exlen = exlen;
|
|||
|
|
pPacket->vldp.excrc = CalcCrc16(pExdat, exlen);
|
|||
|
|
pPacket->vldp.crc = CalcCrc16(pPacket->normal.content, DP_CONT_LEN);
|
|||
|
|
if (exlen != 0 && pPacket->vldp.exData != pExdat)
|
|||
|
|
{
|
|||
|
|
memcpy(pPacket->vldp.exData, pExdat, exlen);
|
|||
|
|
}
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//--------------------------------------------------------------------------------------------------
|
|||
|
|
|
|||
|
|
|