📄 uart.lst
字号:
571 6 checksum=0;
572 6 while(SPIbuf[i]!=ETX)
573 6 {
574 7 checksum+=SPIbuf[i];
575 7 i++;
576 7 }
577 6 checksum+=SPIbuf[i]; // ETX
578 6
579 6 checksum=~checksum+1;
580 6
581 6 temp=(checksum&0xF0)>>4;
582 6 i++;
583 6 SPIbuf[i]=Hex_ascii(temp);
584 6
585 6 temp=checksum&0x0F;
586 6 i++;
587 6 SPIbuf[i]=Hex_ascii(temp);
588 6 i++;
589 6
590 6 COMENABLE; // 允许串口中断
591 6 Dir=1; // 485发送
592 6 time_out=120; // 1.2s转发完所有数据
593 6 trans_ctr=0; // 发送指针
594 6 trans_size=i+1; // 发送数据大小
595 6 SBUF=SPIbuf[0]; // 发送数据
596 6 comm_ok=TRUE; // 串口通信正常
597 6 while(trans_size)
598 6 {
599 7 if(time_out==0)
600 7 {
601 8 comm_ok=FALSE; // 串口通信失败
602 8 break;
603 8 }
604 7 } // 直到数据传输完毕
605 6 Dir=0; // 关闭485发送
606 6
607 6 if(comm_ok) // 通信正常
608 6 {
609 7 if(SPIbuf[7]=='D'&&SPIbuf[8]=='U'&&SPIbuf[9]=='T'&&SPIbuf[10]=='S')
610 7 {
611 8 pulse=1;
612 8 if(wieformat==1) // 自定义门禁方式
613 8 white_bill_reg(); // 注册白名单
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 11
614 8 }
615 7
616 7 if(SPIbuf[7]=='U'&&SPIbuf[8]=='U'&&SPIbuf[9]=='T'&&SPIbuf[10]=='S')
617 7 pulse=1;
618 7 }
619 6
620 6 ClearRcvBuf(); // 清接收缓冲区
621 6 }
622 5 else
623 5 sendmessage(NAK); // SPI发送超时失败
624 5 }
625 4 }
626 3 else // 小数据量命令模式
627 3 {
628 4 if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='M')&&(recv_buf[COMMAND_PTR+2]=='T'))
629 4 {
630 5 for(i=0;i<15;i++)
631 5 {
632 6 cur_time[i]=recv_buf[COMMAND_PTR+3+i];
633 6 set_time(); // 设置系统时间
634 6 }
635 5
636 5 sendmessage(ACK); // 发送ACK,告诉主机正常执行
637 5 }
638 4 else if((recv_buf[COMMAND_PTR]=='G')&&(recv_buf[COMMAND_PTR+1]=='R')&&(recv_buf[COMMAND_PTR+2]=='R'))
639 4 {
640 5 sendmessage(RTL); // 发送实时信息
641 5 }
642 4 else if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='C')
643 4 &&(recv_buf[COMMAND_PTR+2]=='S')&&(recv_buf[COMMAND_PTR+3]=='S'))
644 4 {
645 5 sendmessage(ACK); // 发送ACK,告诉主机正常执行
646 5
647 5 if(comm_ok) // 通信正常
648 5 maxtrans=FALSE; // 切换为小数据量传输
649 5 }
650 4 else if((recv_buf[COMMAND_PTR]=='S')&&(recv_buf[COMMAND_PTR+1]=='C')
651 4 &&(recv_buf[COMMAND_PTR+2]=='S')&&(recv_buf[COMMAND_PTR+3]=='L'))
652 4 {
653 5 sendmessage(ACK); // 发送ACK,告诉主机正常执行
654 5
655 5 if(comm_ok) // 通信正常
656 5 maxtrans=TRUE; // 切换为大数据量传输
657 5 }
658 4 else
659 4 sendmessage(NAK); // 命令不支持
660 4 }
661 3 }
662 2 }
663 1 }
664
665 ///////////////////////////////////////////////////////////////////////////////
666 // 设置波特率
667 ///////////////////////////////////////////////////////////////////////////////
668 void Baud_Init()
669 {
670 1 switch(baudrate)
671 1 {
672 2 case 0:
673 2 TR2=0; // 关闭T2定时器
674 2 TH2 = 0xff ;
675 2 TL2 = 0x70; // 波特率设为4800bps
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 12
676 2 RCAP2H=0xff;
677 2 RCAP2L=0x70;
678 2 TR2 = 1; // 允许T2中断
679 2 break;
680 2 case 1:
681 2 TR2=0; // 关闭T2定时器
682 2 TH2 = 0xff ;
683 2 TL2 = 0xb8; // 波特率设为9600bps
684 2 RCAP2H=0xff;
685 2 RCAP2L=0xb8;
686 2 TR2 = 1; // 允许T2中断
687 2 break;
688 2 case 2:
689 2 TR2=0; // 关闭T2定时器
690 2 TH2 = 0xff ;
691 2 TL2 = 0xdc; // 波特率设为19200bps
692 2 RCAP2H=0xff;
693 2 RCAP2L=0xdc;
694 2 TR2 = 1; // 允许T2中断
695 2 break;
696 2 case 3:
697 2 TR2=0; // 关闭T2定时器
698 2 TH2 = 0xff ;
699 2 TL2 = 0xee; // 波特率设为38400bps
700 2 RCAP2H=0xff;
701 2 RCAP2L=0xee;
702 2 TR2 = 1; // 允许T2中断
703 2 break;
704 2 case 4:
705 2 TR2=0; // 关闭T2定时器
706 2 TH2 = 0xff ;
707 2 TL2 = 0xf4; // 波特率设为57600bps
708 2 RCAP2H=0xff;
709 2 RCAP2L=0xf4;
710 2 TR2 = 1; // 允许T2中断
711 2 break;
712 2 case 5:
713 2 TR2=0; // 关闭T2定时器
714 2 TH2 = 0xff ;
715 2 TL2 = 0xfa; // 波特率设为115200bps
716 2 RCAP2H=0xff;
717 2 RCAP2L=0xfa;
718 2 TR2 = 1; // 允许T2中断
719 2 break;
720 2 default:
721 2 break;
722 2 }
723 1 }
724
725 ///////////////////////////////////////////////////////////////////////////////
726 // 清接收缓冲区
727 ///////////////////////////////////////////////////////////////////////////////
728 void ClearRcvBuf()
729 {
730 1 idata uint i;
731 1
732 1 COMDISABLE; // 不允许串口再接收数据
733 1 if(maxtrans)
734 1 {
735 2 for(i=0; i<BUFSIZE; i++)
736 2 SPIbuf[i]=0x00;
737 2 }
C51 COMPILER V7.07 UART 09/14/2005 15:20:57 PAGE 13
738 1 else
739 1 {
740 2 for(i=0; i<RCVBUFSIZE; i++)
741 2 recv_buf[i]=0x00;
742 2 }
743 1
744 1 recv_ctr=0;
745 1 COMENABLE; // 允许串口接收数据
746 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 2296 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- 18
BIT SIZE = ---- 5
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -