HalRecv_tpye1.c
5.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/*********************************
*
* 极至接收数据处理
* 数据类型1
* 用于串口协议,大疆多通道接收协议
*
* ****************************************/
#include <stdio.h>
#include "JZsdkLib.h"
#include "BaseConfig.h"
/***************
*
*
* 极至串口协议的数据初步筛选
* 用于清空无效数据
* 以及将有效数据提取出来,放置到后续处理函数中
* 输入要 处理的原始数据data 以及 数据长度DataLen 还有输入的接口
* 返回值:未处理的长度数据
*
* 返回后在
* ********************/
int HalRecv_tpye1_PreliminaryScreeningOfData(unsigned char *Data, unsigned int DataLen, int Port)
{
int ResidualLength = 0; // 剩余数据长度
switch (Port)
{
case UART_DEV_1:
//JZSDK_LOG_INFO("串口-设备1号,接受到数据+未处理数据的长度len: %d", DataLen);
break;
case UART_DEV_2:
//JZSDK_LOG_INFO("串口-设备2号,接受到数据+未处理数据的长度len: %d", DataLen);
break;
case UART_4G:
//JZSDK_LOG_INFO("串口-4G模块,接受到数据+未处理数据的长度len: %d", DataLen);
break;
case HAL_DATA_TRANSMISSION:
//JZSDK_LOG_INFO("hal-数据传输,接受到数据+未处理数据的长度len: %d", DataLen);
break;
/********** 未报备的接口 ************/
default:
ResidualLength = 0;
return ResidualLength;
break;
}
//确保有数据传输进来
if (DataLen <= 0)
{
ResidualLength = 0;
return ResidualLength;
}
int HaveReadLen = 0; // 已读长度
int HaveDealLen = 0; // 已处理长度
int FrameFlag = 0x00; // 帧标志
int FrameLen = 0;
//将数据提取出来
for (HaveReadLen = 0; HaveReadLen <= (DataLen - 3); )
{
//查找是否存在 帧头
switch (Data[HaveReadLen])
{
case 0x5A:
{
if (Data[HaveReadLen + 1] == 0x5A && Data[HaveReadLen + 2] == 0x77)
{
FrameFlag = 0x5A;
}
else
{
FrameFlag = 0x00;
}
break;
}
case 0x5B:
{
if (Data[HaveReadLen + 1] == 0x5B && Data[HaveReadLen + 2] == 0x77)
{
FrameFlag = 0x5B;
}
else
{
FrameFlag = 0x00;
}
break;
}
case 0x6A:
{
if (Data[HaveReadLen + 1] == 0x6A && Data[HaveReadLen + 2] == 0x77)
{
FrameFlag = 0x6A;
}
else
{
FrameFlag = 0x00;
}
break;
}
case 0x6B:
{
if (Data[HaveReadLen + 1] == 0x6B && Data[HaveReadLen + 2] == 0x77)
{
FrameFlag = 0x6B;
}
else
{
FrameFlag = 0x00;
}
}
default:
FrameFlag = 0x00;
break;
}
if (FrameFlag == 0x00)
{
if (HaveReadLen >= (DataLen - 5))
{
//JZSDK_LOG_INFO("没有找到帧头");
}
HaveReadLen++;
continue;
}
//如果有帧头,则先判断前面有没有多余的数据残留,并将其移除
if (HaveReadLen > HaveDealLen)
{
//JZSDK_LOG_INFO("残余处理%d",(HaveReadLen - HaveDealLen));
HaveDealLen = HaveReadLen;
}
//检查帧长度是否超出数据剩余的内容
FrameLen = (((int)Data[HaveReadLen+3]) << 8) + (int)Data[HaveReadLen+4];
if (FrameLen > (DataLen - HaveReadLen))
{
//JZSDK_LOG_DEBUG("当前帧长度位长度%d 超出剩余帧长度%d ",FrameLen,(getbufLen - HaveReadLen));
// 直接跳出for循环
break;
}
//检查帧长度是否为0,避免卡死接收串口
if (FrameLen == 0)
{
JZSDK_LOG_ERROR("严重错误,接收到的帧出现长度为空");
//直接清空接收的数组
return 0;
}
//以上检查都没问题,则正常输出帧
//JZSDK_LOG_INFO("正常输出帧%d",FrameLen);
//UartDeal_Recv_Ouput(type, Uart_fd, &getbuf[HaveReadLen], FrameLen);
HaveReadLen = HaveReadLen + FrameLen;
HaveDealLen = HaveReadLen;
JZSDK_LOG_INFO("Prot:%x f_len%d h_r%d [h_r]:%x get%d",Port,FrameLen ,HaveReadLen, getbuf[HaveReadLen-1], DataLen);
FrameLen = 0;
FrameFlag = 0;
}
// 如果没有数据残留了
if (HaveDealLen >= DataLen)
{
//printf("HaveReadLen:%d HaveDealLen%d getbufLen:%d\n",HaveReadLen,HaveDealLen,getbufLen);
ResidualLength = 0;
return ResidualLength;
}
else
{
}
return ResidualLength;
}
static T_JZsdkReturnCode