📄 hdlc.lst
字号:
442 3 default:
443 3
444 3 break;
445 3 }
446 2
447 2 /* 调整L2接收指针 */
448 2 m_sL2Que.ucRxDealIndex++;
449 2 m_sL2Que.ucRxDealIndex = m_sL2Que.ucRxDealIndex%L2RXBUFNUM;
450 2 m_sL2Que.ucRxPendNum--;
451 2 }
452 1
453 1 return;
454 1 }
455
456 /********************************************************************************/
457 /* 函数名称:void CheckTxL2Layer(void) */
458 /* 简要描述:监测链路层L2发送通讯函数 */
459 /* */
460 /* 时 间:2002年02月21日 */
461 /********************************************************************************/
462 void CheckTxL2Layer(void)
463 {
464 1 uchar data i;
465 1
466 1 /* 看门狗 */
467 1 WATCHDOG = ~WATCHDOG;
468 1
469 1 /* 发送部分L3-->L2,I帧 */
470 1 if( (m_sL2Que.ucLinkState == DL_ESTABLISH) && (m_sL3Que.ucTxPendNum > 0) )
471 1 {
472 2 /* 链路已建立且L3尚有发送帧需处理 */
473 2 if(m_sL2Que.ucTxPendNum <= L2TXBUFNUM)
474 2 {
475 3 /* 链路已建立且链路层发送队列未满 */
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 9
476 3 if(m_sL2Que.ucTxIFrameStatus == IDLE) /* 可发送且 */
477 3 {
478 4 /* 当前没有I帧在发送 */
479 4 if(m_sL2Que.ucRSendFlag == FALSE) /* 首次发送部分 */
480 4 {
481 5 /* 数据包从L3缓冲区移至L2缓冲区 */
482 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength = L3TxBuf[m_sL3Que.ucTxDealIndex].ucLength+
-4;
483 5
484 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;
-
485 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;
-
486 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID = IFRAME_CONTROL;
-
487 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2 = 0;
-
488 5
489 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[0] = L3TxBuf[m_sL3Que.ucTxDealIndex].ucPID;
490 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[1] = L3TxBuf[m_sL3Que.ucTxDealIndex].ucLength;
491 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[2] = (L3TxBuf[m_sL3Que.ucTxDealIndex].uiType>>
-8)&0xff;
492 5 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[3] = (L3TxBuf[m_sL3Que.ucTxDealIndex].uiType)&
-0xff;
493 5
494 5 for(i=4;i<L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength-4;i++)
495 5 {
496 6 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[i] = L3TxBuf[m_sL3Que.ucTxDealIndex].ucDat
-a[i-4];
497 6 }
498 5
499 5 /* 剩余部分填充0 */
500 5 for(i=L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength-4;i<BUFSIZE-4;i++)
501 5 {
502 6 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[i] = 0;
503 6 }
504 5
505 5 /* 调整L2指针 */
506 5 m_sL2Que.ucTxPlaceIndex++;
507 5 m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
508 5 m_sL2Que.ucTxPendNum++;
509 5
510 5 /* 首次发送,置相关参数 */
511 5 m_sL2Que.ucTxIFrameStatus = BUSY;
512 5 m_sL2Que.ucRSendFlag = TRUE;
513 5 m_sL2Que.ucT201Control = ON;
514 5 m_sL2Que.ucT201 = 0;
515 5 m_sL2Que.ucN200 = 0;
516 5 }
517 4 }
518 3 else
519 3 {
520 4 /* 有I帧在发送 */
521 4 if(m_sL2Que.ucRSendFlag == TRUE) /* 重发部分 */
522 4 {
523 5 /* 需重发,不调整L3指针 */
524 5 if(m_sL2Que.ucN200 < (N200-1))
525 5 {
526 6 if(m_sL2Que.ucT201 > T201)
527 6 {
528 7 /* 定时到,重发 */
529 7 m_sL2Que.ucN200++; /* 重发计数 */
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 10
530 7 m_sL2Que.ucT201 = 0; /* 重发定时器清零 */
531 7
532 7
533 7 /* 数据包从L3缓冲区移至L2缓冲区 */
534 7 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength = L3RxBuf[m_sL3Que.ucTxDealIndex].u
-cLength+4;
535 7
536 7 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;
-
537 7 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;
-
538 7 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID = IFRAME_CONTROL;
-
539 7 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2 = 0;
-
540 7
541 7 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[0] = L3TxBuf[m_sL3Que.ucTxDealIndex].u
-cPID;
542 7 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[1] = L3TxBuf[m_sL3Que.ucTxDealIndex].u
-cLength;
543 7 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[2] = (L3TxBuf[m_sL3Que.ucTxDealIndex].
-uiType>>8)&0xff;
544 7 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[3] = (L3TxBuf[m_sL3Que.ucTxDealIndex].
-uiType)&0xff;
545 7
546 7 for(i=4;i<L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength-4;i++)
547 7 {
548 8 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[i] = L3TxBuf[m_sL3Que.ucTxDealInde
-x].ucData[i-4];
549 8 }
550 7
551 7 /* 剩余部分填充0 */
552 7 for(i=L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength-4;i<BUFSIZE-4;i++)
553 7 {
554 8 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucData[i] = 0;
555 8 }
556 7
557 7 /* 调整L2指针 */
558 7 m_sL2Que.ucTxPlaceIndex++;
559 7 m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
560 7 m_sL2Que.ucTxPendNum++;
561 7 }
562 6 }
563 5 else
564 5 {
565 6 /* 重发次数超出规定值 */
566 6 m_sL2Que.ucLinkState = DL_RELEASE;
567 6 m_sL2Que.ucTxIFrameStatus = IDLE; /* 弃掉当前处理的I帧 */
568 6 m_sL2Que.ucRSendFlag = FALSE;
569 6 m_sL2Que.ucT201Control = OFF;
570 6
571 6 /* 不再需要重发,调整L3指针 */
572 6 m_sL3Que.ucTxDealIndex++;
573 6 m_sL3Que.ucTxDealIndex = m_sL3Que.ucTxDealIndex%L3TXBUFNUM;
574 6 m_sL3Que.ucTxPendNum--;
575 6
576 6 }
577 5 }
578 4 else
579 4 {
580 5 /* 结束重发部分 */
581 5 m_sL2Que.ucTxIFrameStatus = IDLE; /* 弃掉当前处理的I帧 */
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 11
582 5 m_sL2Que.ucT201Control = OFF;
583 5
584 5 /* 不再需要重发,调整L3指针 */
585 5 m_sL3Que.ucTxDealIndex++;
586 5 m_sL3Que.ucTxDealIndex = m_sL3Que.ucTxDealIndex%L3TXBUFNUM;
587 5 m_sL3Que.ucTxPendNum--;
588 5 }
589 4 }
590 3 }
591 2 else
592 2 {
593 3 /* 链路层发送队列满 */
594 3 m_bL2TxErrorFlag = WRONG;
595 3 }
596 2 }
597 1
598 1 /* 发送部分L2,SABME帧 */
599 1 if(m_sL2Que.ucLinkState == DL_RELEASE) /* 尚未建立链路 */
600 1 {
601 2 if(m_sL2Que.ucRSendFlag == FALSE) /* 首次发送 */
602 2 {
603 3 m_sL2Que.ucRSendFlag = TRUE;
604 3 m_sL2Que.ucT201Control = ON;
605 3 m_sL2Que.ucT201 = 0;
606 3 m_sL2Que.ucN200 = 0;
607 3 }
608 2 else
609 2 {
610 3 /* 定时到发送SABME帧 */
611 3 if(m_sL2Que.ucT201 > T201)
612 3 {
613 4 m_sL2Que.ucT201 = 0; /* 重发定时器清零 */
614 4
615 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucLength = 4;
616 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[0] = 0;
-
617 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv1[1] = 0;
-
618 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucCRID = SABME_CONTROL;
-
619 4 L2TxBuf[m_sL2Que.ucTxPlaceIndex].ucRsv2 = 0;
-
620 4
621 4 /* 调整L2发送指针 */
622 4 m_sL2Que.ucTxPlaceIndex++;
623 4 m_sL2Que.ucTxPlaceIndex = m_sL2Que.ucTxPlaceIndex%L2TXBUFNUM;
624 4 m_sL2Que.ucTxPendNum++;
625 4 }
626 3 }
627 2 }
628 1
629 1
630 1 /* 发送部分L2-->L1 */
631 1 if(m_sL2Que.ucTxPendNum>0) /* L2尚有发送帧需处理 */
632 1 {
633 2 /* 数据包从L2缓冲区移至L1缓冲区 */
634 2 L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucLength = L2TxBuf[m_sL2Que.ucTxDealIndex].ucLength;
635 2 L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[0] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucRsv1[0];
636 2 L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[1] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucRsv1[1];
637 2 L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[2] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucCRID;
638 2 L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[3] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucRsv2;
639 2
C51 COMPILER V3.20, SN-0 HDLC 09/29/02 18:24:18 PAGE 12
640 2 for(i=4;i<L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucLength;i++)
641 2 {
642 3 L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[i] = L2TxBuf[m_sL2Que.ucTxDealIndex].ucData[i-4];
643 3 }
644 2 /* 剩余部分填充0 */
645 2 for(i=L1TxBuf[m_sL1Que.ucTxDealIndex].ucLength;i<BUFSIZE;i++)
646 2 {
647 3 L1TxBuf[m_sL1Que.ucTxPlaceIndex].ucData[i] = 0;
648 3 }
649 2
650 2 /* 调整指针 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -