myUART.cpp
上传用户:shyuanyi
上传日期:2008-05-24
资源大小:69k
文件大小:26k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include  "My_head.h"
  2. #include  "MyProtocol.h"
  3. #include  "carddef.h"
  4. #include  "DS_addr.h"
  5. /****************************************************/
  6. #define   DE_RE           P3_6
  7. #define   UARTBUF_SIZE    180
  8. //===================================================
  9. BYTE  code   TieUpBus_Ordors[4]={0xAA,0X55,0x55,0xAA};
  10. BYTE  xdata  uartSbuf[UARTBUF_SIZE];
  11. BYTE  pdata  uartRbuf[UARTBUF_SIZE];
  12. static  BYTE  uartRbuf_count = 0;
  13. bit   my_ti = FALSE;
  14. bit   dowith_receive_flag = FALSE;
  15. BYTE  idata  receive_head[4];
  16. BYTE  receive_head_counte =0;
  17. BYTE  receive_timer = 0;
  18. BYTE  enble_send_count = 0;
  19. //===================================================
  20. void  Uart_Int(void) interrupt 4 using 2
  21. {
  22.    bit  no_my_data_flag= FALSE;
  23.    register  BYTE  ch;
  24.    if(RI)
  25.      {
  26.   RI = FALSE;enble_send_count = 2;
  27.   ch = SBUF;
  28.   /**************** test ***********
  29.       if(uartRbuf_count<UARTBUF_SIZE)
  30.     {
  31.      uartRbuf[uartRbuf_count++] = ch;
  32.     }
  33.      if(uartRbuf_count>ORDOR_PLACE)
  34.     {
  35.      dowith_receive_flag = TRUE; //this is a test!
  36. }
  37.   /**********************************/
  38.   if(!receive_timer)
  39.     {
  40.  receive_timer=2;
  41.  receive_head_counte=0;
  42. }
  43.       if(receive_timer<3)
  44.     {
  45.      receive_head[receive_head_counte]=ch;
  46.  if(++receive_head_counte>3)
  47.       {
  48.             if(  (receive_head[0]!=TieUpBus_Ordors[0])
  49.    ||(receive_head[1]!=TieUpBus_Ordors[1])
  50.        ||(receive_head[2]!=TieUpBus_Ordors[2])
  51.    ||(receive_head[3]!=TieUpBus_Ordors[3]))
  52.    {
  53.     receive_timer=0;
  54. //receive_head_counte=0;
  55.    }
  56. else{
  57.      receive_timer=45;
  58.  uartRbuf_count=0;
  59.      //receive_head_counte=0;
  60.  //dowith_receive_flag = TRUE; //for test.
  61.     }
  62.    }
  63.  return;
  64. }
  65.   if((receive_timer<10)||(receive_timer>45))
  66.     {
  67.  receive_timer=0;
  68.  return;
  69. }
  70.   //=================================================================
  71.       if(uartRbuf_count<UARTBUF_SIZE)
  72.     {
  73.      uartRbuf[uartRbuf_count++] = ch;
  74.  ch = uartRbuf_count-1;
  75.     }
  76.   else ch = uartRbuf_count;
  77.   switch(ch)
  78.   {
  79.    case  ASP_PLACE:
  80.      if(uartRbuf[ch] != DOWN_ASP)
  81.   {
  82. no_my_data_flag = TRUE;
  83.   }
  84.  break;
  85.     case TYPE_PLACE:
  86.  if(uartRbuf[ch] != equip_addr.ntype)
  87.   {
  88. no_my_data_flag = TRUE;
  89.   }
  90.     //dowith_receive_flag = TRUE; //this is a test!
  91.  break;
  92. case NUMBER_PLACE1:
  93.          if(uartRbuf[ch] != ((BYTE *)(&equip_addr.number_addr))[0])
  94.   {
  95. no_my_data_flag = TRUE;
  96.   }
  97.   break;
  98.  case NUMBER_PLACE2:
  99.   if(uartRbuf[ch] != ((BYTE *)(&equip_addr.number_addr))[1])
  100.   {
  101. no_my_data_flag = TRUE;
  102.   }
  103.   break;
  104.          case DATLENGTH_PLACE:
  105.   if((uartRbuf[ch]<FRAMELENGTH_MIN)||(uartRbuf[ch]>FRAMELENGTH_MAX))
  106.   {
  107. no_my_data_flag = TRUE;
  108.   }
  109.   break;
  110.  default:
  111.   if((ch>ORDOR_PLACE) && (ch>=uartRbuf[DATLENGTH_PLACE]))
  112.     {
  113.  REN = FALSE;  //for run-time!
  114.          dowith_receive_flag = TRUE;
  115.   }
  116.   break;
  117.    }
  118.       if(no_my_data_flag)
  119.    {
  120.  REN=FALSE;  //for run-time!
  121.          receive_timer=1;
  122.  receive_head_counte=0; //MUST!!
  123.  //uartRbuf_count=0;
  124.    }
  125.   /********************************/
  126.      }
  127.    if(TI){my_ti=TI=FALSE;}
  128. }
  129. /*************************************************************/
  130. /*       uart_send                                           */
  131. /*************************************************************/
  132. void  Uart_Putc(BYTE  ch)
  133. {
  134.    while(my_ti);
  135.    SBUF = ch;
  136.    my_ti= TRUE;
  137. }
  138. bit  SendStr(BYTE *ptr,int  count)  //"BYTE"  modiry to "int" by 2004-6-18
  139. {                                   //"void"  modify "bit"  by  2004-07-08
  140.   int  i;
  141.   //if(count>512)return;
  142.   Set_Timer20ms(5);
  143.   while(enble_send_count)if(!Get_Timer20ms())return(FALSE);
  144.   REN   = FALSE;
  145.   DE_RE = 0;
  146.   TB8   = 1;
  147.   for(i=0;i<count;i++)
  148.     {
  149.  //Save_My_TestData(ptr[i]);
  150.  Uart_Putc(ptr[i]);
  151. }
  152.   delay_ms(2);//must for RS485!
  153.   DE_RE = 1;
  154.   REN   = TRUE;
  155.   return(TRUE);
  156. }
  157. /*************************************************************/
  158. void  UartBuf_Clear(void)
  159. {
  160.    BYTE   i=0;
  161.    for(;i<UARTBUF_SIZE;i++)uartRbuf[i]=0;
  162.    uartRbuf_count=0;
  163.    dowith_receive_flag = FALSE;
  164.    my_ti = FALSE;
  165. }
  166. void  Uart_Init(void)
  167. {
  168.    TR1   = 0;
  169.    IP   |= 0X10;   // ES优先级1
  170.    //SCON  = 0x50;   // 8位UART,波特率可变 REN=1
  171.    SCON  = 0xF0,TB8=1;   // 9位UART,波特率可变 REN=1,摸停止位。
  172.    TMOD &= 0x0f;   // 方式寄存器
  173.    TMOD |= 0x20;   // T1设为自动再装入8位计数器,或者分成2个8位计数器
  174.    ES    = 1;      //(ES为串行口中断允许位)
  175.    TH1=TL1=0xFA;   // 0xfA--9600bps(22.1184Mhz)
  176.    PCON |= 0x80;   // PCON.7为波特率加倍,PCON的其他位为掉电控制位
  177.                    // 2004-7-21改为波特率19200
  178.    TR1 = 1;        // TCON |= 0x40;
  179. #if(MCU_IC==SST564)  //EXTRAM = AUXR^2;
  180.    AUXR  &= ~0x02;   //0: Internal Expanded RAM access.
  181. #elif(MCU_IC==SM5964)//OME = SCONF^2;
  182.    SCONF |= 0x02;    //1: default is enable.
  183. #endif
  184.    DE_RE = 1;
  185.    UartBuf_Clear();
  186.    //delay_ms(1);
  187. }
  188. /*---------------------------------------------------*/
  189. bit   close_dis_led = FALSE;
  190. bit   Check_Uart_Event(void)
  191. {
  192.  if(dowith_receive_flag)
  193.    {
  194.     PostMessage(MY_UART_EVENT,0);
  195.         dowith_receive_flag = FALSE;
  196. return(TRUE);
  197.    }
  198.  if(receive_timer && !close_dis_led)
  199.    {
  200.  Dis_Comming_Led(TRUE);//0-close;1--open.
  201.  close_dis_led = TRUE; //for time and spi bus.
  202.    }
  203.  else if(close_dis_led)
  204.    {
  205.      Dis_Comming_Led(FALSE);//0-close;1--open.
  206.      close_dis_led = FALSE; //for time and spi bus.
  207.    }
  208.  return(FALSE);
  209. }
  210. bit  Check_BCCsum(BYTE *buf)
  211. {
  212.   BYTE len,BCC_sum;//ii;
  213.   for(BCC_sum=0,len=0;len<buf[DATLENGTH_PLACE];len++)
  214.    {
  215.      BCC_sum ^= buf[len];
  216.    }
  217.   if(~BCC_sum != buf[len])return(FALSE); //CRCERR;
  218.   return(TRUE);
  219. }
  220. void  Set_BCCsum(BYTE *buf,BYTE nCount)
  221. {
  222.     BYTE   ii;
  223.     for(buf[nCount]=0,ii=0;ii<nCount;ii++)
  224. {
  225.   buf[nCount]^=buf[ii];
  226. }
  227. buf[nCount]=~buf[nCount];
  228. }
  229. BYTE  Do_Uart_Event(BYTE dat)  //这样可以把uartSbuf节约出来?
  230. {
  231.    BYTE  len;//,BCC_sum;//ii;
  232.    //while(enble_send_count);
  233.    //SendStr(receive_head,4);
  234.    //SendStr(uartRbuf,uartRbuf_count); //for test.
  235.    //SendStr(&equip_addr.ntype,1);
  236.    //SendStr((BYTE *)(&equip_addr.number_addr),2);
  237.    //for(len=0;len<uartRbuf_count;len++)uartSbuf[len]=uartRbuf[len];
  238.    memcpy(uartSbuf,uartRbuf,uartRbuf_count);
  239.    len=uartRbuf_count,uartRbuf_count = 0;
  240.    receive_timer  = 45; //for continue!
  241.    REN = TRUE;
  242.    if(uartSbuf[FRAMECODE_PLACE]&THELAST_FRAME)
  243.    {
  244.      receive_timer = 0; //for renew  the head str!
  245.    }
  246.    /***********this is a test!!************************
  247.    Set_BCCsum(uartSbuf,uartSbuf[DATLENGTH_PLACE]);
  248.    SendStr(uartSbuf,len);//REN = TRUE;
  249.    /***************************************************/
  250.    if(!Check_BCCsum(uartSbuf))return(FALSE);//CRCERR;
  251.    //SendStr("OK",2);
  252.    switch(uartSbuf[ORDOR_PLACE])
  253.    {
  254. case CHECKEQUIP_ORDOR://         0x50
  255.          Do_CheckEquip();
  256.  break;
  257. case SetNumber_ORDOR://          0x52
  258.      Do_SetNumber();
  259.      break;
  260. case SetConParam_ORDOR://        0X53
  261.      Do_SetConParam();
  262.  break;
  263. case GetConParam_ORDOR://        0x55
  264.      Do_GetConParam();
  265.  break;
  266. case ClearConParam_ORDOR://      0x57
  267.      Do_ClearConParam();
  268.      break;
  269. case SetBh_Money_ORDOR://        0x58
  270.          Do_SetBh_Money();
  271.  break;
  272. case GetBh_Money_ORDOR://        0x59
  273.          Do_GetBh_Money();
  274.  break;
  275. case SendDcpeoples_ORDOR://      0x5A
  276.      Do_SendDcpeoples();
  277.      break;
  278. case SetCardClass_Para_ORDOR://  0x5C
  279.          Do_SetCardClass_Para();
  280.  break;
  281. case GetCardClass_Para_ORDOR://  0x5D
  282.      Do_GetCardClass_Para();
  283.      break;
  284. case SetSystemTime_ORDOR://      0x60
  285.      Do_SetSystemTime();
  286.  break;
  287.     case GetSystemTime_ORDOR://      0x61
  288.      Do_GetSystemTime();
  289.  break;
  290. case SendCardStatus_ORDOR://     0x62 
  291.      //Do_SendCardStatus();
  292.  break;
  293. case SetLostCardTime_ORDOR://    0x63
  294.      //Do_SetLostCardTime();
  295.  break;
  296. case GetLossCardsTime_ORDOR://   0x64
  297.      //Do_GetLossCardsTime();
  298.  break;
  299. case GetCardStatus_ORDOR://      0x65
  300.      //Do_GetCardStatus();
  301.          break;
  302. case ReadConData_ORDOR://        0x70
  303.          Do_ReadConData();
  304.  break;
  305. case SetConRecode_ORDOR://       0x71
  306.      Do_SetConRecode();
  307.  break;
  308. case SendCardGain_ORDOR://       0x72
  309.      //Do_SendCardGain();
  310.  break;
  311. case GetCardGain_ORDOR://        0x73
  312.          //Do_GetCardGain();
  313.      break;
  314. case GetConStatusInfo_ORDOR://     0x75
  315.          Do_GetConStatusInfo();
  316.  break;
  317. case GetEquipVersionInfo_ORDOR://  0x76
  318.          Do_GetEquipVersionInfo();
  319.  break;
  320. /**************************************/
  321. case GetCardLevel_ORDOR://         0x80
  322.      //Do_GetCardLevel();
  323.  break;
  324. case SetSeedCard_ORDOR://          0x81
  325.      //Do_SetSeedCard();
  326.      break;
  327. case GetUserCardInfo_ORDOR://      0x82
  328.      //Do_GetUserCardInfo();
  329.  break;
  330. case SetUserCardInfo_ORDOR://      0x83
  331.          //Do_SetUserCardInfo();
  332.  break;
  333. /**************************************/
  334. case SetOpUserInfo_ORDOR://        0x90
  335.      Do_SetOpUserInfo();
  336.  break;
  337. case GetCurOpUserInfo://           0x91
  338.      Do_GetCurOpUserInfo();
  339.  break;
  340. case GetOpUserInfo://              0x92
  341.      //Do_GetOpUserInfo();
  342.  break;
  343. default:break;
  344.    }
  345.    dat=dat;
  346.    return(TRUE); //len
  347. }
  348. void   Do_CheckEquip(void)
  349. {
  350.     BYTE  nCount            = ASP_PLACE;
  351.     uartSbuf[ASP_PLACE]     = UP_ASP;
  352. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  353. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  354. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  355. //uartSbuf[DATLENGTH_PLACE]=
  356. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  357. uartSbuf[ORDOR_PLACE]    = EQUIPANSWER_ORDOR;//0x51,所有重要数据都对方需要回答
  358.     nCount   = DATAST_PLACE;
  359. uartSbuf[nCount++] = Equip_CurStatus; //最近运行情况。
  360. uartSbuf[DATLENGTH_PLACE] = nCount;
  361.     Set_BCCsum(uartSbuf,nCount);
  362.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  363. }
  364. void  Do_SetConParam(void)
  365. {
  366.     BYTE  nCount = ASP_PLACE;
  367.     BYTE  dat = SUCCESS;
  368. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE<sizeof(Con_param_Info))
  369. {
  370.   dat = FORMAT_ERR;
  371. }
  372.     else
  373.     {
  374.   memcpy(&con_param_Info,&uartSbuf[DATAST_PLACE],sizeof(Con_param_Info));
  375.       dat=Saveparam_To_Mem();
  376. }
  377.     uartSbuf[ASP_PLACE]     = UP_ASP;
  378. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  379. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  380. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  381. //uartSbuf[DATLENGTH_PLACE]=
  382. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  383. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  384.     nCount   = DATAST_PLACE;
  385. uartSbuf[nCount++] = dat;
  386. uartSbuf[DATLENGTH_PLACE] = nCount;
  387.     Set_BCCsum(uartSbuf,nCount);
  388.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  389. if(dat==SUCCESS)
  390. {
  391.    //Dis_ConMode();
  392.    do_buzzer(BUZZER_WAIT);
  393. }
  394. }
  395. void  Do_ClearConParam(void)
  396. {
  397.     BYTE  nCount,dat = SUCCESS;
  398. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE != 0)
  399. {
  400.   dat = FORMAT_ERR;
  401. }
  402.     else
  403.     {
  404.       dat=ClearConParam_From_Mem(); //恢复到初始出厂状态。
  405. }
  406.     uartSbuf[ASP_PLACE]     = UP_ASP;
  407. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  408. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  409. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  410. //uartSbuf[DATLENGTH_PLACE]=
  411. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  412. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  413.     nCount   = DATAST_PLACE;
  414. uartSbuf[nCount++] = dat;
  415. uartSbuf[DATLENGTH_PLACE] = nCount;
  416.     Set_BCCsum(uartSbuf,nCount);
  417.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  418. if(dat==SUCCESS)
  419. {
  420.    //Dis_ConMode();
  421.    do_buzzer(BUZZER_WAIT);
  422. }
  423. }
  424. void  Do_GetConParam(void)
  425. {
  426.     BYTE  nCount = ASP_PLACE;
  427.     uartSbuf[ASP_PLACE]     = UP_ASP;
  428. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  429. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  430. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  431. //uartSbuf[DATLENGTH_PLACE]=
  432. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  433. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  434.     nCount   = DATAST_PLACE;
  435.     //dat=restoreparam_from_Mem();
  436.     memcpy(&uartSbuf[DATAST_PLACE],&con_param_Info,sizeof(Con_param_Info));
  437.     nCount+=sizeof(Con_param_Info);
  438. uartSbuf[DATLENGTH_PLACE] = nCount;
  439.     Set_BCCsum(uartSbuf,nCount);
  440.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  441. }
  442. void  Do_SetSystemTime(void)
  443. {
  444.     BYTE  buf[7];// = {0x00,0x45,0x23,0x16,0x06,0x03,0x04};
  445.     BYTE  nCount;
  446.     BYTE  dat = SUCCESS;
  447. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE != 6)
  448. {
  449.   dat = FORMAT_ERR;
  450. }
  451.     else
  452.     {
  453.      nCount=DATAST_PLACE;
  454.       buf[YEAR_ADDR]=uartSbuf[nCount++];
  455.   buf[MOM_ADDR] =uartSbuf[nCount++];
  456.   buf[DATE_ADDR]=uartSbuf[nCount++];
  457.   buf[HOUR_ADDR]=uartSbuf[nCount++];
  458.   buf[MIN_ADDR] =uartSbuf[nCount++];
  459.   buf[SEC_ADDR] =uartSbuf[nCount++];
  460.      Do_WriteClock(buf);
  461. }
  462.     uartSbuf[ASP_PLACE]     = UP_ASP;
  463. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  464. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  465. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  466. //uartSbuf[DATLENGTH_PLACE]=
  467. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  468. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  469.     nCount   = DATAST_PLACE;
  470. uartSbuf[nCount++] = dat;
  471. uartSbuf[DATLENGTH_PLACE] = nCount;
  472.     Set_BCCsum(uartSbuf,nCount);
  473.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  474. if(dat==SUCCESS)
  475. {
  476.    do_buzzer(BUZZER_WAIT);
  477. }
  478. }
  479. void  Do_GetSystemTime(void)
  480. {
  481.     BYTE  buf[7];// = {0x00,0x45,0x23,0x16,0x06,0x03,0x04};
  482.     BYTE  nCount = ASP_PLACE;
  483.     uartSbuf[ASP_PLACE]     = UP_ASP;
  484. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  485. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  486. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  487. //uartSbuf[DATLENGTH_PLACE]=
  488. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  489. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  490.     Do_ReadClock(buf);
  491.     nCount   = DATAST_PLACE;
  492.     uartSbuf[nCount++]=buf[YEAR_ADDR];
  493.     uartSbuf[nCount++]=buf[MOM_ADDR];
  494.     uartSbuf[nCount++]=buf[DATE_ADDR];
  495.     uartSbuf[nCount++]=buf[HOUR_ADDR];
  496.     uartSbuf[nCount++]=buf[MIN_ADDR];
  497.     uartSbuf[nCount++]=buf[SEC_ADDR];
  498. uartSbuf[DATLENGTH_PLACE] = nCount;
  499.     Set_BCCsum(uartSbuf,nCount);
  500.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  501. }
  502. void  Do_ReadConData(void)
  503. {
  504.     Con_Record pdata con_record;
  505.     BYTE  ii,dat,nCount = ASP_PLACE;
  506.     //SendStr(uartSbuf,10);//for test.
  507. if((uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE) != 1)return; //err.
  508. if((dat=uartSbuf[DATAST_PLACE])==0)return;
  509.     uartSbuf[ASP_PLACE]     = UP_ASP;
  510. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  511. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  512. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  513. //uartSbuf[DATLENGTH_PLACE]=
  514. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  515. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  516.     nCount   = DATAST_PLACE;
  517.     while(dat--)
  518. {
  519.  if((ii=Read_ConData_From_Memory(&con_record))==SUCCESS)
  520.  {
  521.        memcpy(&uartSbuf[nCount],&con_record,sizeof(Con_Record));
  522.        nCount += sizeof(Con_Record);
  523.        if((con_record.mark==CONSUME_FLAG)&&(con_statusinfo.con_records>0))
  524.    {
  525.     con_statusinfo.con_records--;
  526.     con_statusinfo.con_allmoney-=con_record.con_Money;
  527.    }
  528.  }
  529.  else if(ii==NO_CON_RECORD)
  530.  {
  531.         uartSbuf[FRAMECODE_PLACE] |= THELAST_FRAME;
  532. receive_timer = 0; //must!
  533.     break;
  534.  }
  535.  else
  536.  {
  537.     Equip_CurStatus=ii;
  538.     Do_CheckEquip();
  539.     do_buzzer(BUZZER_ALARM);//Dis_Err(ii);
  540. return;
  541.  }
  542. }
  543. uartSbuf[DATLENGTH_PLACE] = nCount;
  544.     Set_BCCsum(uartSbuf,nCount);
  545.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  546. }
  547. void  Do_SetConRecode(void)
  548. {
  549. }
  550. void  Do_SetCardClass_Para(void)
  551. {
  552.     Card_Class_Para  pdata  card_class;
  553.     BYTE  nCount = ASP_PLACE;
  554.     BYTE  dat = SUCCESS;
  555. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE<sizeof(Card_Class_Para))
  556. {
  557.   dat = FORMAT_ERR;
  558. }
  559.     else
  560.     {
  561.   memcpy(&card_class,&uartSbuf[DATAST_PLACE],sizeof(Card_Class_Para));
  562.       dat=SaveCardClass_To_Mem(&card_class);
  563. }
  564.     uartSbuf[ASP_PLACE]     = UP_ASP;
  565. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  566. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  567. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  568. //uartSbuf[DATLENGTH_PLACE]=
  569. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  570. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  571.     nCount   = DATAST_PLACE;
  572. uartSbuf[nCount++] = dat;
  573. uartSbuf[DATLENGTH_PLACE] = nCount;
  574.     Set_BCCsum(uartSbuf,nCount);
  575.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  576. if(dat==SUCCESS)
  577. {
  578.    do_buzzer(BUZZER_WAIT);
  579. }
  580. }
  581. void  Do_GetCardClass_Para(void)
  582. {
  583.     Card_Class_Para  pdata  card_class;
  584.     BYTE  nCount = ASP_PLACE,dat;
  585. if((uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE) != 1)return; //err.
  586. if((dat=uartSbuf[DATAST_PLACE])<1 || dat>8)return;
  587.     uartSbuf[ASP_PLACE]     = UP_ASP;
  588. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  589. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  590. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  591. //uartSbuf[DATLENGTH_PLACE]=
  592. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  593. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  594.     nCount   = DATAST_PLACE;
  595. card_class.card_class=dat; //must.
  596.     if((dat=ReadCardClass_from_Mem(&card_class))!=SUCCESS)
  597. {
  598.    Equip_CurStatus=dat;
  599.    Do_CheckEquip();
  600.    do_buzzer(BUZZER_ALARM);//Dis_Err(ii);
  601.    return;
  602. }
  603.     memcpy(&uartSbuf[DATAST_PLACE],&card_class,sizeof(Card_Class_Para));
  604.     nCount += sizeof(Card_Class_Para);
  605. uartSbuf[DATLENGTH_PLACE] = nCount;
  606.     Set_BCCsum(uartSbuf,nCount);
  607.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  608. }
  609. void  Do_SetBh_Money(void)
  610. {
  611.     BYTE  nCount,dat=uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE;
  612. if((dat<sizeof(Bh_Money))||(dat>DATLENGTH_MAX))
  613. {
  614.   dat=FORMAT_ERR;
  615.     }
  616.     else
  617. {
  618.      if(uartSbuf[FRAMECODE_PLACE]&FRAMES_MAX == 0)
  619.   {//这就决定了编号只能一次下载下去!否则只保留最后一次的。
  620.        if((dat=DelAllBh_Money())!=SUCCESS)goto SKIP;
  621.   }
  622.       dat = uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE;
  623.      dat = SaveBh_Money_To_Mem(&uartSbuf[DATAST_PLACE],dat);
  624. }
  625. SKIP:
  626.     uartSbuf[ASP_PLACE]     = UP_ASP;
  627. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  628. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  629. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  630. //uartSbuf[DATLENGTH_PLACE]=
  631. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  632. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  633.     nCount   = DATAST_PLACE;
  634. uartSbuf[nCount++] = dat;
  635. uartSbuf[DATLENGTH_PLACE] = nCount;
  636.     Set_BCCsum(uartSbuf,nCount);
  637.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  638. }
  639. #define  FRAME_BHSTRUCT_S  (DATLENGTH_MAX/sizeof(Bh_Money))
  640. void   Do_GetBh_Money(void)
  641. {
  642.     Bh_Money  pdata  bh_money;
  643.     BYTE ii,dat,nCount,frame=uartSbuf[FRAMECODE_PLACE]&FRAMES_MAX;
  644.     //SendStr(uartSbuf,10);//for test.
  645. if((uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE) != 1)return; //err.
  646. if(((dat=uartSbuf[DATAST_PLACE])<1)||(dat>FRAME_BHSTRUCT_S))return;
  647.     uartSbuf[ASP_PLACE]     = UP_ASP;
  648. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  649. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  650. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  651. //uartSbuf[DATLENGTH_PLACE]=
  652. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  653. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  654.     nCount   = DATAST_PLACE;
  655.     for(ii=frame*FRAME_BHSTRUCT_S,frame=ii+dat;ii<frame;ii++)
  656. {
  657.  if((dat=ReadBh_Money_From_Memory(&bh_money,ii))==SUCCESS)
  658.  {
  659.    if(bh_money.Bh_code==0xffff)
  660.      {
  661.   bh_money.Bh_code=ii,bh_money.money=0;
  662.  }
  663.        memcpy(&uartSbuf[nCount],&bh_money,sizeof(Bh_Money));
  664.        nCount += sizeof(Bh_Money);
  665.  }
  666.  else if(dat==KEY_VALERR_CODE)
  667.  {
  668.        uartSbuf[FRAMECODE_PLACE] |= THELAST_FRAME;
  669.    receive_timer = 0; //must!
  670.    break;
  671.  }
  672.  else
  673.  {
  674.     Equip_CurStatus=dat;
  675.     Do_CheckEquip();
  676.     do_buzzer(BUZZER_ALARM);//Dis_Err(ii);
  677. return;
  678.  }
  679. }
  680. uartSbuf[DATLENGTH_PLACE] = nCount;
  681.     Set_BCCsum(uartSbuf,nCount);
  682.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  683. }
  684. void  Do_SetNumber(void)
  685. {
  686.     BYTE  nCount = ASP_PLACE;
  687.     BYTE  dat = SUCCESS;
  688. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE<sizeof(Equip_Addr))
  689. {
  690.   dat = FORMAT_ERR;
  691. }
  692. else if((con_statusinfo.con_records>0))
  693. {
  694.   dat= OP_UNALLOWED;//可能还有消费数据
  695. }
  696.     else
  697.     {
  698.   memcpy(&equip_addr,&uartSbuf[DATAST_PLACE],sizeof(Equip_Addr));
  699.       dat=Saveparam_To_Mem();
  700. }
  701.     uartSbuf[ASP_PLACE]     = UP_ASP;
  702. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  703. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  704. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  705. //uartSbuf[DATLENGTH_PLACE]=
  706. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  707. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  708.     nCount   = DATAST_PLACE;
  709. uartSbuf[nCount++] = dat;
  710. uartSbuf[DATLENGTH_PLACE] = nCount;
  711.     Set_BCCsum(uartSbuf,nCount);
  712.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  713. if(dat==SUCCESS)
  714. {
  715.    do_buzzer(BUZZER_WAIT);
  716. }
  717. }
  718. void  Do_SendDcpeoples(void)
  719. {
  720.     BYTE  nCount,dat = SUCCESS;
  721. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE<sizeof(Dc_Peoples))
  722. {
  723.   dat = FORMAT_ERR;
  724. }
  725.     else
  726.     {
  727.   memcpy(&dc_peoples,&uartSbuf[DATAST_PLACE],sizeof(Dc_Peoples));
  728. }
  729.     uartSbuf[ASP_PLACE]     = UP_ASP;
  730. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  731. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  732. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  733. //uartSbuf[DATLENGTH_PLACE]=
  734. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  735. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  736.     nCount   = DATAST_PLACE;
  737. uartSbuf[nCount++] = dat;
  738. uartSbuf[DATLENGTH_PLACE] = nCount;
  739.     Set_BCCsum(uartSbuf,nCount);
  740.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  741. if(dat==SUCCESS)
  742. {
  743.    do_buzzer(BUZZER_WAIT);
  744. }
  745. }
  746. void  Do_GetConStatusInfo(void)
  747. {
  748.     BYTE  nCount = ASP_PLACE;
  749.     uartSbuf[ASP_PLACE]     = UP_ASP;
  750. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  751. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  752. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  753. //uartSbuf[DATLENGTH_PLACE]=
  754. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  755. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  756.     nCount   = DATAST_PLACE;
  757.     //dat=restoreparam_from_Mem();
  758.     memcpy(&uartSbuf[nCount],&con_statusinfo,sizeof(Con_StatusInfo));
  759.     nCount += sizeof(Con_StatusInfo);
  760. uartSbuf[DATLENGTH_PLACE] = nCount;
  761.     Set_BCCsum(uartSbuf,nCount);
  762.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  763. }
  764. extern const  BYTE  code  YsnOysFlag_Str[];
  765. extern const  BYTE  code  MyReVision_Str[];
  766. extern const  BYTE  code  Con_Types_Str[];
  767. void  Do_GetEquipVersionInfo(void)
  768. {
  769.     BYTE  nCount = ASP_PLACE;
  770.     uartSbuf[ASP_PLACE]     = UP_ASP;
  771. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  772. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  773. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  774. //uartSbuf[DATLENGTH_PLACE]=
  775. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  776. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  777.     nCount   = DATAST_PLACE;
  778.     memcpy(&uartSbuf[nCount],Con_Types_Str,strlen(Con_Types_Str));
  779.     nCount+=strlen(Con_Types_Str);
  780.     memcpy(&uartSbuf[nCount],",",1);
  781.     nCount+=1;
  782.     memcpy(&uartSbuf[nCount],MyReVision_Str,strlen(MyReVision_Str));
  783.     nCount+=strlen(MyReVision_Str);
  784.     memcpy(&uartSbuf[nCount],&YsnOysFlag_Str[3],strlen(YsnOysFlag_Str)-2);
  785.     nCount+=strlen(YsnOysFlag_Str)-2;
  786. uartSbuf[DATLENGTH_PLACE] = nCount;
  787.     Set_BCCsum(uartSbuf,nCount);
  788.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  789. }
  790. void  Do_SetOpUserInfo(void)
  791. {
  792.     BYTE  nCount,dat = SUCCESS;
  793. if(uartSbuf[DATLENGTH_PLACE]-DATAST_PLACE<sizeof(Op_User_Info))
  794. {
  795.   dat = FORMAT_ERR;
  796. }
  797.     else
  798.     {
  799.   memcpy(&op_user_info,&uartSbuf[DATAST_PLACE],sizeof(Op_User_Info));
  800.   dat=Saveparam_To_Mem();
  801. }
  802.     uartSbuf[ASP_PLACE]     = UP_ASP;
  803. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  804. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  805. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  806. //uartSbuf[DATLENGTH_PLACE]=
  807. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  808. uartSbuf[ORDOR_PLACE]    = AckSetGet_ORDOR;
  809.     nCount   = DATAST_PLACE;
  810. uartSbuf[nCount++] = dat;
  811. uartSbuf[DATLENGTH_PLACE] = nCount;
  812.     Set_BCCsum(uartSbuf,nCount);
  813.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  814. if(dat==SUCCESS)
  815. {
  816.    do_buzzer(BUZZER_WAIT);
  817. }
  818. }
  819. void  Do_GetCurOpUserInfo(void)
  820. {
  821.     BYTE  nCount = ASP_PLACE;
  822.     uartSbuf[ASP_PLACE]     = UP_ASP;
  823. uartSbuf[TYPE_PLACE]    = equip_addr.ntype;
  824. uartSbuf[NUMBER_PLACE1] = ((BYTE*)&(equip_addr.number_addr))[0];
  825. uartSbuf[NUMBER_PLACE2] = ((BYTE*)&(equip_addr.number_addr))[1];
  826. //uartSbuf[DATLENGTH_PLACE]=
  827. //uartSbuf[FRAMECODE_PLACE]= THELAST_FRAME;//保持原来下传的不变。
  828. uartSbuf[ORDOR_PLACE]   = AckSetGet_ORDOR;
  829.     nCount   = DATAST_PLACE;
  830.     //dat=restoreparam_from_Mem();
  831.     memcpy(&uartSbuf[nCount],&op_user_info,sizeof(Op_User_Info));
  832.     nCount += sizeof(Op_User_Info);
  833. uartSbuf[DATLENGTH_PLACE] = nCount;
  834.     Set_BCCsum(uartSbuf,nCount);
  835.     if(!SendStr(uartSbuf,nCount+1))Dis_Err(COMMERR);
  836. }