📄 main.lst
字号:
396 功能:ClearComRam
397 描述:清零字节数存储地址
398 参数:address---需要清零的地址
399 返回:无
400 *****************************************************************************************/
401 void ClearComRam(uint address)
402 {
403 1 uchar temp[2];
404 1 temp[0]=0x00;
405 1 temp[1]=0x00;
406 1 ComWriteBytes(address,temp,2);
407 1 }
408
409 /****************************************************************************************
410 功能:SetComDataBytes;设置字节数的函数
411 描述:设置公共RAM的字节长度。是先读出长度,再累加一个需要设置的长度。
412 参数:address---需要设置字节数的地址;len---需要设置的长度。
413 返回:无
414 ****************************************************************************************/
415 void SetComDataBytes(uint address,uchar len)
416 {
417 1 uint num;
418 1 uchar temp[2];
419 1 ComReadBytes(address,temp,2);
420 1 num = temp[0] + temp[1] * 0x100 + len;
421 1 temp[0]=num%256;
422 1 temp[1]=num/256;
423 1 ComWriteBytes(address,temp,2);
424 1 }
425
426 /****************************************************************************************
427 功能:GetComDataBytes;取到字节数的函数
C51 COMPILER V7.50 MAIN 03/17/2008 20:43:15 PAGE 8
428 描述:取得公共RAM里的数据字节数
429 参数:address---存放字节数的地址
430 返回:uint
431 ****************************************************************************************/
432 uint GetComDataBytes(uint address)
433 {
434 1 uint num;
435 1 uchar temp[2];
436 1 ComReadBytes(address,temp,2);
437 1 num = temp[0] + temp[1] * 256;
438 1 return num;
439 1 }
440
441 /****************************************************************************************
442 功能:MainSerialReceive,串口接受,完整的一串命令保存
443 描述:MainSerialReceive主要负责接收服务器用串口发来的命令数据,并且保存在RecvOrderBuff数组
444 中,当达到接收个数时候,设置FlagSaveSerial标志,然后由SaveSerial函数来保存命令,命令
445 主要分为InitState---命令的起始标志状态,CommandState---包标志状态,DataState---数据
446 状态组成;FlagOrderSaved是接收的命令已保存的标志,只有当接收数组的命令已保存才可以再
447 次接收,否则可能冲掉原来的命令。
448 参数:无
449 返回:无
450 ****************************************************************************************/
451 void MainSerialReceive(void) interrupt 4 using 0
452 {
453 1 uchar ch;
454 1 if(RI)
455 1 {
456 2 RI = 0;
457 2 ch=SBUF;
458 2 switch (RecvState)
459 2 {
460 3 case InitState:
461 3 if (ch == StartFlag && FlagOrderSaved) // 开始字节
462 3 { RecvCount = 0;
463 4 RecvState=CommandState; // 下一个状态
464 4 RecvOrderBuff[RecvCount++]=ch;
465 4 }
466 3 break;
467 3
468 3 case CommandState:
469 3 if (!valid_cmd[ch])// 无效命令字节
470 3 {
471 4 RecvState=InitState;
472 4 }
473 3 else
474 3 {
475 4 RecvState=DataState;
476 4 RecvOrderBuff[RecvCount++]=ch; // 保存命令
477 4
478 4 switch(ch)
479 4 {
480 5 case CmdWs :
481 5 RecvSize=LenCmdWs;
482 5 break;
483 5 case CmdSlave:
484 5 RecvSize=LenCmdSlave;
485 5 break;
486 5 case CmdTime:
487 5 RecvSize=LenCmdTime ;
488 5 break;
489 5 case CmdAlarm :
C51 COMPILER V7.50 MAIN 03/17/2008 20:43:15 PAGE 9
490 5 RecvSize=LenCmdAlarm;
491 5 break;
492 5 case CmdChannelPara:
493 5 RecvSize=LenCmdChannelPara;
494 5 break;
495 5 case CmdGetChannelPara:
496 5 RecvSize=LenCmdGetChannelPara;
497 5 break;
498 5 case CmdSlaveEnable:
499 5 RecvSize=LenCmdSlaveEnable;
500 5 break;
501 5 case CmdWsControl:
502 5 RecvSize=LenCmdWsControl;
503 5 FlagCmdWsControl=1;
504 5 break;
505 5 default:
506 5 break;
507 5 }
508 4 }
509 3 break;
510 3
511 3 case DataState: // 数据包内容
512 3 RecvOrderBuff[RecvCount++]=ch; // 保存数据
513 3
514 3 if ((RecvCount)==RecvSize) //数据接收完毕
515 3 {
516 4 if(!FlagCmdWsControl) //当不是外设控制包的时候
517 4 {
518 5 RecvState=InitState;
519 5 FlagSaveSerial=1;
520 5 FlagOrderSaved = 0;
521 5 }
522 4 else
523 4 {
524 5 FlagCmdWsControl=0;
525 5 RecvSize=LenCmdWsControl+RecvOrderBuff[LenCmdWsControl-1];
526 5 }
527 4 }
528 3 break;
529 3 default:
530 3 RecvState=InitState;
531 3 break;
532 3 }
533 2 }
534 1 }
535
536 /****************************************************************************************
537 功能:SaveSerial,保存串口接收的一帧数据到自己的内存
538 描述:当FlagSaveSerial=1的时候,将MainSerialReceive接收到RecvOrderBuff数组的数据保存到相应
539 的存储空间中去。
540 参数:无
541 返回:无
542 ****************************************************************************************/
543 void SaveSerial()
544 {
545 1 uchar ch;
546 1 uchar i,j,k;
547 1 uint Len;
548 1 uint SaveAddr1;
549 1
550 1 ch=RecvOrderBuff[1];
551 1
C51 COMPILER V7.50 MAIN 03/17/2008 20:43:15 PAGE 10
552 1 switch(ch)
553 1 {
554 2 case CmdTime: //时间命令包,总是保留最新的数据,无需叠加存储
555 2 SaveAddr1=MyTimeStart ;
556 2 MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存
557 2 MyWriteOneByte(MyLenTimer,LenCmdTime); //存字节数
558 2 FlagOrderSaved = 1; //设置命令已保存的标志,可以再接收命令了。
559 2 SendEndSignal(); //回送一个$$命令
560 2 break;
561 2 case CmdSlaveEnable: //从机使能包,总是保留最新的数据,无需叠加存储
562 2 SaveAddr1= MySlaveEnable;
563 2 MyWriteOneByte(MyLenSlaveEnable,LenCmdSlaveEnable);
564 2 MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存
565 2 MyWriteOneByte(MySlaveEnableNewFlag, 0x01); //置位从机使能更新状态表示。
566 2 FlagOrderSaved = 1; //设置命令已保存的标志,可以再接收命令了。
567 2 SendEndSignal(); //回送一个$$命令
568 2 break;
569 2 case CmdGetChannelPara: //获取从机外设基数偏差信息命令
570 2 Len=GetMyDataBytes(MyLenChannelInfo);
571 2 if(Len + RecvSize < MaxGetChannelParaLen)
572 2 {
573 3 SaveAddr1=MyChannelInfoStart + Len;
574 3 MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存
575 3 SetMyDataBytes(MyLenChannelInfo,LenCmdGetChannelPara);
576 3 FlagOrderSaved = 1; //设置命令已保存的标志,可以再接收命令了。
577 3 SendEndSignal(); //回送一个$$命令
578 3 }
579 2 break;
580 2 case CmdAlarm: //报警输出包
581 2 Len=GetMyDataBytes(MyLenOutput);
582 2 if(Len + RecvSize < MaxAlarmLen)
583 2 {
584 3 SaveAddr1=MyOutputStart + Len;
585 3 MyWriteBytes(SaveAddr1,RecvOrderBuff,RecvSize); //写入规定的内存
586 3 SetMyDataBytes(MyLenOutput,LenCmdAlarm);
587 3 FlagOrderSaved = 1; //设置命令已保存的标志,可以再接收命令了。
588 3 SendEndSignal(); //回送一个$$命令
589 3 }
590 2 break;
591 2 case CmdChannelPara: //通道参数包
592 2 i=RecvOrderBuff[2]; //取得从机编号
593 2 j=RecvOrderBuff[3]; //取得外设编号
594 2 k=RecvOrderBuff[4]; //取得通道编号
595 2 SaveAddr1=Slave1Ws1ChannelInfo + (i-1)*0x500 + (j-1)* 0x100+k*9; //通过从机编号,外设编号,通道编
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -