📄 zb.lst
字号:
192 函数名 : ZB_Rx
193 功能 : 载波接收数据
194 输入 : 无
195 输出 : 无
196 ===============================================*/
197 {
198 1 if (1 == ZB_GetSyncFlag){ /*接收头标志*/
199 2
200 2 ZB_HeadDat <<= 1;
201 2 if (1 == ZB_RS){ /*判断P3.7,载波数据收发位*/
202 3 ZB_HeadDat |= 1;
203 3 }
204 2
205 2 if (0x09af == ZB_HeadDat){ /*同步头接收成功*/
206 3
207 3 LED_ZB = 0; /*开载波接收指示灯*/
208 3
209 3 ZB_GetSyncFlag = 0;
210 3 ZB_GetDatFlag = 1;
211 3 }
212 2 }else if (1 == ZB_GetDatFlag){ /*开始接收数据部分*/
213 2 ZB_RcvByte <<= 1;
214 2
215 2 if (1 == ZB_RS){
216 3 ZB_RcvByte |= 1;
217 3 }
218 2
219 2 ZB_BitCnt ++;
220 2 if (ZB_BitCnt == 8){
221 3 ZB_BitCnt = 0;
222 3 ZB_GetSuccessFlag = 1;
223 3 }
224 2 }
225 1
226 1 if (ZB_GetSuccessFlag){ /*接收一个字节成功*/
227 2 ZB_GetSuccessFlag = 0;
228 2
229 2 switch (ZB_Com.RxPhase){
230 3
231 3 case 0:/*第一起始符*/
232 3 if (0xfe == ZB_RcvByte){
233 4 ZB_Com.RxPhase = 0;
234 4 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
235 4 }else if (0x68 == ZB_RcvByte){
236 4 ZB_Com.RxPhase = 2;
237 4 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
238 4 }else if ((0x14 == ZB_RcvByte)||(0x24 == ZB_RcvByte)||(0x16 == ZB_RcvByte)||(0x10 == ZB_Rc
-vByte)){
239 4 ZB_Com.RxPhase = 1;
240 4 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
C51 COMPILER V8.08 ZB 02/17/2009 12:58:31 PAGE 5
241 4 }else{
242 4 ZB_Com.RxErr = 1;
243 4 }
244 3 break;
245 3
246 3 case 1:/*浩迪规约第二起始符*/
247 3 if ((0x11 == ZB_RcvByte)||(0xee == ZB_RcvByte)){
248 4 ZB_Com.RxPhase = 2;
249 4 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
250 4 }else{
251 4 ZB_Com.RxErr = 1;
252 4 }
253 3 break;
254 3
255 3 case 2:/*地址域*/
256 3 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
257 3 ZB_Com.AdrLenCnt ++;
258 3 if (6 == ZB_Com.AdrLenCnt){
259 4 ZB_Com.AdrLenCnt = 0;
260 4 ZB_Com.RxPhase = 3;
261 4 }else if (ZB_Com.AdrLenCnt > 6){/*为了防止不可预知的错误*/
262 4 ZB_Com.RxErr = 1;
263 4 }
264 3 break;
265 3
266 3 case 3:/*数据起始符*/
267 3 if (0x68 == ZB_RcvByte){
268 4 ZB_Com.RxPhase = 4;
269 4 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
270 4 }else if (0xaa == ZB_RcvByte){
271 4 ZB_Com.RxPhase = 4;
272 4 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
273 4 }else{
274 4 ZB_Com.RxErr = 1;
275 4 }
276 3 break;
277 3
278 3 case 4:/*控制码*/
279 3 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
280 3 ZB_Com.RxPhase = 5;
281 3 break;
282 3
283 3 case 5:/*数据长度*/
284 3 if (30 > ZB_RcvByte){/*最长数据为20个字节*/
285 4 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
286 4 ZB_Com.RxDatLen = ZB_RcvByte;
287 4 ZB_Com.RxPhase = 6;
288 4 }else{
289 4 ZB_Com.RxErr = 1;
290 4 }
291 3 break;
292 3
293 3 case 6:/*数据域*/
294 3 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
295 3 ZB_Com.DatLenCnt ++;
296 3 if (ZB_Com.DatLenCnt == ZB_Com.RxDatLen){
297 4 ZB_Com.RxPhase = 7;
298 4 ZB_Com.DatLenCnt = 0;
299 4 ZB_Com.RxDatLen = 0;
300 4 }else if (ZB_Com.DatLenCnt > ZB_Com.RxDatLen){/*为了防止不可预知的错误*/
301 4 ZB_Com.RxErr = 1;
302 4 }
C51 COMPILER V8.08 ZB 02/17/2009 12:58:31 PAGE 6
303 3 break;
304 3
305 3 case 7:/*校验码*/
306 3 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
307 3 ZB_Com.RxPhase = 8;
308 3 break;
309 3
310 3 case 8:/*结束符*/
311 3 if (0x16 == ZB_RcvByte){
312 4 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
313 4 ZB_Com.RxPhase = 0;
314 4
315 4 UART0_SendFlag = 1;
316 4 UART0_MaxLen = ZB_MaxLen;
317 4 ZB_MaxLen = 0;
318 4
319 4 ZB_GetSyncFlag = 1;
320 4 ZB_GetDatFlag = 0;
321 4
322 4 LED_ZB = 1;
323 4 }else if (0xff == ZB_RcvByte){
324 4 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
325 4 ZB_Com.RxPhase = 9;
326 4 }else{
327 4 ZB_Com.RxErr = 1;
328 4 }
329 3 break;
330 3
331 3 case 9:/*浩迪CRC校验*/
332 3 COM_DatBuf[ZB_MaxLen ++] = ZB_RcvByte;
333 3 ZB_Com.CrcLenCnt ++;
334 3 if (ZB_Com.CrcLenCnt == 2){
335 4 ZB_Com.RxPhase = 0;
336 4 ZB_Com.CrcLenCnt = 0;
337 4
338 4 UART0_SendFlag = 1;
339 4 UART0_MaxLen = ZB_MaxLen;
340 4 ZB_MaxLen = 0;
341 4
342 4 ZB_GetSyncFlag = 1;
343 4 ZB_GetDatFlag = 0;
344 4
345 4 LED_ZB = 1;
346 4 }else if (ZB_Com.CrcLenCnt > 2){/*为了防止不可预知的错误*/
347 4 ZB_Com.RxErr = 1;
348 4 }
349 3 break;
350 3
351 3 default:
352 3 break;
353 3 }
354 2
355 2 if (ZB_Com.RxErr){/*如果帧接收有错误*/
356 3 ZB_Com.RxErr = 0;
357 3 ZB_Com.RxPhase = 0;
358 3 ZB_Com.RxDatLen = 0;
359 3 ZB_Com.DatLenCnt = 0;
360 3 ZB_Com.CrcLenCnt = 0;
361 3 ZB_Com.AdrLenCnt = 0;
362 3
363 3 ZB_GetSyncFlag = 1;
364 3 ZB_GetDatFlag = 0;
C51 COMPILER V8.08 ZB 02/17/2009 12:58:31 PAGE 7
365 3
366 3 ZB_MaxLen = 0;
367 3
368 3 LED_ZB = 1;
369 3 }
370 2 }
371 1 }
372
373
374
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 741 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 20 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -