更新部分函数

更新parseRS232逻辑,支持ASCII与HEX
This commit is contained in:
CSSC-WORK\murmur 2023-07-25 09:02:31 +08:00
parent 3d9fb6a6bc
commit cee3c8ae2d
2 changed files with 88 additions and 56 deletions

View File

@ -271,7 +271,9 @@ static int getAndCheckLoc(uint8_t *dout, size_t pairCnt)
cnt = getLoc(loc,pairCnt); cnt = getLoc(loc,pairCnt);
if (i++ > 20) { if (i++ > 20) {
LOG_E("位置信息获取异常"); LOG_E("位置信息获取异常");
break; // break;
memset(dout,0x37,pairCnt*10);
return pairCnt*10;
} }
} }
memcpy(dout,loc,cnt); memcpy(dout,loc,cnt);
@ -285,12 +287,20 @@ static int getAndCheckLoc(uint8_t *dout, size_t pairCnt)
*/ */
int reportDepth(uint8_t *din,size_t len) int reportDepth(uint8_t *din,size_t len)
{ {
uint8_t rst[len];
memcpy(rst,din,len);
// 000000000000000000005AA53E320608000A170407101B33FFFFFFFF24ED // 000000000000000000005AA53E320608000A170407101B33FFFFFFFF24ED
getAndCheckLoc(rst+0,1);//有10个位置的空余字节尚不清楚定义 //获取并更新位置信息
upSend(rst, len); uint8_t loc[10];
uint8_t dout[200];
size_t nlen = getAndCheckLoc(dout, 1);
rt_memcpy(dout+10, din, len);//5aa5从第11字节开始共len个字节
LOG_HEX("depth",16,dout,len+10);
//加密。因加密后数据长度会变化,故不能只加密位置数据。
nlen = cryptLocMsg(din, len+10, dout);
LOG_HEX("crypt",16,dout,nlen);
LOG_D("位置数据加密完成");
upSend(dout, nlen);
} }
//天通指令类型0x70 0x01 //天通指令类型0x70 0x01
@ -337,7 +347,7 @@ static void d_packLocMsg(void)
* @param dout * @param dout
* @return * @return
*/ */
static int cryptLocMsg(uint8_t *din, size_t len, uint8_t *dout) int cryptLocMsg(uint8_t *din, size_t len, uint8_t *dout)
{ //加密。因加密后数据长度会变化,故不能只加密位置数据。 { //加密。因加密后数据长度会变化,故不能只加密位置数据。
uint8_t cd[200]={0xAB,0xAB}; uint8_t cd[200]={0xAB,0xAB};
size_t nlen = 0; size_t nlen = 0;
@ -373,19 +383,20 @@ int packAndSendLoc()
* @param dout * @param dout
* @return * @return
*/ */
int packDepthMsg(uint8_t *din, int len) int depthAlert(uint8_t *din, int len)
{ {
//获取并更新位置信息 //获取并更新位置信息
uint8_t loc[10]; // uint8_t loc[10];
uint8_t dout[200]; // uint8_t dout[200];
size_t nlen = getAndCheckLoc(loc, 1); // size_t nlen = getAndCheckLoc(dout, 1);
//
rt_memcpy(din+0, loc, nlen);//位置数据从【】字节开始共len个字节 // rt_memcpy(dout+10, din, len);//5aa5从第11字节开始共len个字节
LOG_HEX("depth",16,din,len); // LOG_HEX("depth",16,dout,len+10);
//加密。因加密后数据长度会变化,故不能只加密位置数据。 // //加密。因加密后数据长度会变化,故不能只加密位置数据。
nlen = cryptLocMsg(din, len, dout); // nlen = cryptLocMsg(din, len+10, dout);
LOG_D("位置数据加密完成"); // LOG_HEX("crypt",16,dout,nlen);
upSend(dout, nlen); // LOG_D("位置数据加密完成");
// upSend(dout, nlen);
} }
@ -507,7 +518,7 @@ void ttRunCMD(uint8_t *din, size_t len)
clearAllData(); clearAllData();
break; break;
default: default:
LOG_W("未支持的指令。"); LOG_W("0x%04X=未支持的指令。",cmd);
break; break;
} }
} }
@ -599,7 +610,7 @@ void parse3SData(uint8_t *din, size_t count)
switch (cmd) switch (cmd)
{ {
case _CMD_DEPTH_REQUEST: case _CMD_DEPTH_REQUEST:
packDepthMsg(din, count); reportDepth(din, count);
break; break;
default: default:
cacheData(din, count); cacheData(din, count);
@ -755,14 +766,21 @@ void d_cacheData()
void parseRS232(uint8_t *din, size_t len) void parseRS232(uint8_t *din, size_t len)
{ {
//有HEX有ASCII统一按HEX解析 //有HEX有ASCII统一按HEX解析
uint8_t head[]={0x41, 0x54, 0x2B, 0x53, 0x4E, 0x44, 0x20 };//"AT+SND " //部分数据以10字节20字符的0数据开始如深度查询心跳包等
uint8_t ndin[400]; //处理思路是先不管前导0对应指令手动加前导数据
//如果有无"AT+SND "头的数据混发则难以处理粘包,如果所有数据均以"AT+SND "开头则可以按以下方法(未完全实现)处理 uint8_t asciiHead[]={0x41, 0x54, 0x2B, 0x53, 0x4E, 0x44,};//"AT+SND"
//是否存在混发需要核实 uint8_t hexHead[]={0x5a, 0xa5};//"5AA5"
#ifdef _MIX_DATA //由于帧头有多种且ascii和hex混发无法处理粘包
uint8_t index[10];
size_t n=isInByte(din, len, head, sizeof(head), index);
//check
if (memcmp(din,asciiHead,sizeof(asciiHead)) == 0) {
//ascii
LOG_I("type = ASCII");
uint8_t index[10];
uint8_t tmpHead[]={0x35, 0x41, 0x41, 0x35};
size_t n=isInByte(din, len, tmpHead, sizeof(tmpHead), index);
// LOG_D("n=%d",n);
if (!n) { if (!n) {
LOG_W("无匹配数据"); LOG_W("无匹配数据");
return; return;
@ -770,31 +788,45 @@ void parseRS232(uint8_t *din, size_t len)
for (size_t i = 0; i < n; i++) for (size_t i = 0; i < n; i++)
{ {
//按帧头分割 //按帧头分割
uint8_t ndin[400];
int cnt=(i+1<n)?index[i+1]-index[i]:len-index[i];
memcpy(ndin,din+index[i],cnt);
ndin[cnt]='\0';
uint8_t tmp[200];
size_t ncnt = str2Byte(ndin, 2, 16, tmp);
LOG_HEX("frame",16,tmp,ncnt);
if (chk3SDataValid(tmp, ncnt) != RT_EOK) {
return;
}
parse3SData(tmp,ncnt);
}
}
else//如果不是ASCII则统一按HEX计// if (memcmp(din,hexHead,sizeof(hexHead)) == 0)
{
//hex
LOG_I("type = HEX");
uint8_t index[10];
size_t n=isInByte(din, len, hexHead, sizeof(hexHead), index);
if (!n) {
LOG_W("无匹配数据");
return;
}
for (size_t i = 0; i < n; i++)
{
//按帧头分割
uint8_t ndin[200];
int cnt=(i+1<n)?index[i+1]-index[i]:len-index[i]; int cnt=(i+1<n)?index[i+1]-index[i]:len-index[i];
memcpy(ndin,din+index[i],cnt); memcpy(ndin,din+index[i],cnt);
LOG_HEX("frame",16,ndin,cnt); LOG_HEX("frame",16,ndin,cnt);
#endif if (chk3SDataValid(ndin, cnt) != RT_EOK) {
#ifndef _MIX_DATA
int cnt=len;
memcpy(ndin,din,len);
#endif
//parse
size_t offset = 0;
if (memcmp(ndin,head,sizeof(head)) == 0) {
//有“AT+SND ”帧头,需要处理
offset = sizeof(head);
}
ndin[cnt]='\0';
size_t ncnt = str2Byte(ndin+offset, 2, 16, ndin);
LOG_HEX("decode",16,ndin,ncnt);
if (chk3SDataValid(ndin, ncnt) != RT_EOK) {
return; return;
} }
parse3SData(ndin,ncnt); parse3SData(ndin,cnt);
#ifdef _MIX_DATA
} }
#endif }
} }

View File

@ -30,7 +30,7 @@
#define SAMPLE_UART_NAME "uart3" /* 串口设备名称 */ #define SAMPLE_UART_NAME "uart3" /* 串口设备名称 */
#endif #endif
#define MAX_SIZE_TO_SAVE 1024*2 #define MAX_SIZE_TO_SAVE 1024*2
#define MIN_FRAME_LEN 27 #define MIN_FRAME_LEN 11
/* 串口接收消息结构*/ /* 串口接收消息结构*/
struct rx_msg struct rx_msg
{ {