📄 mmm.lst
字号:
264 5 CALL_isr_T0() ;
265 5 };
266 4 break;
267 4
268 4 case RECV_ADDR0:
269 4 if (c == ADDR)//0xd2)//MeterNum.chrX[3])
270 4 {
271 5 RecvState = RECV_ADDR1;
272 5 START_T0(T_533_ms);
273 5 }
274 4 else
275 4 {
276 5 CALL_isr_T0() ;
277 5 };
278 4 break;
279 4 case RECV_ADDR1:
280 4 if (c == 0x02)//MeterNum.chrX[2])
281 4 {
282 5 RecvState = RECV_ADDR2;
283 5 START_T0(T_533_ms);
284 5 }
285 4 else
286 4 {
287 5 CALL_isr_T0() ;
288 5 };
289 4 break;
290 4 case RECV_ADDR2:
291 4 if (c == 0x96)//MeterNum.chrX[1])
292 4 {
293 5 RecvState = RECV_ADDR3;
294 5 START_T0(T_533_ms);
295 5 }
296 4 else
297 4 {
298 5 CALL_isr_T0() ;
299 5 };
C51 COMPILER V7.05 MMM 03/01/2002 11:48:58 PAGE 6
300 4 break;
301 4
302 4 case RECV_ADDR3:
303 4 if (c ==0x49) //MeterNum.chrX[0])
304 4 {
305 5 // LED_RED = ~LED_RED;
306 5 En485 = SEND;
307 5 //Ir_En = SEND;
308 5 SBUF = DLE ;
309 5 RecvState = RECV_DATA_DLE_ETX;
310 5 DataDleReceived = FALSE;
311 5 Index = 0;
312 5 Cmdok = FALSE;
313 5
314 5 while( !TI );
315 5 TI = FALSE;
316 5 En485 = RECV;
317 5 //Ir_En = RECV;
318 5 START_T0(T_533_ms);
319 5 }
320 4 else
321 4 {
322 5 CALL_isr_T0() ;
323 5 };
324 4 break;
325 4
326 4 case RECV_DATA_DLE_ETX:// Receive data,DEL,ETX and answer DLE
327 4 if (c == DLE)
328 4 {
329 5 if (!DataDleReceived) //如果上一个不是DLE 丢掉
330 5 {
331 6 DataDleReceived = TRUE;
332 6 RecvState = RECV_DATA_DLE_ETX;
333 6 START_T0(T_533_ms);
334 6 break;
335 6 }
336 5 else //如果上一个是DLE
337 5 {
338 6 DataDleReceived = FALSE; //留下
339 6 };
340 5 }
341 4 else if (c == ETX)
342 4 {
343 5 if (DataDleReceived) //如果是结束标记 处理
344 5 {
345 6 DataDleReceived = FALSE;
346 6
347 6 bcc = 0;
348 6 for (i = 0; i < Index; i++)
349 6 {
350 7 bcc ^= SerBuffer[i];
351 7 } ;
352 6
353 6 if( bcc == 0)
354 6 { En485 = SEND;
355 7 //Ir_En = SEND;
356 7 Cmdok = TRUE;
357 7 SBUF = DLE ;
358 7 while( !TI );
359 7 TI = FALSE;
360 7 En485 = RECV;
361 7 //LED_RED = ~LED_RED;
C51 COMPILER V7.05 MMM 03/01/2002 11:48:58 PAGE 7
362 7 //Ir_En = RECV;
363 7 }
364 6 else
365 6 { En485 = SEND;
366 7 //Ir_En = SEND;
367 7 Cmdok = FALSE;
368 7 SBUF = NAK ;
369 7 while( !TI );
370 7 TI = FALSE;
371 7 En485 = RECV;
372 7 //Ir_En = RECV;
373 7 };
374 6 RecvState=RECV_STX;
375 6 break;
376 6 }
377 5 else
378 5 {
379 6 DataDleReceived = FALSE; //如果不是结束标记 留下
380 6 };
381 5 };
382 4
383 4 if (Index < SERBUFLEN) //将数据写入SerBuffer[]
384 4 {
385 5 SerBuffer[Index++] = c;
386 5 };
387 4 RecvState = RECV_DATA_DLE_ETX;
388 4 START_T0(T_533_ms);
389 4 break;
390 4
391 4 case RECV_DLE: //Recieve answer from HOST
392 4 if ( c == DLE)
393 4 {
394 5 En485 = SEND;
395 5 //Ir_En = SEND;
396 5 for (i = 0; i < (3 + SerBuffer[2] +1); i++) //send data
397 5 {
398 6 SBUF = SerBuffer[i];
399 6 while (!TI);
400 6 TI = FALSE;
401 6 if ( SerBuffer[i] == DLE ) //send DLE two
402 6 {
403 7 SBUF = DLE;
404 7 while (!TI);
405 7 TI = FALSE;
406 7 };
407 6 };
408 5
409 5 SBUF = DLE; //send END
410 5 while (!TI);
411 5 TI = FALSE;
412 5
413 5 SBUF = ETX;
414 5 while (!TI);
415 5 TI = FALSE;
416 5 RecvState = RECV_DLE_OR_NAK ;
417 5 START_T0(T_533_ms);
418 5 En485 = RECV;
419 5 //Ir_En = RECV;
420 5 }
421 4 else
422 4 {
423 5 CALL_isr_T0() ;
C51 COMPILER V7.05 MMM 03/01/2002 11:48:58 PAGE 8
424 5 };
425 4 break;
426 4
427 4 case RECV_DLE_OR_NAK: //Recieve answer from HOST
428 4 if ( c == DLE)
429 4 {
430 5 SendOk = TRUE;
431 5 SendReady = FALSE;
432 5 RecvReady = TRUE;
433 5 RecvState = RECV_STX;
434 5 }
435 4 else
436 4 {
437 5 SendOk = FALSE;
438 5 SendReady = TRUE;
439 5 RecvReady = FALSE;
440 5 CALL_isr_T0() ;
441 5 };
442 4 En485 = RECV;
443 4 //Ir_En = RECV;
444 4 break;
445 4
446 4 default:
447 4 CALL_isr_T0() ;
448 4 break;
449 4
450 4 };//end of case
451 3 } //end of if(RecvReady)
452 2 };//end of if(RI)
453 1
454 1
455 1 if ( TI && !RI )
456 1 {
457 2 TI = 0 ;
458 2 if ( SendReady )
459 2 {
460 3 SendReady = FALSE ;
461 3
462 3 bcc = SerBuffer[0]; //计算BCC
463 3 for ( i = 1 ; i < SerBuffer[2]+3 ; i++ )
464 3 {
465 4 bcc = bcc ^ SerBuffer[i] ;
466 4 };
467 3 SerBuffer[SerBuffer[2]+3] = bcc;
468 3 En485 = SEND;
469 3 //Ir_En = SEND;
470 3 SBUF = STX ; //发送起始位}
471 3 RecvReady = TRUE ;
472 3 RecvState = RECV_DLE ; //准备接收应答
473 3 // LED_GREEN = ~LED_GREEN;
474 3 while(!TI) ;
475 3 TI = FALSE ;
476 3 En485 = RECV;
477 3 //Ir_En = RECV;
478 3 START_T0(T_533_ms) ; //chao shi
479 3 } ;
480 2 };
481 1
482 1 }
483 /*************************原有的函数需改变*************************************
484 * *
485 * Function: isr_timer0 *
C51 COMPILER V7.05 MMM 03/01/2002 11:48:58 PAGE 9
486 * *
487 * Input: - *
488 * Output: - *
489 * *
490 * Description: *
491 * *
492 * *
493 ****************************************************************************/
494 void isr_timer0(void) interrupt 1 using 0
495 {
496 1 //TR0=0;
497 1 if(com2)
498 1 {
499 2 if(RXTimerOUT!=0) //此if{}else{} 为新加入的判断超时功能
500 2 {
501 3 RXTimerOUT--;
502 3 }
503 2 else
504 2 {
505 3
506 3 RXSTAT=0;
507 3 RXNOM=0;
508 3 }
509 2 }//end ifcom2
510 1
511 1 if(com1)
512 1 {
513 2 if ( Timer0Cnt != 0 )
514 2 {
515 3 --Timer0Cnt;
516 3 }
517 2 else
518 2 {
519 3 TR0 = 0 ;
520 3 if ((RecvState == RECV_DLE) || (RecvState == RECV_DLE_OR_NAK)) //发送起始字超时
521 3 {
522 4 ErrorCount++;
523 4 if ( ErrorCount <= 1)
524 4 {
525 5 SendReady = TRUE;
526 5 TI = 1;
527 5 }
528 4 else
529 4 {
530 5 ErrorCount = 0 ;
531 5 SendReady = FALSE;
532 5 RecvReady = TRUE;
533 5 RecvState = RECV_STX;
534 5 En485 = RECV;
535 5 //Ir_En = RECV;
536 5
537 5 }
538 4 }
539 3 else //接收超时
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -