📄 zhu19200.lst
字号:
600 3 }
601 2 BaudAnsFlag = 1; //波特率修改标志位置一
602 2 ReceCheck = 4096 * toint(ReceSbuf1[27]) + 256 * toint(ReceSbuf1[28]) + 16 * toint(ReceSbuf1[29]) + toin
-t(ReceSbuf1[30]);
603 2 switch( ReceCheck ) //是否是正确的波特率
604 2 {
605 3 case 1200: NewBaud=1;break;
606 3 case 2400: NewBaud=2;break;
607 3 case 4800: NewBaud=3;break;
608 3 case 9600: NewBaud=4;break;
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 11
609 3 case 19200: NewBaud=5;break;
610 3 default :
611 3 state= 06 ;
612 3 NewBaud = 0;
613 3 BaudAnsFlag = 0;
614 3 break;
615 3 }
616 2 portBaud = 1 ; //要修改波特率的串口
617 2 break;
618 2 case RTdataCom: //实时数据命令
619 2 if(DuanKaiTiao&&JiaoTiFlag) //有断开历史记录,该发送断开历史记录
620 2 {
621 3 JiaoTiFlag = 0; //实时历史记录交替发送标志位
622 3 AddLed=(AddLed&0xF0)+DuanKaiZhi/64; //确定扇区
623 3 ledled = AddLed; //选通扇区
624 3 kk0=DuanKaiZhi%64*0x400; //第几条,哪k
625 3 if(DuanKaiZhi%64<8)
626 3 {
627 4 for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
628 4 {
629 5 RamRom_Convert= 0;//切换为RAM628512操作
630 5 RamIO_Convert = 0;
631 5 data00=XBYTE[kk0+kk];//切换
632 5 RamRom_Convert= 1;//切换为RAM628128及IO口操作
633 5 RamIO_Convert = 1;
634 5 SendSbuf1[kk]=data00; //
635 5 }
636 4 }
637 3 else
638 3 {
639 4 RamRom_Convert= 1;//切换为RAM628128及IO口操作
640 4 RamIO_Convert = 0;
641 4 for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
642 4 {
643 5 SendSbuf1[kk]=XBYTE[kk0+kk]; //
644 5 }
645 4 }
646 3 RamRom_Convert= 1;//切换为RAM628128及IO口操作
647 3 RamIO_Convert = 1;
648 3 SendSbuf1[32+AIDIsum]='\n'; //字符结束符
649 3 DuanKaiTiao--; //调整断开历史记录条数
650 3 if(DuanKaiZhi) //调整断开历史记录存放位置
651 3 {
652 4 DuanKaiZhi--;//
653 4 }
654 3 else
655 3 {
656 4 DuanKaiZhi=DuanKaiRongL-1; //断开历史记录条数容量
657 4 }
658 3 bNeedSend1 = 1; //启动发送
659 3 ReceCount1 = 0; //串口1接收计数器清零
660 3 memset( ReceSbuf1, 0, 20 ); //串口1接收缓冲区清零
661 3 return;
662 3 }
663 2 else //没有断开历史记录,断开后第一次连上发送实时数据,一条实时,一条历史
664 2 {
665 3 JiaoTiFlag = 1; //实时历史记录交替发送标志位
666 3 TemLen=32+AIDIsum; //
667 3 typeCom = RTdataAns;
668 3 memcpy( SendSbuf1+27,RealTimeData,AIDIsum+12 );//读取实时数据(包括AIDI标志字符)
669 3 }
670 2 break;
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 12
671 2 case ControlCom: //遥调遥控命令
672 2 typeCom = ControlAns;
673 2 ReceConFlag = 1; //收到控制标志位(闪灯用)
674 2 TemLen = 20 + 22; //
675 2 for( i = 27;i < 37;i++) //保存参数
676 2 {
677 3 SendSbuf1[i] = ReceSbuf1[i];
678 3 }
679 2 DotType = 16*toint(ReceSbuf1[27]) + toint(ReceSbuf1[28]); //测点类型
680 2 DotChunnel = 16*toint(ReceSbuf1[31]) + toint(ReceSbuf1[32]); //接收测点号(测点号不大0xFF)
681 2 controlFlag = 1; //要发控制标志位置一
682 2 if( DotType == TypeAO ) //测点量测试
683 2 {
684 3 if(DotChunnel>AOsum-1) //?????????是否减1
685 3 {
686 4 state=0x08; //参数出错
687 4 controlFlag = 0;
688 4 }
689 3 DotModule = 0x1F-B33ID; //测点模块
690 3 }
691 2 else if( DotType == TypeDO )
692 2 {
693 3 if( DotChunnel>DOsum-1) //?????????是否减1
694 3 {
695 4 state=0x08; //参数出错
696 4 controlFlag = 0;
697 4 }
698 3 for( j = 0;j < Broadsum;j++ )
699 3 {
700 4 if( DotChunnel < DOarr[j] )
701 4 {
702 5 DotModule=j; //查找到模块地址
703 5 break;
704 5 }
705 4 else
706 4 { DotChunnel-=DOarr[j];}
707 4 }
708 3 } //测点号错
709 2 else //测点类型校验
710 2 {
711 3 state=0x07; //测点类型出错
712 3 controlFlag = 0;
713 3 }
714 2 Dotparam = 4096 * toint(ReceSbuf1[33])+256 * toint(ReceSbuf1[34]) + 16 * toint(ReceSbuf1[35]) + toint(R
-eceSbuf1[36]);
715 2 break;
716 2 case HistoryNuCom: //查询历史记录条数
717 2 typeCom = HistoryNuAns;
718 2 TemLen= 20 + 12 + 4; //数据包长度
719 2 if(ZhengChTiao>ZhengChRongL)
720 2 {
721 3 memcpy(SendSbuf1+27,"0000",4);
722 3 state = 6; //参数出错
723 3 ZhengChZhi=0;
724 3 ZhengChTiao=0;
725 3 }
726 2 else
727 2 {
728 3 hex2asc1( SendSbuf1+27,ZhengChTiao); //曲线历史记录条数
729 3 }
730 2 break;
731 2 case HistoryNoCom: //查询第n条曲线历史记录
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 13
732 2 kk = 0;
733 2 for(i=0;i<4;i++)//存放地址
734 2 {
735 3 kk=kk*16+toint(ReceSbuf1[27+i]);
736 3 }
737 2 if(kk>=ZhengChTiao)
738 2 {
739 3 TemLen= 20 + 12 + 4; //数据包长度
740 3 typeCom=HistoryNoAns;
741 3 state=6;
742 3 break;
743 3 }
744 2 AddLed=kk/64+4+(AddLed&0xF0); //选通扇区
745 2 ledled=AddLed; //选通扇区
746 2 kk0 = kk%64*0x400; //第几条,哪k
747 2 if(kk%64<8)
748 2 {
749 3 for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
750 3 {
751 4 RamRom_Convert= 0;//切换为RAM628512操作
752 4 RamIO_Convert = 0;
753 4 data00=XBYTE[kk0+kk];//切换
754 4 RamRom_Convert= 1;//切换为RAM628128及IO口操作
755 4 RamIO_Convert = 1;
756 4 SendSbuf1[kk]=data00; //
757 4 }
758 3 }
759 2 else
760 2 {
761 3 RamRom_Convert= 1;//切换为RAM628128及IO口操作
762 3 RamIO_Convert = 0;
763 3 for(kk=0;kk<33+AIDIsum;kk++)//断开历史记录COPY到发送缓冲区
764 3 {
765 4 SendSbuf1[kk]=XBYTE[kk0+kk];
766 4 }
767 3 }
768 2 RamRom_Convert= 1;//切换为RAM628128及IO口操作
769 2 RamIO_Convert = 1;
770 2 SendSbuf1[32+AIDIsum]='\n'; //发送结束符
771 2 bNeedSend1 = 1; //启动发送
772 2 ReceCount1 = 0; //串口1接收计数器清零
773 2 memset( ReceSbuf1, 0, 20 ); //串口1接收缓冲区清零
774 2 return; //切换取出曲线历史记录送发送缓冲区
775 2 default :
776 2 state = 3; //命令类型有错
777 2 break;
778 2 }
779 1 SendSbuf1[0] = 0x7E; //起始符
780 1 SendSbuf1[1] = VERh; //版本号
781 1 SendSbuf1[2] = VERl; //版本号
782 1 SendSbuf1[3] = 0x30; //扩展地址(随意)
783 1 SendSbuf1[4] = 0x30;
784 1 hex2asc0( SendSbuf1 + 5, Read_ID() ); //采集箱地址
785 1 hex2asc0( SendSbuf1 + 7, typeCom ); //命令类型
786 1 hex2asc0( SendSbuf1 + 9, state ); //返回状态
787 1 hex2asc1( SendSbuf1 + 11, TemLen-20 ); //数据块长度
788 1 memcpy( SendSbuf1+15, ReceSbuf1+15, 12);//日期时间
789 1 SumCheck=CrcCheck(SendSbuf1+1,TemLen-6);//计算CRC
790 1 hex2asc1( SendSbuf1+TemLen-5,SumCheck); //CRC校验
791 1 SendSbuf1[TemLen-1] = '\r'; //结束符
792 1 SendSbuf1[TemLen] = '\n'; //停止发送符
793 1 bNeedSend1 = 1; //启动发送
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 14
794 1 ReceCount1 = 0; //串口1接收计数器清零
795 1 memset( ReceSbuf1, 0, 20 ); //串口1接收缓冲区清零
796 1 }
797
798 void Analyse2()
799 {
800 1 uchar data j,i,data00;
801 1 uint data kk,TemLen,kk0;
802 1 uchar length, readID, state, typeCom, ReceLen, RTclock[6];
803 1 uint SumCheck, ReceCheck;
804 1 ReceEndFlag2=0;
805 1
806 1 if( ReceSbuf2[0] != 0x7E ) //没有数据包头
807 1 {
808 2 memset( ReceSbuf2, 0, 50 ); //串口2接收缓冲区清零
809 2 ReceCount2 = 0; //串口2接收计数器清零
810 2 return;
811 2 }
812 1
813 1 for( i = 0;i < MaxRece2;i++ ) //计算包长度
814 1 {
815 2 if( ReceSbuf2[i] == '\r')
816 2 {
817 3 length = i+1;
818 3 break;
819 3 }
820 2 }
821 1 if( length < 10 && length > 60 ) //无效数据包
822 1 {
823 2 memset( ReceSbuf2, 0, 50 ); //串口2接收缓冲区清零
824 2 ReceCount2 = 0; //串口2接收计数器清零
825 2 return;
826 2 }
827 1 readID = toint( ReceSbuf2[5] ) * 16 + toint( ReceSbuf2[6] );
828 1 if( readID != Read_ID() )
829 1 {
830 2 memset( ReceSbuf2, 0, 50 ); //串口2接收缓冲区清零
831 2 ReceCount2 = 0; //串口2接收计数器清零
832 2 return; //采集箱的ID号校验
833 2 }
834 1 SendSbuf2[SendCount2++] = '\r'; //结束上次发送(最好发送)
835 1 SendSbuf2[SendCount2] = '\n'; //结束上次发送(结束发送)
836 1 state = 0; //返回状态
837 1 if( ReceSbuf2[0] != 0x7E ) state = 1; //起始符校验
838 1 if( ReceSbuf2[1] != VERh && ReceSbuf2[2] != VERl)
839 1 { //版本号校验
840 2 state = 2;
841 2 }
842 1 /*
843 1 if( ReceSbuf2[17] >0x31 || ReceSbuf2[19] >0x33 || ReceSbuf2[21] >0x36 || ReceSbuf2[23] >0x36 || Rece
-Sbuf2[25] >0x36)
844 1 {
845 1 state = 10; //日期时间错
846 1 return;
847 1 }
848 1 */
849 1 SumCheck=CrcCheck( ReceSbuf2+1,length-6 ); //计算CRC //接收CRC
850 1 ReceCheck=4096 * toint( ReceSbuf2[length-5] )+256 * toint( ReceSbuf2[length-4] )+16 * toint( ReceSbuf2[le
-ngth-3] )+toint( ReceSbuf2[length-2] );
851 1 if( SumCheck != ReceCheck ) state=5; //crc校验
852 1 ReceLen = 0x10*toint( ReceSbuf2[13] ) + toint( ReceSbuf2[14] );
853 1 if(ReceLen != length-20) state=4; //数据块长度
C51 COMPILER V6.02 ZHU19200 07/05/2004 14:20:33 PAGE 15
854 1 typeCom = 16 * toint( ReceSbuf2[7] ) + toint( ReceSbuf2[8] );
855 1 TemLen=0;
856 1 if(KaiJiShZhFlag) //开机时钟校正
857 1 {
858 2 for(i = 0;i < 12;) //更新时钟
859 2 {
860 3 RTclock[i/2]=16 * toint(ReceSbuf2[15+i]) + toint(ReceSbuf2[16+i]);
861 3 i+=2;
862 3 }
863 2 setup_write(); //设置实时时钟操作方式
864 2 clock_write(RTclock); //修改时钟命令
865 2 KaiJiShZhFlag=0;
866 2 }
867 1 switch( typeCom )
868 1 {
869 2 case ResetCom: //系统复位命令
870 2 typeCom = ResetAns;
871 2 TemLen = 32;
872 2 ResetAnsFlag = 1; //复位标志位置一
873 2 break;
874 2 case ClockCom: //时钟校正命令
875 2 typeCom = ClockAns;
876 2 TemLen = 32;
877 2 for(i = 0;i < 12;) //更新时钟
878 2 {
879 3 RTclock[i/2]=16 * toint(ReceSbuf2[15+i]) + toint(ReceSbuf2[16+i]);
880 3 i+=2;
881 3 }
882 2 setup_write(); //设置实时时钟操作方式
883 2 clock_write(RTclock); //修改时钟命令
884 2 for(i=0;i<6;i++)
885 2 {
886 3 RTclock[i]=0;
887 3 }
888 2 clock_read(RTclock); //读修改后的时钟
889 2 for(i=0;i<6;i++) //读取修改后的实时时钟
890 2 {
891 3 hex2asc0(ReceSbuf2+15+2*i,RTclock[i]);
892 3 }
893 2 break;
894 2 case BaudCom: //串口设置命令
895 2 typeCom = BaudAns;
896 2 TemLen = 36;
897 2 for( i = 27;i < 31;i++) //保存参数
898 2 {
899 3 SendSbuf2[i] = ReceSbuf2[i];
900 3 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -