272 lines
4.2 KiB
C
272 lines
4.2 KiB
C
|
|
#define _IN_OCOM_C
|
|
#include "ocom.h"
|
|
#include "crc16.h"
|
|
|
|
void ReadOComBuffEmpty(OComExFuns * funs)
|
|
{
|
|
int rslt, len;
|
|
u8 temp;
|
|
|
|
len = funs->GetRsvLen();
|
|
|
|
while (len > 0)
|
|
{
|
|
rslt = funs->GetOComData(&temp, 1);
|
|
if (rslt != 1)
|
|
{
|
|
rslt = 0;
|
|
break;
|
|
}
|
|
len--;
|
|
}
|
|
|
|
}
|
|
|
|
#ifndef MAX_OCOM_SCAN
|
|
#define MAX_OCOM_SCAN 128 // 单次最大扫描个数
|
|
#endif
|
|
|
|
int GetAOComPacket(OComExFuns * funs, OComPacket * pPacket)
|
|
{
|
|
int rslt, len;
|
|
int i;
|
|
int phase;
|
|
|
|
u8 temp;
|
|
u8 rdBuf[LEN_OCOM_PKT];
|
|
OComPacket * pDat;
|
|
|
|
if (funs == NULL || pPacket == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
i = 0; // 扫描字节计数器
|
|
pDat = (OComPacket *)rdBuf;
|
|
|
|
do
|
|
{
|
|
len = funs->GetRsvLen();
|
|
|
|
if (len < LEN_OCOM_PKT)
|
|
{
|
|
rslt = -3;
|
|
break; // 没有足够数据
|
|
}
|
|
|
|
phase = 0;
|
|
rslt = 0;
|
|
|
|
// 从接收缓冲区中找数据包
|
|
while(((len + phase) >= LEN_OCOM_PKT) && (phase < LEN_OCOM_PKT))
|
|
{
|
|
if (phase == 0 && i > MAX_OCOM_SCAN)
|
|
{
|
|
rslt = -4;
|
|
break; // 查找同步序列超出最大单次扫描字节数
|
|
}
|
|
|
|
rslt = funs->GetOComData(&temp, 1); // 读取一个字节
|
|
if (rslt != 1)
|
|
{
|
|
printf("error at GetOComData rslt\r\n");
|
|
rslt = -8;
|
|
break;
|
|
}
|
|
|
|
rslt = 0;
|
|
i++; // 扫描字数增加
|
|
len--; // 剩余长度减小
|
|
|
|
if (phase < DC_SYNC_LEN) // 识别同步序列
|
|
{
|
|
if (temp != OCOM_SYNC[phase])
|
|
{
|
|
phase = 0;
|
|
rslt = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
pDat->buff.normal[phase] = temp; // 保存
|
|
phase++;
|
|
}
|
|
|
|
if (rslt != 0)
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (phase >= LEN_OCOM_PKT) // 得到数据包
|
|
{
|
|
u16 check;
|
|
check = CalcCheckSum(&(pDat->buff.normal[DC_SYNC_LEN]), DC_CHECK_LEN);
|
|
if (check == pDat->normal.check)
|
|
{
|
|
// 得到正确数据包
|
|
memcpy(pPacket, pDat, LEN_OCOM_PKT);
|
|
// printf("GetANormalPacket ok\r\n");
|
|
rslt = LEN_OCOM_PKT;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// CRC 不正确
|
|
printf("1. crc error in GetANormalPacket\r\n");
|
|
// 拷贝需要再判断的数据
|
|
// continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 没有找到同步序列的情况
|
|
// continue;
|
|
}
|
|
}while(1);
|
|
|
|
return rslt;
|
|
}
|
|
|
|
int GetOComExData(OComExFuns * funs, u8 * pBuff, int exlen)
|
|
{
|
|
int rslt, len;
|
|
u16 getcrc;
|
|
|
|
if (funs == NULL || pBuff == NULL || exlen <= 0)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
u8 * pDat = (u8 *)pBuff;
|
|
do
|
|
{
|
|
len = funs->GetRsvLen();
|
|
if (len < exlen + 2)
|
|
{
|
|
rslt = -3;
|
|
break; // 没有足够数据
|
|
}
|
|
|
|
rslt = 0;
|
|
|
|
rslt = funs->GetOComData(pDat, exlen); // 读取数据
|
|
if (rslt != exlen)
|
|
{
|
|
printf("error at GetOComData rslt=%d\r\n", rslt);
|
|
rslt = -8;
|
|
break;
|
|
}
|
|
|
|
rslt = funs->GetOComData((u8*)(&getcrc), 2); // 读取crc
|
|
if (rslt != 2)
|
|
{
|
|
printf("error at GetOComData rslt=%d\r\n", rslt);
|
|
rslt = -9;
|
|
break;
|
|
}
|
|
|
|
{
|
|
u16 check;
|
|
|
|
check = CalcCheckSum(pDat, exlen);
|
|
if (check == getcrc)
|
|
{
|
|
// 得到正确数据包
|
|
// printf("GetOComExData ok\r\n");
|
|
rslt = exlen;
|
|
break;
|
|
}
|
|
else
|
|
{
|
|
// CRC 不正确
|
|
printf("2. crc error in GetOComExData\r\n");
|
|
rslt = -7;
|
|
}
|
|
}
|
|
}while (0);
|
|
|
|
return rslt;
|
|
}
|
|
|
|
int SendAOComPacket(OComExFuns * funs, OComPacket * pPacket)
|
|
{
|
|
int rslt;
|
|
int freelen, sendlen;
|
|
|
|
if (funs == NULL || pPacket == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
sendlen = LEN_OCOM_PKT;
|
|
|
|
freelen = funs->GetTrsFreeLen();
|
|
|
|
if (freelen < sendlen)
|
|
{
|
|
// printf("buff is full in SendAOComPacket\r\n");
|
|
return 1;
|
|
}
|
|
|
|
rslt = funs->SendOComData(pPacket->buff.normal, sendlen);
|
|
if (rslt != sendlen)
|
|
{
|
|
printf("error at call SendOComData, rslt=%d\r\n", rslt);
|
|
return -2;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int SendOComExData(OComExFuns * funs, u8 * pBuff, int exlen)
|
|
{
|
|
int rslt;
|
|
int freelen, sendlen;
|
|
u16 check;
|
|
|
|
if (funs == NULL || pBuff == NULL || exlen <= 0)
|
|
{
|
|
return -1;
|
|
}
|
|
sendlen = exlen;
|
|
|
|
freelen = funs->GetTrsFreeLen();
|
|
|
|
if (freelen < sendlen + 2)
|
|
{
|
|
// printf("buff is full in SendOComExData\r\n");
|
|
return 1;
|
|
}
|
|
|
|
rslt = funs->SendOComData(pBuff, sendlen);
|
|
if (rslt != sendlen)
|
|
{
|
|
printf("error at call SendOComData, rslt=%d\r\n", rslt);
|
|
return -2;
|
|
}
|
|
|
|
check = CalcCheckSum(pBuff, sendlen);
|
|
rslt = funs->SendOComData((u8*)(&check), 2);
|
|
if (rslt != 2)
|
|
{
|
|
printf("error at call SendOComData, rslt=%d\r\n", rslt);
|
|
return -2;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int PacketAOCom(OComPacket * pPacket)
|
|
{
|
|
if (pPacket == NULL)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
memcpy(pPacket->normal.sync, OCOM_SYNC, DC_SYNC_LEN);
|
|
pPacket->normal.check = CalcCheckSum(&(pPacket->buff.normal[DC_SYNC_LEN]), DC_CHECK_LEN);
|
|
|
|
return 0;
|
|
|
|
}
|