📄 scomservice.lst
字号:
419 4 case _CMD_RD_RECNUM:
420 4 _CallMaster(_CMD_WR_RECNUM);
421 4 break;
422 4 case _CMD_RD_MCUID:
423 4 CallMaster(_CMD_WR_MCUID);
424 4 break;
425 4 case _CMD_RD_PCID: //保留的命令
426 4 CallMaster(_CMD_WR_PCID);
C51 COMPILER V7.20 SCOMSERVICE 11/09/2002 21:11:16 PAGE 8
427 4 break;
428 4 case _CMD_RD_PCUSER: //保留的命令
429 4 CallMaster(_CMD_WR_PCUSER);
430 4 break;
431 4 /*--------以下开始为带参数命令----------*/
432 4 //case _CMD_SITE_INIT:
433 4 //系统状态初始化
434 4 // break;
435 4 case _CMD_WR_PCUSER: //保留的命令
436 4 //MasterUser=UartRecBuf[4];
437 4 //WriteOneChar(_REMOTE_USER,MasterUser);
438 4 break;
439 4 case _CMD_WR_PCID:
440 4 #if ((_DETECT_TASK>0)&&(_E2PROM_TASK>0))
441 4 MasterAddr=UartRecBuf[4];
442 4 WriteOneChar(_REMOTE_ID,MasterAddr);
443 4 #endif
444 4 break;
445 4 case _CMD_WR_MCUID:
446 4 #if ((_DETECT_TASK>0)&&(_E2PROM_TASK>0))
447 4 SlaveAddr=UartRecBuf[4];
448 4 WriteOneChar(_LOCAL_ID,SlaveAddr);
449 4 #endif
450 4 break;
451 4 case _CMD_WR_RECNUM:
452 4 CurRecNum=UartRecBuf[4];
453 4 WriteOneChar(_CUR_REC_ADDR,CurRecNum);
454 4 break;
455 4 case _CMD_WR_DATE:
456 4 #if _CLOCK_TASK>0
457 4 ReadClock(ClkLcmBuf);
458 4 ClkLcmBuf[_ID_YEAR] =UartRecBuf[4];
459 4 ClkLcmBuf[_ID_MONTH]=UartRecBuf[5];
460 4 ClkLcmBuf[_ID_DAY] =UartRecBuf[6];
461 4 ClockInitialize(ClkLcmBuf);
462 4 LcmMode=_DATE_RUN;
463 4 #endif
464 4 break;
465 4 case _CMD_WR_TIME:
466 4 #if _CLOCK_TASK>0
467 4 ReadClock(ClkLcmBuf);
468 4 ClkLcmBuf[_ID_HOUR] =UartRecBuf[4];
469 4 ClkLcmBuf[_ID_MINUTE]=UartRecBuf[5];
470 4 ClkLcmBuf[_ID_SECOND] =UartRecBuf[6];
471 4 ClockInitialize(ClkLcmBuf);
472 4 LcmMode=_TIME_RUN;
473 4 #endif
474 4 break;
475 4 case _CMD_WR_ALARM: //保留的命令
476 4 //;
477 4 break;
478 4 case _CMD_WR_WEEK:
479 4 #if _CLOCK_TASK>0
480 4 ReadClock(ClkLcmBuf);
481 4 ClkLcmBuf[_ID_WEEKLY] =UartRecBuf[4];
482 4 ClockInitialize(ClkLcmBuf);
483 4 LcmMode=_WEEKLY_RUN;
484 4 #endif
485 4 break;
486 4 /*--------------------------------------*/
487 4 default:
488 4 break;
C51 COMPILER V7.20 SCOMSERVICE 11/09/2002 21:11:16 PAGE 9
489 4 }
490 3 //CallMaster(_CMD_ACK);
491 3 }
492 2 else
493 2 {
494 3 cmd=0;
495 3 }
496 2 /*恢复通讯口的初始化状态*/
497 2 RecReady=0;
498 2 DataBlockCount=0;
499 2 RecUpFlg=0;
500 2 UartHead=0xeb;
501 2 //SystemState=_CMD_NORMAL_RUN;
502 2 //#if _SCOM_TEST>0
503 2 // SendByte(cmd);
504 2 //#endif
505 2 OpenScom();
506 2 }
507 1 return cmd;
508 1 }
509
510 //#if _CRC_EN>0
511 #define _GOLD_CRC 0 //1:采用gold的CRC
512 /*#######################################################################################//
513 Function: CRCverify()
514 Description: 计算CRC常数
515 Input: CrcLeng、 :有效数据个数
516 uchar *Ptr:校验数据缓冲
517 Output: Null
518 Return: uint 返回余码
519 Others: CRC16-CCITT 按字节方式计算
520
521 注:
522 1.将一组数据进行CRC16运算后得到的CrcResult放在该序列后组成
523 一个新组;接收方收到该组数据后在进行CRC16运算CrcResult=0表示
524 无错误否则有错误!移位链的长度与CRC常数的长度相同!两次异或值
525 还原;求得的CrcResult高字节在前低字节在后;
526 2.只要移位链最高位出现一个1就要进行一次异或运算而移位链的值
527 又来自序列所以要判断出序列中的1;
528 CRC 根据”权”(即多项表达式)的不同而相应的源代码也有稍有不同,
529 各种常用的权:
530 CRC8=X8+X5+X4+1 //0x0031=1 0011 0001
531 CRC-CCITT=X16+X12+X5+1 //0x1021=1 0001 0000 0010 0001
532 CRC16=X16+X15+X5+1 //0x8021=1 1000 0000 0010 0001
533 CRC12=X12+X11+X3+X2+1 //0x080D=1 1000 0000 1101
534 CRC32=X32+X26+X23+X22+X16+X12 //0x04C11DB7=1 0000 0100 1100
535 +X11+X10+X8+X7+X5+X4+X2+X1+1 //0001 0001 1101 1011 0111
536 r1<-----------r2<---------------------|<------DataIn
537 | |
538 ◎------------------------------------◎
539 #########################################################################################*/
540 uint CRCverify( uchar *Ptr,uint CrcLeng ) //本函数采用的方式速度最慢
541 {
542 1 #if _GOLD_CRC >0 //这种实现方式需要为序列空余出两个字节空间 后填充0
uchar Crc_j; //循环计数用变量
uint Crc_i; //循环计数用变量
uchar r1,r2,r3,r4; //临时本地变量r3,r4;移位链r1,r2
uint CrcResult; //CRC计算结果存放单元
*(Ptr+CrcLeng)=0; //在序列最后添加两个单元为0
*(Ptr+CrcLeng+1)=0; //
r1=*Ptr; //将首两个数据复制到r1、r2
C51 COMPILER V7.20 SCOMSERVICE 11/09/2002 21:11:16 PAGE 10
Ptr++; //CrcResult=(r1<<8)|r2
r2=*Ptr; //先将前两个数据放入移位链中
Ptr++;
for (Crc_i=0;Crc_i<CrcLeng;Crc_i++) //从最高位开始移位
{
r3=*Ptr; //取出序列中的一个数据进行运算
Ptr++;
for (Crc_j=0;Crc_j<8;Crc_j++) //r1(High),r2(Low)作为移位寄存器
{
r4=r1; //保存上一次的r1到r4
/*将16位移位链低字节r2移动一位到高字节r1中*/
r1=(r1<<1); //移掉最高为等待低位移入
if ((r2&0x80)!=0)
r1++;
/*把新数的最高位移入移位链低字节r2中*/
r2=(r2<<1); //移掉最高为等待低位移入
if ((r3&0x80)!=0)
r2++;
r3=(r3<<1);
/*移位操作完成等待判断是否进行异或运算*/
if ((r4&0x80)!=0) //如果上一次移位链最高位是1则异或
{
r1=r1^0x10; //CRCConstant=0x1021
r2=r2^0x21; //将移位链与CRC常数进行异或
}
}
}
CrcResult=r1;
CrcResult<<=8;
CrcResult|=r2;
return (CrcResult);
#else //采用另外一种实现方式:序列不需要进入移位链 先填充0
586 1 uchar i;
587 1 uint CrcResult=0;
588 1 while(CrcLeng--)
589 1 {
590 2 for(i=0x80; i!=0; i>>=1)
591 2 {
592 3 /* 只要移位链中最高位为1则移动一次再异或否则只移动*/
593 3 if((CrcResult&0x8000)!=0)
594 3 {
595 4 CrcResult<<=1;
596 4 CrcResult^=0x1021; //两次异或值还原;
597 4 } //1-1
598 3 else
599 3 CrcResult<<=1; //1-2
600 3 /* 只要序列中出现一个1就要进行一次异或运算
601 3 以下这句程序可以避免方法一中多余的两个字节 */
602 3 if((*Ptr&i)!=0)
603 3 CrcResult^=0x1021; //1-3
604 3 }
605 2 Ptr++;
606 2 }
607 1 return(CrcResult);
608 1 #endif
609 1 }
610
611
612 //#######################################################################################//
C51 COMPILER V7.20 SCOMSERVICE 11/09/2002 21:11:16 PAGE 11
613 //#######################################################################################//
614 #endif //#ifdef _SCOM_TASK
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1218 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 10
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -